@kepler.gl/deckgl-layers 3.3.0-alpha.3 → 3.3.0-alpha.4

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 (34) hide show
  1. package/dist/cluster-layer/cluster-layer.js +2 -3
  2. package/dist/column-layer/enhanced-column-layer.js +30 -5
  3. package/dist/globe/atmosphere-layer.d.ts +26 -0
  4. package/dist/globe/atmosphere-layer.js +184 -0
  5. package/dist/globe/enhanced-multi-icon-layer.d.ts +6 -0
  6. package/dist/globe/enhanced-multi-icon-layer.js +63 -0
  7. package/dist/globe/globe-depth-disk-layer.d.ts +18 -0
  8. package/dist/globe/globe-depth-disk-layer.js +145 -0
  9. package/dist/globe/globe-layers.d.ts +102 -0
  10. package/dist/globe/globe-layers.js +565 -0
  11. package/dist/globe/globe-stars-layer.d.ts +5 -0
  12. package/dist/globe/globe-stars-layer.js +69 -0
  13. package/dist/globe/globe-view.d.ts +23 -0
  14. package/dist/globe/globe-view.js +316 -0
  15. package/dist/globe/index.d.ts +8 -0
  16. package/dist/globe/index.js +122 -0
  17. package/dist/globe/mvt-label-layer.d.ts +7928 -0
  18. package/dist/globe/mvt-label-layer.js +190 -0
  19. package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +53 -49
  20. package/dist/grid-layer/enhanced-cpu-grid-layer.js +28 -2
  21. package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +53 -49
  22. package/dist/hexagon-layer/enhanced-hexagon-layer.js +28 -2
  23. package/dist/index.d.ts +1 -0
  24. package/dist/index.js +14 -3
  25. package/dist/layer-utils/globe-cell-utils.d.ts +30 -0
  26. package/dist/layer-utils/globe-cell-utils.js +173 -0
  27. package/dist/line-layer/line-layer.js +2 -2
  28. package/dist/raster/raster-layer/raster-layer.js +2 -2
  29. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +2 -2
  30. package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
  31. package/dist/svg-icon-layer/scatterplot-icon-layer.js +52 -15
  32. package/dist/wms/wms-layer.d.ts +19 -0
  33. package/dist/wms/wms-layer.js +193 -23
  34. package/package.json +8 -5
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.WGS84ToPseudoMercator = WGS84ToPseudoMercator;
8
8
  exports["default"] = void 0;
9
+ exports.getGlobeVisibleBounds = getGlobeVisibleBounds;
9
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
@@ -24,7 +25,7 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
24
25
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25
26
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
26
27
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
27
- function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } // SPDX-License-Identifier: MIT
28
+ function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
28
29
  // Copyright contributors to the kepler.gl project
29
30
  // TODO: This is a modified copy of WMSLayer from deck.gl. Remove this once we upgrade deck.gl and loaders.gl.
30
31
 
@@ -32,6 +33,13 @@ function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getProto
32
33
 
33
34
  /** Props added by the TileLayer */
34
35
 
36
+ /**
37
+ * How much the user may zoom in (shrinking the visible span) before a view that
38
+ * is still contained in the last requested extent triggers a fresh, higher
39
+ * resolution request. `2` means the cached image may be stretched up to ~2x
40
+ * before refetching; higher values mean fewer requests but blurrier zoom-ins.
41
+ */
42
+ var COVERAGE_REFETCH_ZOOM_FACTOR = 2;
35
43
  var defaultProps = {
36
44
  id: 'imagery-layer',
37
45
  data: '',
@@ -152,7 +160,7 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
152
160
  }, {
153
161
  key: "getFeatureInfoText",
154
162
  value: function () {
155
- var _getFeatureInfoText = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(x, y) {
163
+ var _getFeatureInfoText = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(x, y) {
156
164
  var lastRequestParameters, _this$state$imageSour, _this$state$imageSour2, featureInfo;
157
165
  return _regenerator["default"].wrap(function _callee$(_context) {
158
166
  while (1) switch (_context.prev = _context.next) {
@@ -203,7 +211,7 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
203
211
  }, {
204
212
  key: "_loadMetadata",
205
213
  value: (function () {
206
- var _loadMetadata2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
214
+ var _loadMetadata2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
207
215
  var imageSource, metadata, _this$getCurrentLayer, _this$getCurrentLayer2;
208
216
  return _regenerator["default"].wrap(function _callee2$(_context2) {
209
217
  while (1) switch (_context2.prev = _context2.next) {
@@ -243,7 +251,7 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
243
251
  }, {
244
252
  key: "loadImage",
245
253
  value: (function () {
246
- var _loadImage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(viewport, _reason) {
254
+ var _loadImage = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(viewport, _reason) {
247
255
  var _gl$getContextAttribu2;
248
256
  var _this$props, layers, serviceType, transparent, bounds, width, height, srs, requestParams, _WGS84ToPseudoMercato, _WGS84ToPseudoMercato2, minX, minY, _WGS84ToPseudoMercato3, _WGS84ToPseudoMercato4, maxX, maxY, gl, isExporting, currentZoom, lastZoom, isZoomingIn, requestId, image, _this$getCurrentLayer3, _this$context$onError, _this$context, _this$getCurrentLayer4;
249
257
  return _regenerator["default"].wrap(function _callee3$(_context3) {
@@ -256,7 +264,13 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
256
264
  }
257
265
  return _context3.abrupt("return");
258
266
  case 3:
259
- bounds = viewport.getBounds();
267
+ // In globe mode deck's GlobeViewport.getBounds() only unprojects 4 edge
268
+ // midpoints and takes their min/max. That misses the screen corners, the
269
+ // curved limb, and (most importantly) the case where a pole is in view when
270
+ // looking from a high latitude — where every meridian and part of the far
271
+ // hemisphere become visible. Compute a fuller visible bounding box instead so
272
+ // the requested WMS image covers everything on screen.
273
+ bounds = viewport.resolution ? getGlobeVisibleBounds(viewport) : viewport.getBounds();
260
274
  width = viewport.width, height = viewport.height;
261
275
  srs = this.props.srs;
262
276
  if (srs === 'auto') {
@@ -288,34 +302,40 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
288
302
  }
289
303
  return _context3.abrupt("return");
290
304
  case 11:
305
+ if (!(this.state.lastRequestParameters && this._isViewCoveredByLastRequest(this.state.lastRequestParameters, requestParams))) {
306
+ _context3.next = 13;
307
+ break;
308
+ }
309
+ return _context3.abrupt("return");
310
+ case 13:
291
311
  // During video export, throttle zoom-in requests to only fire on zoom level crossings.
292
312
  // The existing image is stretched by the BitmapLayer until the next level is reached.
293
313
  gl = this.context.gl;
294
314
  isExporting = gl === null || gl === void 0 || (_gl$getContextAttribu2 = gl.getContextAttributes) === null || _gl$getContextAttribu2 === void 0 || (_gl$getContextAttribu2 = _gl$getContextAttribu2.call(gl)) === null || _gl$getContextAttribu2 === void 0 ? void 0 : _gl$getContextAttribu2.preserveDrawingBuffer;
295
315
  if (!(isExporting && this.state._lastRequestZoom >= 0)) {
296
- _context3.next = 19;
316
+ _context3.next = 21;
297
317
  break;
298
318
  }
299
319
  currentZoom = viewport.zoom;
300
320
  lastZoom = this.state._lastRequestZoom;
301
321
  isZoomingIn = currentZoom > lastZoom;
302
322
  if (!(isZoomingIn && Math.floor(currentZoom) === Math.floor(lastZoom))) {
303
- _context3.next = 19;
323
+ _context3.next = 21;
304
324
  break;
305
325
  }
306
326
  return _context3.abrupt("return");
307
- case 19:
327
+ case 21:
308
328
  // Update lastRequestParameters BEFORE making the request to prevent race conditions
309
329
  // where multiple debounced calls see the same old parameters and all proceed
310
330
  this.state.lastRequestParameters = requestParams;
311
331
  this.state._lastRequestZoom = viewport.zoom;
312
332
  requestId = this.getRequestId();
313
- _context3.prev = 22;
333
+ _context3.prev = 24;
314
334
  this.state.loadCounter++;
315
335
  this.props.onImageLoadStart(requestId);
316
- _context3.next = 27;
336
+ _context3.next = 29;
317
337
  return this.state.imageSource.getImage(requestParams);
318
- case 27:
338
+ case 29:
319
339
  image = _context3.sent;
320
340
  // If a request takes a long time, later requests may have already loaded.
321
341
  if (this.state.lastRequestId < requestId) {
@@ -327,22 +347,22 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
327
347
  lastRequestId: requestId
328
348
  });
329
349
  }
330
- _context3.next = 35;
350
+ _context3.next = 37;
331
351
  break;
332
- case 31:
333
- _context3.prev = 31;
334
- _context3.t0 = _context3["catch"](22);
352
+ case 33:
353
+ _context3.prev = 33;
354
+ _context3.t0 = _context3["catch"](24);
335
355
  (_this$context$onError = (_this$context = this.context).onError) === null || _this$context$onError === void 0 || _this$context$onError.call(_this$context, _context3.t0, this);
336
356
  (_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 || _this$getCurrentLayer4.props.onImageLoadError(requestId, _context3.t0);
337
- case 35:
338
- _context3.prev = 35;
357
+ case 37:
358
+ _context3.prev = 37;
339
359
  this.state.loadCounter--;
340
- return _context3.finish(35);
341
- case 38:
360
+ return _context3.finish(37);
361
+ case 40:
342
362
  case "end":
343
363
  return _context3.stop();
344
364
  }
345
- }, _callee3, this, [[22, 31, 35, 38]]);
365
+ }, _callee3, this, [[24, 33, 37, 40]]);
346
366
  }));
347
367
  function loadImage(_x3, _x4) {
348
368
  return _loadImage.apply(this, arguments);
@@ -368,6 +388,42 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
368
388
  }, ms);
369
389
  }
370
390
 
391
+ /**
392
+ * Returns true when the `next` view is fully inside the `prev` (last requested)
393
+ * extent AND not meaningfully higher resolution, so the cached image already
394
+ * covers the screen and no new request is needed.
395
+ */
396
+ }, {
397
+ key: "_isViewCoveredByLastRequest",
398
+ value: function _isViewCoveredByLastRequest(prev, next) {
399
+ // Coverage only makes sense within the same projection / dataset / canvas size.
400
+ if (prev.srs !== next.srs || prev.width !== next.width || prev.height !== next.height || prev.transparent !== next.transparent || !(0, _core._deepEqual)(prev.layers, next.layers)) {
401
+ return false;
402
+ }
403
+ var p = prev.bbox;
404
+ var n = next.bbox;
405
+ if (!p || !n) {
406
+ return false;
407
+ }
408
+
409
+ // Is the new bbox fully contained within the previously requested bbox?
410
+ var contained = n[0] >= p[0] && n[1] >= p[1] && n[2] <= p[2] && n[3] <= p[3];
411
+ if (!contained) {
412
+ return false;
413
+ }
414
+
415
+ // Ground resolution is proportional to bbox span / pixel count. The guard
416
+ // above already ensured prev and next share the same width/height, so equal
417
+ // pixel counts let us compare spans directly. Only skip while the new view
418
+ // isn't much finer than what we already fetched, otherwise the cached image
419
+ // would look stretched/blurry.
420
+ var prevSpanX = p[2] - p[0];
421
+ var nextSpanX = n[2] - n[0];
422
+ var prevSpanY = p[3] - p[1];
423
+ var nextSpanY = n[3] - n[1];
424
+ return nextSpanX >= prevSpanX / COVERAGE_REFETCH_ZOOM_FACTOR && nextSpanY >= prevSpanY / COVERAGE_REFETCH_ZOOM_FACTOR;
425
+ }
426
+
371
427
  /** Compare request parameters to determine if a new request is needed */
372
428
  }, {
373
429
  key: "_areRequestParamsEqual",
@@ -406,10 +462,124 @@ var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
406
462
  return true;
407
463
  }
408
464
  }]);
409
- }(_core.CompositeLayer); // https://epsg.io/3857
410
- // +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
465
+ }(_core.CompositeLayer);
466
+ /**
467
+ * Compute the [minLng, minLat, maxLng, maxLat] bounding box of the part of the
468
+ * globe that is actually visible on screen.
469
+ *
470
+ * Unlike `GlobeViewport.getBounds()` (4 edge midpoints), this samples a grid of
471
+ * screen pixels, unprojects each onto the sphere (deck.gl clamps rays that miss
472
+ * the globe to the silhouette/limb, which is exactly the boundary we want), and
473
+ * takes the extent. It additionally detects when a pole is in view: at a pole all
474
+ * meridians converge, so we widen the box to the full longitude range and extend
475
+ * the latitude up to the pole, which is what makes viewing from near a pole
476
+ * (seeing across to the far hemisphere) work.
477
+ */
411
478
  (0, _defineProperty2["default"])(WMSLayer, "layerName", 'WMSLayer');
412
479
  (0, _defineProperty2["default"])(WMSLayer, "defaultProps", defaultProps);
480
+ function getGlobeVisibleBounds(viewport) {
481
+ var _longitude;
482
+ var width = viewport.width,
483
+ height = viewport.height;
484
+ var centerLng = (_longitude = viewport.longitude) !== null && _longitude !== void 0 ? _longitude : 0;
485
+ var SAMPLES = 8; // 8x8 cells => 9x9 = 81 sample points
486
+ var lats = [];
487
+ // Longitudes tracked as signed offsets from the center longitude, unwrapped to
488
+ // (-180, 180], so an antimeridian-crossing view stays a contiguous range.
489
+ var lngOffsets = [];
490
+ for (var i = 0; i <= SAMPLES; i++) {
491
+ for (var j = 0; j <= SAMPLES; j++) {
492
+ var px = i / SAMPLES * width;
493
+ var py = j / SAMPLES * height;
494
+ var coord = viewport.unproject([px, py]);
495
+ var lng = coord[0];
496
+ var lat = coord[1];
497
+ if (!Number.isFinite(lng) || !Number.isFinite(lat)) {
498
+ continue;
499
+ }
500
+ lats.push(lat);
501
+ // Wrap the offset into (-180, 180].
502
+ var offset = (lng - centerLng + 540) % 360 - 180;
503
+ lngOffsets.push(offset);
504
+ }
505
+ }
506
+
507
+ // Extremely degenerate viewport: fall back to deck's default.
508
+ if (lats.length === 0) {
509
+ return viewport.getBounds();
510
+ }
511
+ var minLat = Math.min.apply(Math, lats);
512
+ var maxLat = Math.max.apply(Math, lats);
513
+ var northPoleVisible = isGlobeSurfacePointVisible(viewport, 90);
514
+ var southPoleVisible = isGlobeSurfacePointVisible(viewport, -90);
515
+ var minLng;
516
+ var maxLng;
517
+ if (northPoleVisible || southPoleVisible) {
518
+ // A pole is on screen: every meridian is visible, so cover all longitudes and
519
+ // extend latitude up to the visible pole.
520
+ minLng = -180;
521
+ maxLng = 180;
522
+ if (northPoleVisible) {
523
+ maxLat = 90;
524
+ }
525
+ if (southPoleVisible) {
526
+ minLat = -90;
527
+ }
528
+ } else {
529
+ minLng = centerLng + Math.min.apply(Math, lngOffsets);
530
+ maxLng = centerLng + Math.max.apply(Math, lngOffsets);
531
+ }
532
+
533
+ // Pad slightly so the discrete sampling doesn't clip the true limb.
534
+ var latPad = Math.min(5, (maxLat - minLat) * 0.05 + 0.5);
535
+ minLat = Math.max(-90, minLat - latPad);
536
+ maxLat = Math.min(90, maxLat + latPad);
537
+ if (maxLng - minLng < 360) {
538
+ var lngPad = Math.min(5, (maxLng - minLng) * 0.05 + 0.5);
539
+ minLng -= lngPad;
540
+ maxLng += lngPad;
541
+ }
542
+
543
+ // A single EPSG:4326 rectangle can't cross the antimeridian, so if the visible
544
+ // span wraps past ±180 (or covers the whole world) request the full longitude
545
+ // range. This over-covers only near the dateline, which is an acceptable
546
+ // trade-off for a valid, gap-free request.
547
+ if (maxLng - minLng >= 360 || minLng < -180 || maxLng > 180) {
548
+ minLng = -180;
549
+ maxLng = 180;
550
+ }
551
+ return [minLng, minLat, maxLng, maxLat];
552
+ }
553
+
554
+ /**
555
+ * Whether a point on the globe surface at the given latitude (longitude is
556
+ * irrelevant at the poles) is both front-facing (not occluded by the globe) and
557
+ * inside the screen. Uses the sphere-horizon test in deck.gl common space:
558
+ * a surface point is front-facing when the angle between its outward normal and
559
+ * the camera direction is within the horizon half-angle, i.e.
560
+ * dot(normalize(pointCommon), normalize(cameraPosition)) >= radius / cameraDist
561
+ */
562
+ function isGlobeSurfacePointVisible(viewport, lat) {
563
+ var width = viewport.width,
564
+ height = viewport.height;
565
+ var point = viewport.projectPosition([0, lat, 0]);
566
+ var camera = viewport.cameraPosition;
567
+ var rPoint = Math.hypot(point[0], point[1], point[2]);
568
+ var rCam = Math.hypot(camera[0], camera[1], camera[2]);
569
+ if (rPoint === 0 || rCam === 0 || rCam <= rPoint) {
570
+ return false;
571
+ }
572
+ var cosSurface = (point[0] * camera[0] + point[1] * camera[1] + point[2] * camera[2]) / (rPoint * rCam);
573
+ var cosHorizon = rPoint / rCam;
574
+ if (cosSurface < cosHorizon) {
575
+ return false;
576
+ }
577
+ var screen = viewport.project([0, lat, 0]);
578
+ return screen[0] >= 0 && screen[0] <= width && screen[1] >= 0 && screen[1] <= height;
579
+ }
580
+
581
+ // https://epsg.io/3857
582
+ // +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
413
583
  var HALF_EARTH_CIRCUMFERENCE = 6378137 * Math.PI;
414
584
 
415
585
  /** Projects EPSG:4326 to EPSG:3857
@@ -421,4 +591,4 @@ function WGS84ToPseudoMercator(coord) {
421
591
  mercator[1] = (mercator[1] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
422
592
  return mercator;
423
593
  }
424
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViTWVyY2F0b3IiLCJyZXF1aXJlIiwiX2NvcmUiLCJfbGF5ZXJzIiwiX3dtcyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsImRlZmF1bHRQcm9wcyIsImlkIiwiZGF0YSIsInNlcnZpY2VUeXBlIiwic3JzIiwibGF5ZXJzIiwidHlwZSIsImNvbXBhcmUiLCJ2YWx1ZSIsIm9uTWV0YWRhdGFMb2FkIiwib25NZXRhZGF0YUxvYWRFcnJvciIsImNvbnNvbGUiLCJlcnJvciIsIm9uSW1hZ2VMb2FkU3RhcnQiLCJvbkltYWdlTG9hZCIsIm9uSW1hZ2VMb2FkRXJyb3IiLCJyZXF1ZXN0SWQiLCJXTVNMYXllciIsImV4cG9ydHMiLCJfQ29tcG9zaXRlTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJzdGF0ZSIsImxvYWRDb3VudGVyIiwic2hvdWxkVXBkYXRlU3RhdGUiLCJpbml0aWFsaXplU3RhdGUiLCJfbmV4dFJlcXVlc3RJZCIsImxhc3RSZXF1ZXN0SWQiLCJfbGFzdFJlcXVlc3Rab29tIiwidXBkYXRlU3RhdGUiLCJfcmVmIiwiX3RoaXMiLCJjaGFuZ2VGbGFncyIsInByb3BzIiwib2xkUHJvcHMiLCJ2aWV3cG9ydCIsImNvbnRleHQiLCJkYXRhQ2hhbmdlZCIsImltYWdlU291cmNlIiwiX2NyZWF0ZUltYWdlU291cmNlIiwiX2xvYWRNZXRhZGF0YSIsImRlYm91bmNlIiwibG9hZEltYWdlIiwiZGVlcEVxdWFsIiwidmlld3BvcnRDaGFuZ2VkIiwiX2dsJGdldENvbnRleHRBdHRyaWJ1IiwiZ2wiLCJpc1ByZXNlcnZpbmdCdWZmZXIiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsImRlYm91bmNlRGVsYXkiLCJ1bmRlZmluZWQiLCJyZW5kZXJMYXllcnMiLCJfdGhpcyRzdGF0ZSIsImJvdW5kcyIsImltYWdlIiwibGFzdFJlcXVlc3RQYXJhbWV0ZXJzIiwiQml0bWFwTGF5ZXIiLCJnZXRTdWJMYXllclByb3BzIiwiX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbSIsIkNPT1JESU5BVEVfU1lTVEVNIiwiTE5HTEFUIiwiQ0FSVEVTSUFOIiwicGlja2FibGUiLCJfZ2V0RmVhdHVyZUluZm9UZXh0IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ4IiwieSIsIl90aGlzJHN0YXRlJGltYWdlU291ciIsIl90aGlzJHN0YXRlJGltYWdlU291cjIiLCJmZWF0dXJlSW5mbyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJnZXRGZWF0dXJlSW5mb1RleHQiLCJxdWVyeV9sYXllcnMiLCJpbmZvX2Zvcm1hdCIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiX3giLCJfeDIiLCJJbWFnZVNvdXJjZSIsIldNU0ltYWdlU291cmNlIiwibG9hZE9wdGlvbnMiLCJFcnJvciIsIl9sb2FkTWV0YWRhdGEyIiwiX2NhbGxlZTIiLCJtZXRhZGF0YSIsIl90aGlzJGdldEN1cnJlbnRMYXllciIsIl90aGlzJGdldEN1cnJlbnRMYXllcjIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJnZXRNZXRhZGF0YSIsImdldEN1cnJlbnRMYXllciIsInQwIiwiZmluaXNoIiwiX2xvYWRJbWFnZSIsIl9jYWxsZWUzIiwiX3JlYXNvbiIsIl9nbCRnZXRDb250ZXh0QXR0cmlidTIiLCJfdGhpcyRwcm9wcyIsInRyYW5zcGFyZW50Iiwid2lkdGgiLCJoZWlnaHQiLCJyZXF1ZXN0UGFyYW1zIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvMiIsIm1pblgiLCJtaW5ZIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvMyIsIl9XR1M4NFRvUHNldWRvTWVyY2F0bzQiLCJtYXhYIiwibWF4WSIsImlzRXhwb3J0aW5nIiwiY3VycmVudFpvb20iLCJsYXN0Wm9vbSIsImlzWm9vbWluZ0luIiwiX3RoaXMkZ2V0Q3VycmVudExheWVyMyIsIl90aGlzJGNvbnRleHQkb25FcnJvciIsIl90aGlzJGNvbnRleHQiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXI0IiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiZ2V0Qm91bmRzIiwicmVzb2x1dGlvbiIsImJib3giLCJib3VuZGluZ0JveCIsIldHUzg0VG9Qc2V1ZG9NZXJjYXRvciIsIl9zbGljZWRUb0FycmF5MiIsIl9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwiLCJ6b29tIiwiTWF0aCIsImZsb29yIiwiZ2V0UmVxdWVzdElkIiwiZ2V0SW1hZ2UiLCJzZXRTdGF0ZSIsIm9uRXJyb3IiLCJfeDMiLCJfeDQiLCJmbiIsIm1zIiwiY2xlYXJUaW1lb3V0IiwiX3RpbWVvdXRJZCIsInNldFRpbWVvdXQiLCJ0b2xlcmFuY2UiLCJwcmV2QmJveCIsIm5leHRCYm94IiwiaSIsImFicyIsIkNvbXBvc2l0ZUxheWVyIiwiSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFIiwiUEkiLCJjb29yZCIsIm1lcmNhdG9yIiwibG5nTGF0VG9Xb3JsZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93bXMvd21zLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7bG5nTGF0VG9Xb3JsZH0gZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJztcblxuaW1wb3J0IHtcbiAgTGF5ZXIsXG4gIENvbXBvc2l0ZUxheWVyLFxuICBDb21wb3NpdGVMYXllclByb3BzLFxuICBVcGRhdGVQYXJhbWV0ZXJzLFxuICBEZWZhdWx0UHJvcHMsXG4gIFZpZXdwb3J0LFxuICBDT09SRElOQVRFX1NZU1RFTSxcbiAgX2RlZXBFcXVhbCBhcyBkZWVwRXF1YWxcbn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge0JpdG1hcExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtJbWFnZVNvdXJjZSwgV01TSW1hZ2VTb3VyY2V9IGZyb20gJ0Bsb2FkZXJzLmdsL3dtcyc7XG5cbmltcG9ydCB0eXBlIHtJbWFnZVNvdXJjZU1ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuaW1wb3J0IHR5cGUge0ltYWdlVHlwZX0gZnJvbSAnQGxvYWRlcnMuZ2wvd21zJztcblxuLy8gVE9ETzogVGhpcyBpcyBhIG1vZGlmaWVkIGNvcHkgb2YgV01TTGF5ZXIgZnJvbSBkZWNrLmdsLiBSZW1vdmUgdGhpcyBvbmNlIHdlIHVwZ3JhZGUgZGVjay5nbCBhbmQgbG9hZGVycy5nbC5cblxuLyoqIEFsbCBwcm9wcyBzdXBwb3J0ZWQgYnkgdGhlIFRpbGVMYXllciAqL1xuZXhwb3J0IHR5cGUgV01TTGF5ZXJQcm9wcyA9IENvbXBvc2l0ZUxheWVyUHJvcHMgJiBfV01TTGF5ZXJQcm9wcztcblxuLyoqIFByb3BzIGFkZGVkIGJ5IHRoZSBUaWxlTGF5ZXIgKi9cbnR5cGUgX1dNU0xheWVyUHJvcHMgPSB7XG4gIGRhdGE6IHN0cmluZyB8IEltYWdlU291cmNlO1xuICBzZXJ2aWNlVHlwZT86IHN0cmluZyB8ICdhdXRvJztcbiAgbGF5ZXJzPzogc3RyaW5nW107XG4gIHNycz86ICdFUFNHOjQzMjYnIHwgJ0VQU0c6Mzg1NycgfCAnYXV0byc7XG4gIHRyYW5zcGFyZW50PzogYm9vbGVhbjtcbiAgb25NZXRhZGF0YUxvYWQ/OiAobWV0YWRhdGE6IEltYWdlU291cmNlTWV0YWRhdGEpID0+IHZvaWQ7XG4gIG9uTWV0YWRhdGFMb2FkRXJyb3I/OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZFN0YXJ0PzogKHJlcXVlc3RJZDogdW5rbm93bikgPT4gdm9pZDtcbiAgb25JbWFnZUxvYWQ/OiAocmVxdWVzdElkOiB1bmtub3duKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZEVycm9yPzogKHJlcXVlc3RJZDogdW5rbm93biwgZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxuY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHM8V01TTGF5ZXJQcm9wcz4gPSB7XG4gIGlkOiAnaW1hZ2VyeS1sYXllcicsXG4gIGRhdGE6ICcnLFxuICBzZXJ2aWNlVHlwZTogJ2F1dG8nLFxuICBzcnM6ICdhdXRvJyxcbiAgbGF5ZXJzOiB7dHlwZTogJ2FycmF5JywgY29tcGFyZTogdHJ1ZSwgdmFsdWU6IFtdfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbk1ldGFkYXRhTG9hZDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiAoKSA9PiB7fX0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBvbk1ldGFkYXRhTG9hZEVycm9yOiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6IGNvbnNvbGUuZXJyb3J9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uSW1hZ2VMb2FkU3RhcnQ6IHt0eXBlOiAnZnVuY3Rpb24nLCB2YWx1ZTogKCkgPT4ge319LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uSW1hZ2VMb2FkOiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6ICgpID0+IHt9fSxcbiAgb25JbWFnZUxvYWRFcnJvcjoge1xuICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgY29tcGFyZTogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgdmFsdWU6IChyZXF1ZXN0SWQ6IHVua25vd24sIGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvciwgcmVxdWVzdElkKVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXTVNMYXllciBleHRlbmRzIENvbXBvc2l0ZUxheWVyPFJlcXVpcmVkPF9XTVNMYXllclByb3BzPj4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ1dNU0xheWVyJztcbiAgc3RhdGljIGRlZmF1bHRQcm9wczogRGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4gIGRlY2xhcmUgc3RhdGU6IHtcbiAgICBpbWFnZVNvdXJjZTogSW1hZ2VTb3VyY2U7XG4gICAgaW1hZ2U6IEltYWdlVHlwZTtcbiAgICBib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIGxhc3RSZXF1ZXN0UGFyYW1ldGVyczoge1xuICAgICAgLy8gVE9ETzogcmVtb3ZlIGJib3ggb25jZSBkZWNrLmdsIGlzIHVwZ3JhZGVkIHRvIF44LjEwIHdpdGggbG9hZGVycy5nbCBeNFxuICAgICAgYmJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgICBib3VuZGluZ0JveDogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dO1xuICAgICAgbGF5ZXJzOiBzdHJpbmdbXTtcbiAgICAgIHNyczogJ0VQU0c6NDMyNicgfCAnRVBTRzozODU3JztcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB9O1xuICAgIGxhc3RSZXF1ZXN0SWQ6IG51bWJlcjtcbiAgICBfbmV4dFJlcXVlc3RJZDogbnVtYmVyO1xuICAgIC8qKiBUT0RPOiBDaGFuZ2UgYW55ID0+IHNldFRpbWVvdXQgcmV0dXJuIHR5cGUuIERpZmZlcmVudCBiZXR3ZWVuIE5vZGUgYW5kIGJyb3dzZXIuLi4gKi9cbiAgICBfdGltZW91dElkOiBhbnk7XG4gICAgbG9hZENvdW50ZXI6IG51bWJlcjtcbiAgICBfbGFzdFJlcXVlc3Rab29tOiBudW1iZXI7XG4gIH07XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhbGwgYXN5bmMgcmVzb3VyY2VzIGFyZSBsb2FkZWQgKi9cbiAgZ2V0IGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRyYWNrIHRoZSBleHBsaWNpdCBsb2FkaW5nIGRvbmUgYnkgdGhpcyBsYXllclxuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RhdGUpICYmIHRoaXMuc3RhdGUubG9hZENvdW50ZXIgPT09IDAgJiYgc3VwZXIuaXNMb2FkZWQ7XG4gIH1cblxuICAvKiogTGV0cyBkZWNrLmdsIGtub3cgdGhhdCB3ZSB3YW50IHZpZXdwb3J0IGNoYW5nZSBldmVudHMgKi9cbiAgb3ZlcnJpZGUgc2hvdWxkVXBkYXRlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdmVycmlkZSBpbml0aWFsaXplU3RhdGUoKTogdm9pZCB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBlbXB0eSwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB1cGRhdGVTdGF0ZVxuICAgIHRoaXMuc3RhdGUuX25leHRSZXF1ZXN0SWQgPSAwO1xuICAgIHRoaXMuc3RhdGUubGFzdFJlcXVlc3RJZCA9IC0xO1xuICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXIgPSAwO1xuICAgIHRoaXMuc3RhdGUuX2xhc3RSZXF1ZXN0Wm9vbSA9IC0xO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlU3RhdGUoe2NoYW5nZUZsYWdzLCBwcm9wcywgb2xkUHJvcHN9OiBVcGRhdGVQYXJhbWV0ZXJzPHRoaXM+KTogdm9pZCB7XG4gICAgY29uc3Qge3ZpZXdwb3J0fSA9IHRoaXMuY29udGV4dDtcblxuICAgIC8vIENoZWNrIGlmIGRhdGEgc291cmNlIGhhcyBjaGFuZ2VkXG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkIHx8IHByb3BzLnNlcnZpY2VUeXBlICE9PSBvbGRQcm9wcy5zZXJ2aWNlVHlwZSkge1xuICAgICAgdGhpcy5zdGF0ZS5pbWFnZVNvdXJjZSA9IHRoaXMuX2NyZWF0ZUltYWdlU291cmNlKHByb3BzKTtcblxuICAgICAgdGhpcy5fbG9hZE1ldGFkYXRhKCk7XG4gICAgICB0aGlzLmRlYm91bmNlKCgpID0+IHRoaXMubG9hZEltYWdlKHZpZXdwb3J0LCAnaW1hZ2Ugc291cmNlIGNoYW5nZWQnKSwgMCk7XG4gICAgfSBlbHNlIGlmICghZGVlcEVxdWFsKHByb3BzLmxheWVycywgb2xkUHJvcHMubGF5ZXJzLCAxKSkge1xuICAgICAgdGhpcy5kZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRJbWFnZSh2aWV3cG9ydCwgJ2xheWVycyBjaGFuZ2VkJyksIDApO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICAvLyBDaGVjayBpZiBwcmVzZXJ2ZURyYXdpbmdCdWZmZXIgaXMgZW5hYmxlZCAoaW5kaWNhdGVzIHZpZGVvIHJlY29yZGluZyBvciBpbWFnZSBleHBvcnQpXG4gICAgICAvLyBVc2UgbWluaW1hbCBkZWJvdW5jZSAoMTBtcykgZHVyaW5nIGV4cG9ydCBmb3IgcmVzcG9uc2l2ZSBmcmFtZSBjYXB0dXJlXG4gICAgICAvLyBSZXF1ZXN0IGRlZHVwbGljYXRpb24gaW4gbG9hZEltYWdlIHByZXZlbnRzIHNwYW0gZnJvbSByZWR1bmRhbnQgdmlld3BvcnQgdXBkYXRlc1xuICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICBjb25zdCBpc1ByZXNlcnZpbmdCdWZmZXIgPSBnbD8uZ2V0Q29udGV4dEF0dHJpYnV0ZXM/LigpPy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XG5cbiAgICAgIGNvbnN0IGRlYm91bmNlRGVsYXkgPSBpc1ByZXNlcnZpbmdCdWZmZXIgPyAxMCA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGVib3VuY2UoKCkgPT4gdGhpcy5sb2FkSW1hZ2Uodmlld3BvcnQsICd2aWV3cG9ydCBjaGFuZ2VkJyksIGRlYm91bmNlRGVsYXkpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlckxheWVycygpOiBMYXllcjxhbnk+IHtcbiAgICBjb25zdCB7Ym91bmRzLCBpbWFnZSwgbGFzdFJlcXVlc3RQYXJhbWV0ZXJzfSA9IHRoaXMuc3RhdGU7XG5cbiAgICByZXR1cm4gKFxuICAgICAgaW1hZ2UgJiZcbiAgICAgIG5ldyBCaXRtYXBMYXllcih7XG4gICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7aWQ6ICdiaXRtYXAnfSksXG4gICAgICAgIF9pbWFnZUNvb3JkaW5hdGVTeXN0ZW06XG4gICAgICAgICAgbGFzdFJlcXVlc3RQYXJhbWV0ZXJzLnNycyA9PT0gJ0VQU0c6NDMyNidcbiAgICAgICAgICAgID8gQ09PUkRJTkFURV9TWVNURU0uTE5HTEFUXG4gICAgICAgICAgICA6IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICAgICAgYm91bmRzLFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgcGlja2FibGU6IHRoaXMucHJvcHMucGlja2FibGVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVJbmZvVGV4dCh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHtsYXN0UmVxdWVzdFBhcmFtZXRlcnN9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAobGFzdFJlcXVlc3RQYXJhbWV0ZXJzKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVuZG9jdW1lbnRlZCBtZXRob2RcbiAgICAgIGNvbnN0IGZlYXR1cmVJbmZvID0gYXdhaXQgdGhpcy5zdGF0ZS5pbWFnZVNvdXJjZS5nZXRGZWF0dXJlSW5mb1RleHQ/Lih7XG4gICAgICAgIC4uLmxhc3RSZXF1ZXN0UGFyYW1ldGVycyxcbiAgICAgICAgcXVlcnlfbGF5ZXJzOiBsYXN0UmVxdWVzdFBhcmFtZXRlcnMubGF5ZXJzLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBpbmZvX2Zvcm1hdDogJ2FwcGxpY2F0aW9uL3ZuZC5vZ2MuZ21sJ1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmVhdHVyZUluZm87XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIF9jcmVhdGVJbWFnZVNvdXJjZShwcm9wczogV01TTGF5ZXJQcm9wcyk6IEltYWdlU291cmNlIHtcbiAgICBpZiAocHJvcHMuZGF0YSBpbnN0YW5jZW9mIEltYWdlU291cmNlKSB7XG4gICAgICByZXR1cm4gcHJvcHMuZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFdNU0ltYWdlU291cmNlKHByb3BzLmRhdGEsIHtcbiAgICAgICAgbG9hZE9wdGlvbnM6IHByb3BzLmxvYWRPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW1hZ2Ugc291cmNlIGluIHByb3BzLmRhdGEnKTtcbiAgfVxuXG4gIC8qKiBSdW4gYSBnZXRNZXRhZGF0YSBvbiB0aGUgaW1hZ2Ugc2VydmljZSAqL1xuICBhc3luYyBfbG9hZE1ldGFkYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtpbWFnZVNvdXJjZX0gPSB0aGlzLnN0YXRlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyKys7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGltYWdlU291cmNlLmdldE1ldGFkYXRhKCk7XG5cbiAgICAgIC8vIElmIGEgcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSwgaXQgbWF5IG5vIGxvbmdlciBiZSBleHBlY3RlZFxuICAgICAgaWYgKHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UgPT09IGltYWdlU291cmNlKSB7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uTWV0YWRhdGFMb2FkKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5nZXRDdXJyZW50TGF5ZXIoKT8ucHJvcHMub25NZXRhZGF0YUxvYWRFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXItLTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZCBhbiBpbWFnZSAqL1xuICBhc3luYyBsb2FkSW1hZ2Uodmlld3BvcnQ6IFZpZXdwb3J0LCBfcmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bGF5ZXJzLCBzZXJ2aWNlVHlwZSwgdHJhbnNwYXJlbnR9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIFRPRE8gLSBtb3ZlIHRvIEltYWdlU291cmNlP1xuICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gJ3dtcycgJiYgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kcyA9IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuICAgIGxldCB7c3JzfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHNycyA9PT0gJ2F1dG8nKSB7XG4gICAgICAvLyBCaXRtYXBMYXllciBvbmx5IHN1cHBvcnRzIExOR0xBVCBvciBDQVJURVNJQU4gKFdlYi1NZXJjYXRvcilcbiAgICAgIHNycyA9IHZpZXdwb3J0LnJlc29sdXRpb24gPyAnRVBTRzo0MzI2JyA6ICdFUFNHOjM4NTcnO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICBiYm94OiBib3VuZHMsXG4gICAgICBib3VuZGluZ0JveDogW1xuICAgICAgICBbYm91bmRzWzBdLCBib3VuZHNbMV1dLFxuICAgICAgICBbYm91bmRzWzJdLCBib3VuZHNbM11dXG4gICAgICBdIGFzIFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICAgIGxheWVycyxcbiAgICAgIHNycyxcbiAgICAgIHRyYW5zcGFyZW50XG4gICAgfTtcbiAgICBpZiAoc3JzID09PSAnRVBTRzozODU3Jykge1xuICAgICAgY29uc3QgW21pblgsIG1pblldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMF0sIGJvdW5kc1sxXV0pO1xuICAgICAgY29uc3QgW21heFgsIG1heFldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMl0sIGJvdW5kc1szXV0pO1xuICAgICAgcmVxdWVzdFBhcmFtcy5ib3VuZGluZ0JveCA9IFtcbiAgICAgICAgW21pblgsIG1pblldLFxuICAgICAgICBbbWF4WCwgbWF4WV1cbiAgICAgIF07XG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICByZXF1ZXN0UGFyYW1zLmJib3ggPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gICAgfVxuXG4gICAgLy8gU2tpcCByZXF1ZXN0IGlmIHBhcmFtZXRlcnMgaGF2ZW4ndCBtZWFuaW5nZnVsbHkgY2hhbmdlZFxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUubGFzdFJlcXVlc3RQYXJhbWV0ZXJzICYmXG4gICAgICB0aGlzLl9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwodGhpcy5zdGF0ZS5sYXN0UmVxdWVzdFBhcmFtZXRlcnMsIHJlcXVlc3RQYXJhbXMpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRHVyaW5nIHZpZGVvIGV4cG9ydCwgdGhyb3R0bGUgem9vbS1pbiByZXF1ZXN0cyB0byBvbmx5IGZpcmUgb24gem9vbSBsZXZlbCBjcm9zc2luZ3MuXG4gICAgLy8gVGhlIGV4aXN0aW5nIGltYWdlIGlzIHN0cmV0Y2hlZCBieSB0aGUgQml0bWFwTGF5ZXIgdW50aWwgdGhlIG5leHQgbGV2ZWwgaXMgcmVhY2hlZC5cbiAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICBjb25zdCBpc0V4cG9ydGluZyA9IGdsPy5nZXRDb250ZXh0QXR0cmlidXRlcz8uKCk/LnByZXNlcnZlRHJhd2luZ0J1ZmZlcjtcbiAgICBpZiAoaXNFeHBvcnRpbmcgJiYgdGhpcy5zdGF0ZS5fbGFzdFJlcXVlc3Rab29tID49IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRab29tID0gdmlld3BvcnQuem9vbTtcbiAgICAgIGNvbnN0IGxhc3Rab29tID0gdGhpcy5zdGF0ZS5fbGFzdFJlcXVlc3Rab29tO1xuICAgICAgY29uc3QgaXNab29taW5nSW4gPSBjdXJyZW50Wm9vbSA+IGxhc3Rab29tO1xuICAgICAgaWYgKGlzWm9vbWluZ0luICYmIE1hdGguZmxvb3IoY3VycmVudFpvb20pID09PSBNYXRoLmZsb29yKGxhc3Rab29tKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxhc3RSZXF1ZXN0UGFyYW1ldGVycyBCRUZPUkUgbWFraW5nIHRoZSByZXF1ZXN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgLy8gd2hlcmUgbXVsdGlwbGUgZGVib3VuY2VkIGNhbGxzIHNlZSB0aGUgc2FtZSBvbGQgcGFyYW1ldGVycyBhbmQgYWxsIHByb2NlZWRcbiAgICB0aGlzLnN0YXRlLmxhc3RSZXF1ZXN0UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbXM7XG4gICAgdGhpcy5zdGF0ZS5fbGFzdFJlcXVlc3Rab29tID0gdmlld3BvcnQuem9vbTtcblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2V0UmVxdWVzdElkKCk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXIrKztcbiAgICAgIHRoaXMucHJvcHMub25JbWFnZUxvYWRTdGFydChyZXF1ZXN0SWQpO1xuXG4gICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UuZ2V0SW1hZ2UocmVxdWVzdFBhcmFtcyk7XG5cbiAgICAgIC8vIElmIGEgcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSwgbGF0ZXIgcmVxdWVzdHMgbWF5IGhhdmUgYWxyZWFkeSBsb2FkZWQuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5sYXN0UmVxdWVzdElkIDwgcmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uSW1hZ2VMb2FkKHJlcXVlc3RJZCk7XG4gICAgICAgIC8vIE5vdCB0eXBlIHNhZmUuLi5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgYm91bmRzLFxuICAgICAgICAgIGxhc3RSZXF1ZXN0SWQ6IHJlcXVlc3RJZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jb250ZXh0Lm9uRXJyb3I/LihlcnJvciBhcyBFcnJvciwgdGhpcyk7XG4gICAgICB0aGlzLmdldEN1cnJlbnRMYXllcigpPy5wcm9wcy5vbkltYWdlTG9hZEVycm9yKHJlcXVlc3RJZCwgZXJyb3IgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgLy8gSEVMUEVSU1xuXG4gIC8qKiBHbG9iYWwgY291bnRlciBmb3IgaXNzdWluZyB1bmlxdWUgcmVxdWVzdCBpZHMgKi9cbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5fbmV4dFJlcXVlc3RJZCsrO1xuICB9XG5cbiAgLyoqIFJ1bnMgYW4gYWN0aW9uIGluIHRoZSBmdXR1cmUsIGNhbmNlbHMgaXQgaWYgdGhlIG5ldyBhY3Rpb24gaXMgaXNzdWVkIGJlZm9yZSBpdCBleGVjdXRlcyAqL1xuICBwcml2YXRlIGRlYm91bmNlKGZuOiAoKSA9PiB2b2lkLCBtcyA9IDUwMCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnN0YXRlLl90aW1lb3V0SWQpO1xuICAgIHRoaXMuc3RhdGUuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gZm4oKSwgbXMpO1xuICB9XG5cbiAgLyoqIENvbXBhcmUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGRldGVybWluZSBpZiBhIG5ldyByZXF1ZXN0IGlzIG5lZWRlZCAqL1xuICBwcml2YXRlIF9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwocHJldjogYW55LCBuZXh0OiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDb21wYXJlIGRpbWVuc2lvbnNcbiAgICBpZiAocHJldi53aWR0aCAhPT0gbmV4dC53aWR0aCB8fCBwcmV2LmhlaWdodCAhPT0gbmV4dC5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIFNSU1xuICAgIGlmIChwcmV2LnNycyAhPT0gbmV4dC5zcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIGxheWVyc1xuICAgIGlmICghZGVlcEVxdWFsKHByZXYubGF5ZXJzLCBuZXh0LmxheWVycykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIHRyYW5zcGFyZW50XG4gICAgaWYgKHByZXYudHJhbnNwYXJlbnQgIT09IG5leHQudHJhbnNwYXJlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIGJvdW5kcyB3aXRoIHRvbGVyYW5jZSBmb3IgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uXG4gICAgY29uc3QgdG9sZXJhbmNlID0gMWUtMTA7XG4gICAgY29uc3QgcHJldkJib3ggPSBwcmV2LmJib3g7XG4gICAgY29uc3QgbmV4dEJib3ggPSBuZXh0LmJib3g7XG5cbiAgICBpZiAocHJldkJib3ggJiYgbmV4dEJib3gpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhwcmV2QmJveFtpXSAtIG5leHRCYm94W2ldKSA+IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZXBzZy5pby8zODU3XG4vLyArcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAgK2xvbl8wPTAgK3hfMD0wICt5XzA9MCAraz0xICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArd2t0ZXh0ICtub19kZWZzICt0eXBlPWNyc1xuY29uc3QgSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFID0gNjM3ODEzNyAqIE1hdGguUEk7XG5cbi8qKiBQcm9qZWN0cyBFUFNHOjQzMjYgdG8gRVBTRzozODU3XG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgcmVwbGFjZW1lbnQgb2YgcHJvajQuIFVzZSB0ZXN0cyB0byBlbnN1cmUgY29uZm9ybWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXR1M4NFRvUHNldWRvTWVyY2F0b3IoY29vcmQ6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbWVyY2F0b3IgPSBsbmdMYXRUb1dvcmxkKGNvb3JkKTtcbiAgbWVyY2F0b3JbMF0gPSAobWVyY2F0b3JbMF0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgbWVyY2F0b3JbMV0gPSAobWVyY2F0b3JbMV0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgcmV0dXJuIG1lcmNhdG9yO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFVQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFBNEQsU0FBQUksUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEs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
594
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViTWVyY2F0b3IiLCJyZXF1aXJlIiwiX2NvcmUiLCJfbGF5ZXJzIiwiX3dtcyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIkNPVkVSQUdFX1JFRkVUQ0hfWk9PTV9GQUNUT1IiLCJkZWZhdWx0UHJvcHMiLCJpZCIsImRhdGEiLCJzZXJ2aWNlVHlwZSIsInNycyIsImxheWVycyIsInR5cGUiLCJjb21wYXJlIiwidmFsdWUiLCJvbk1ldGFkYXRhTG9hZCIsIm9uTWV0YWRhdGFMb2FkRXJyb3IiLCJjb25zb2xlIiwiZXJyb3IiLCJvbkltYWdlTG9hZFN0YXJ0Iiwib25JbWFnZUxvYWQiLCJvbkltYWdlTG9hZEVycm9yIiwicmVxdWVzdElkIiwiV01TTGF5ZXIiLCJleHBvcnRzIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiZ2V0Iiwic3RhdGUiLCJsb2FkQ291bnRlciIsInNob3VsZFVwZGF0ZVN0YXRlIiwiaW5pdGlhbGl6ZVN0YXRlIiwiX25leHRSZXF1ZXN0SWQiLCJsYXN0UmVxdWVzdElkIiwiX2xhc3RSZXF1ZXN0Wm9vbSIsInVwZGF0ZVN0YXRlIiwiX3JlZiIsIl90aGlzIiwiY2hhbmdlRmxhZ3MiLCJwcm9wcyIsIm9sZFByb3BzIiwidmlld3BvcnQiLCJjb250ZXh0IiwiZGF0YUNoYW5nZWQiLCJpbWFnZVNvdXJjZSIsIl9jcmVhdGVJbWFnZVNvdXJjZSIsIl9sb2FkTWV0YWRhdGEiLCJkZWJvdW5jZSIsImxvYWRJbWFnZSIsImRlZXBFcXVhbCIsInZpZXdwb3J0Q2hhbmdlZCIsIl9nbCRnZXRDb250ZXh0QXR0cmlidSIsImdsIiwiaXNQcmVzZXJ2aW5nQnVmZmVyIiwiZ2V0Q29udGV4dEF0dHJpYnV0ZXMiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJkZWJvdW5jZURlbGF5IiwidW5kZWZpbmVkIiwicmVuZGVyTGF5ZXJzIiwiX3RoaXMkc3RhdGUiLCJib3VuZHMiLCJpbWFnZSIsImxhc3RSZXF1ZXN0UGFyYW1ldGVycyIsIkJpdG1hcExheWVyIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsIl9pbWFnZUNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsIkNBUlRFU0lBTiIsInBpY2thYmxlIiwiX2dldEZlYXR1cmVJbmZvVGV4dCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwieCIsInkiLCJfdGhpcyRzdGF0ZSRpbWFnZVNvdXIiLCJfdGhpcyRzdGF0ZSRpbWFnZVNvdXIyIiwiZmVhdHVyZUluZm8iLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0RmVhdHVyZUluZm9UZXh0IiwicXVlcnlfbGF5ZXJzIiwiaW5mb19mb3JtYXQiLCJzZW50IiwiYWJydXB0Iiwic3RvcCIsIl94IiwiX3gyIiwiSW1hZ2VTb3VyY2UiLCJXTVNJbWFnZVNvdXJjZSIsImxvYWRPcHRpb25zIiwiRXJyb3IiLCJfbG9hZE1ldGFkYXRhMiIsIl9jYWxsZWUyIiwibWV0YWRhdGEiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXIiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXIyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZ2V0TWV0YWRhdGEiLCJnZXRDdXJyZW50TGF5ZXIiLCJ0MCIsImZpbmlzaCIsIl9sb2FkSW1hZ2UiLCJfY2FsbGVlMyIsIl9yZWFzb24iLCJfZ2wkZ2V0Q29udGV4dEF0dHJpYnUyIiwiX3RoaXMkcHJvcHMiLCJ0cmFuc3BhcmVudCIsIndpZHRoIiwiaGVpZ2h0IiwicmVxdWVzdFBhcmFtcyIsIl9XR1M4NFRvUHNldWRvTWVyY2F0byIsIl9XR1M4NFRvUHNldWRvTWVyY2F0bzIiLCJtaW5YIiwibWluWSIsIl9XR1M4NFRvUHNldWRvTWVyY2F0bzMiLCJfV0dTODRUb1BzZXVkb01lcmNhdG80IiwibWF4WCIsIm1heFkiLCJpc0V4cG9ydGluZyIsImN1cnJlbnRab29tIiwibGFzdFpvb20iLCJpc1pvb21pbmdJbiIsIl90aGlzJGdldEN1cnJlbnRMYXllcjMiLCJfdGhpcyRjb250ZXh0JG9uRXJyb3IiLCJfdGhpcyRjb250ZXh0IiwiX3RoaXMkZ2V0Q3VycmVudExheWVyNCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsInJlc29sdXRpb24iLCJnZXRHbG9iZVZpc2libGVCb3VuZHMiLCJnZXRCb3VuZHMiLCJiYm94IiwiYm91bmRpbmdCb3giLCJXR1M4NFRvUHNldWRvTWVyY2F0b3IiLCJfc2xpY2VkVG9BcnJheTIiLCJfYXJlUmVxdWVzdFBhcmFtc0VxdWFsIiwiX2lzVmlld0NvdmVyZWRCeUxhc3RSZXF1ZXN0Iiwiem9vbSIsIk1hdGgiLCJmbG9vciIsImdldFJlcXVlc3RJZCIsImdldEltYWdlIiwic2V0U3RhdGUiLCJvbkVycm9yIiwiX3gzIiwiX3g0IiwiZm4iLCJtcyIsImNsZWFyVGltZW91dCIsIl90aW1lb3V0SWQiLCJzZXRUaW1lb3V0IiwibiIsImNvbnRhaW5lZCIsInByZXZTcGFuWCIsIm5leHRTcGFuWCIsInByZXZTcGFuWSIsIm5leHRTcGFuWSIsInRvbGVyYW5jZSIsInByZXZCYm94IiwibmV4dEJib3giLCJpIiwiYWJzIiwiQ29tcG9zaXRlTGF5ZXIiLCJfbG9uZ2l0dWRlIiwiY2VudGVyTG5nIiwibG9uZ2l0dWRlIiwiU0FNUExFUyIsImxhdHMiLCJsbmdPZmZzZXRzIiwiaiIsInB4IiwicHkiLCJjb29yZCIsInVucHJvamVjdCIsImxuZyIsImxhdCIsIk51bWJlciIsImlzRmluaXRlIiwib2Zmc2V0IiwibWluTGF0IiwibWluIiwibWF4TGF0IiwibWF4Iiwibm9ydGhQb2xlVmlzaWJsZSIsImlzR2xvYmVTdXJmYWNlUG9pbnRWaXNpYmxlIiwic291dGhQb2xlVmlzaWJsZSIsIm1pbkxuZyIsIm1heExuZyIsImxhdFBhZCIsImxuZ1BhZCIsInBvaW50IiwicHJvamVjdFBvc2l0aW9uIiwiY2FtZXJhIiwiY2FtZXJhUG9zaXRpb24iLCJyUG9pbnQiLCJoeXBvdCIsInJDYW0iLCJjb3NTdXJmYWNlIiwiY29zSG9yaXpvbiIsInNjcmVlbiIsInByb2plY3QiLCJIQUxGX0VBUlRIX0NJUkNVTUZFUkVOQ0UiLCJQSSIsIm1lcmNhdG9yIiwibG5nTGF0VG9Xb3JsZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93bXMvd21zLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7bG5nTGF0VG9Xb3JsZH0gZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJztcblxuaW1wb3J0IHtcbiAgTGF5ZXIsXG4gIENvbXBvc2l0ZUxheWVyLFxuICBDb21wb3NpdGVMYXllclByb3BzLFxuICBVcGRhdGVQYXJhbWV0ZXJzLFxuICBEZWZhdWx0UHJvcHMsXG4gIFZpZXdwb3J0LFxuICBDT09SRElOQVRFX1NZU1RFTSxcbiAgX2RlZXBFcXVhbCBhcyBkZWVwRXF1YWxcbn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge0JpdG1hcExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtJbWFnZVNvdXJjZSwgV01TSW1hZ2VTb3VyY2V9IGZyb20gJ0Bsb2FkZXJzLmdsL3dtcyc7XG5cbmltcG9ydCB0eXBlIHtJbWFnZVNvdXJjZU1ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuaW1wb3J0IHR5cGUge0ltYWdlVHlwZX0gZnJvbSAnQGxvYWRlcnMuZ2wvd21zJztcblxuLy8gVE9ETzogVGhpcyBpcyBhIG1vZGlmaWVkIGNvcHkgb2YgV01TTGF5ZXIgZnJvbSBkZWNrLmdsLiBSZW1vdmUgdGhpcyBvbmNlIHdlIHVwZ3JhZGUgZGVjay5nbCBhbmQgbG9hZGVycy5nbC5cblxuLyoqIEFsbCBwcm9wcyBzdXBwb3J0ZWQgYnkgdGhlIFRpbGVMYXllciAqL1xuZXhwb3J0IHR5cGUgV01TTGF5ZXJQcm9wcyA9IENvbXBvc2l0ZUxheWVyUHJvcHMgJiBfV01TTGF5ZXJQcm9wcztcblxuLyoqIFByb3BzIGFkZGVkIGJ5IHRoZSBUaWxlTGF5ZXIgKi9cbnR5cGUgX1dNU0xheWVyUHJvcHMgPSB7XG4gIGRhdGE6IHN0cmluZyB8IEltYWdlU291cmNlO1xuICBzZXJ2aWNlVHlwZT86IHN0cmluZyB8ICdhdXRvJztcbiAgbGF5ZXJzPzogc3RyaW5nW107XG4gIHNycz86ICdFUFNHOjQzMjYnIHwgJ0VQU0c6Mzg1NycgfCAnYXV0byc7XG4gIHRyYW5zcGFyZW50PzogYm9vbGVhbjtcbiAgb25NZXRhZGF0YUxvYWQ/OiAobWV0YWRhdGE6IEltYWdlU291cmNlTWV0YWRhdGEpID0+IHZvaWQ7XG4gIG9uTWV0YWRhdGFMb2FkRXJyb3I/OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZFN0YXJ0PzogKHJlcXVlc3RJZDogdW5rbm93bikgPT4gdm9pZDtcbiAgb25JbWFnZUxvYWQ/OiAocmVxdWVzdElkOiB1bmtub3duKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZEVycm9yPzogKHJlcXVlc3RJZDogdW5rbm93biwgZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBIb3cgbXVjaCB0aGUgdXNlciBtYXkgem9vbSBpbiAoc2hyaW5raW5nIHRoZSB2aXNpYmxlIHNwYW4pIGJlZm9yZSBhIHZpZXcgdGhhdFxuICogaXMgc3RpbGwgY29udGFpbmVkIGluIHRoZSBsYXN0IHJlcXVlc3RlZCBleHRlbnQgdHJpZ2dlcnMgYSBmcmVzaCwgaGlnaGVyXG4gKiByZXNvbHV0aW9uIHJlcXVlc3QuIGAyYCBtZWFucyB0aGUgY2FjaGVkIGltYWdlIG1heSBiZSBzdHJldGNoZWQgdXAgdG8gfjJ4XG4gKiBiZWZvcmUgcmVmZXRjaGluZzsgaGlnaGVyIHZhbHVlcyBtZWFuIGZld2VyIHJlcXVlc3RzIGJ1dCBibHVycmllciB6b29tLWlucy5cbiAqL1xuY29uc3QgQ09WRVJBR0VfUkVGRVRDSF9aT09NX0ZBQ1RPUiA9IDI7XG5cbmNvbnN0IGRlZmF1bHRQcm9wczogRGVmYXVsdFByb3BzPFdNU0xheWVyUHJvcHM+ID0ge1xuICBpZDogJ2ltYWdlcnktbGF5ZXInLFxuICBkYXRhOiAnJyxcbiAgc2VydmljZVR5cGU6ICdhdXRvJyxcbiAgc3JzOiAnYXV0bycsXG4gIGxheWVyczoge3R5cGU6ICdhcnJheScsIGNvbXBhcmU6IHRydWUsIHZhbHVlOiBbXX0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25NZXRhZGF0YUxvYWQ6IHt0eXBlOiAnZnVuY3Rpb24nLCB2YWx1ZTogKCkgPT4ge319LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgb25NZXRhZGF0YUxvYWRFcnJvcjoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiBjb25zb2xlLmVycm9yfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkltYWdlTG9hZFN0YXJ0OiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6ICgpID0+IHt9fSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkltYWdlTG9hZDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiAoKSA9PiB7fX0sXG4gIG9uSW1hZ2VMb2FkRXJyb3I6IHtcbiAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgIGNvbXBhcmU6IGZhbHNlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHZhbHVlOiAocmVxdWVzdElkOiB1bmtub3duLCBlcnJvcjogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoZXJyb3IsIHJlcXVlc3RJZClcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV01TTGF5ZXIgZXh0ZW5kcyBDb21wb3NpdGVMYXllcjxSZXF1aXJlZDxfV01TTGF5ZXJQcm9wcz4+IHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdXTVNMYXllcic7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHM6IERlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBkZWNsYXJlIHN0YXRlOiB7XG4gICAgaW1hZ2VTb3VyY2U6IEltYWdlU291cmNlO1xuICAgIGltYWdlOiBJbWFnZVR5cGU7XG4gICAgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBsYXN0UmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBiYm94IG9uY2UgZGVjay5nbCBpcyB1cGdyYWRlZCB0byBeOC4xMCB3aXRoIGxvYWRlcnMuZ2wgXjRcbiAgICAgIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgICAgYm91bmRpbmdCb3g6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcbiAgICAgIGxheWVyczogc3RyaW5nW107XG4gICAgICBzcnM6ICdFUFNHOjQzMjYnIHwgJ0VQU0c6Mzg1Nyc7XG4gICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgfTtcbiAgICBsYXN0UmVxdWVzdElkOiBudW1iZXI7XG4gICAgX25leHRSZXF1ZXN0SWQ6IG51bWJlcjtcbiAgICAvKiogVE9ETzogQ2hhbmdlIGFueSA9PiBzZXRUaW1lb3V0IHJldHVybiB0eXBlLiBEaWZmZXJlbnQgYmV0d2VlbiBOb2RlIGFuZCBicm93c2VyLi4uICovXG4gICAgX3RpbWVvdXRJZDogYW55O1xuICAgIGxvYWRDb3VudGVyOiBudW1iZXI7XG4gICAgX2xhc3RSZXF1ZXN0Wm9vbTogbnVtYmVyO1xuICB9O1xuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgYWxsIGFzeW5jIHJlc291cmNlcyBhcmUgbG9hZGVkICovXG4gIGdldCBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICAvLyBUcmFjayB0aGUgZXhwbGljaXQgbG9hZGluZyBkb25lIGJ5IHRoaXMgbGF5ZXJcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnN0YXRlKSAmJiB0aGlzLnN0YXRlLmxvYWRDb3VudGVyID09PSAwICYmIHN1cGVyLmlzTG9hZGVkO1xuICB9XG5cbiAgLyoqIExldHMgZGVjay5nbCBrbm93IHRoYXQgd2Ugd2FudCB2aWV3cG9ydCBjaGFuZ2UgZXZlbnRzICovXG4gIG92ZXJyaWRlIHNob3VsZFVwZGF0ZVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5pdGlhbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIC8vIGludGVudGlvbmFsbHkgZW1wdHksIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdXBkYXRlU3RhdGVcbiAgICB0aGlzLnN0YXRlLl9uZXh0UmVxdWVzdElkID0gMDtcbiAgICB0aGlzLnN0YXRlLmxhc3RSZXF1ZXN0SWQgPSAtMTtcbiAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyID0gMDtcbiAgICB0aGlzLnN0YXRlLl9sYXN0UmVxdWVzdFpvb20gPSAtMTtcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZVN0YXRlKHtjaGFuZ2VGbGFncywgcHJvcHMsIG9sZFByb3BzfTogVXBkYXRlUGFyYW1ldGVyczx0aGlzPik6IHZvaWQge1xuICAgIGNvbnN0IHt2aWV3cG9ydH0gPSB0aGlzLmNvbnRleHQ7XG5cbiAgICAvLyBDaGVjayBpZiBkYXRhIHNvdXJjZSBoYXMgY2hhbmdlZFxuICAgIGlmIChjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCB8fCBwcm9wcy5zZXJ2aWNlVHlwZSAhPT0gb2xkUHJvcHMuc2VydmljZVR5cGUpIHtcbiAgICAgIHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UgPSB0aGlzLl9jcmVhdGVJbWFnZVNvdXJjZShwcm9wcyk7XG5cbiAgICAgIHRoaXMuX2xvYWRNZXRhZGF0YSgpO1xuICAgICAgdGhpcy5kZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRJbWFnZSh2aWV3cG9ydCwgJ2ltYWdlIHNvdXJjZSBjaGFuZ2VkJyksIDApO1xuICAgIH0gZWxzZSBpZiAoIWRlZXBFcXVhbChwcm9wcy5sYXllcnMsIG9sZFByb3BzLmxheWVycywgMSkpIHtcbiAgICAgIHRoaXMuZGVib3VuY2UoKCkgPT4gdGhpcy5sb2FkSW1hZ2Uodmlld3BvcnQsICdsYXllcnMgY2hhbmdlZCcpLCAwKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZUZsYWdzLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgcHJlc2VydmVEcmF3aW5nQnVmZmVyIGlzIGVuYWJsZWQgKGluZGljYXRlcyB2aWRlbyByZWNvcmRpbmcgb3IgaW1hZ2UgZXhwb3J0KVxuICAgICAgLy8gVXNlIG1pbmltYWwgZGVib3VuY2UgKDEwbXMpIGR1cmluZyBleHBvcnQgZm9yIHJlc3BvbnNpdmUgZnJhbWUgY2FwdHVyZVxuICAgICAgLy8gUmVxdWVzdCBkZWR1cGxpY2F0aW9uIGluIGxvYWRJbWFnZSBwcmV2ZW50cyBzcGFtIGZyb20gcmVkdW5kYW50IHZpZXdwb3J0IHVwZGF0ZXNcbiAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgY29uc3QgaXNQcmVzZXJ2aW5nQnVmZmVyID0gZ2w/LmdldENvbnRleHRBdHRyaWJ1dGVzPy4oKT8ucHJlc2VydmVEcmF3aW5nQnVmZmVyO1xuXG4gICAgICBjb25zdCBkZWJvdW5jZURlbGF5ID0gaXNQcmVzZXJ2aW5nQnVmZmVyID8gMTAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRlYm91bmNlKCgpID0+IHRoaXMubG9hZEltYWdlKHZpZXdwb3J0LCAndmlld3BvcnQgY2hhbmdlZCcpLCBkZWJvdW5jZURlbGF5KTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXJMYXllcnMoKTogTGF5ZXI8YW55PiB7XG4gICAgY29uc3Qge2JvdW5kcywgaW1hZ2UsIGxhc3RSZXF1ZXN0UGFyYW1ldGVyc30gPSB0aGlzLnN0YXRlO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGltYWdlICYmXG4gICAgICBuZXcgQml0bWFwTGF5ZXIoe1xuICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe2lkOiAnYml0bWFwJ30pLFxuICAgICAgICBfaW1hZ2VDb29yZGluYXRlU3lzdGVtOlxuICAgICAgICAgIGxhc3RSZXF1ZXN0UGFyYW1ldGVycy5zcnMgPT09ICdFUFNHOjQzMjYnXG4gICAgICAgICAgICA/IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVFxuICAgICAgICAgICAgOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgaW1hZ2UsXG4gICAgICAgIHBpY2thYmxlOiB0aGlzLnByb3BzLnBpY2thYmxlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRGZWF0dXJlSW5mb1RleHQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB7bGFzdFJlcXVlc3RQYXJhbWV0ZXJzfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKGxhc3RSZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVbmRvY3VtZW50ZWQgbWV0aG9kXG4gICAgICBjb25zdCBmZWF0dXJlSW5mbyA9IGF3YWl0IHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UuZ2V0RmVhdHVyZUluZm9UZXh0Py4oe1xuICAgICAgICAuLi5sYXN0UmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgICAgIHF1ZXJ5X2xheWVyczogbGFzdFJlcXVlc3RQYXJhbWV0ZXJzLmxheWVycyxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgaW5mb19mb3JtYXQ6ICdhcHBsaWNhdGlvbi92bmQub2djLmdtbCdcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZlYXR1cmVJbmZvO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBfY3JlYXRlSW1hZ2VTb3VyY2UocHJvcHM6IFdNU0xheWVyUHJvcHMpOiBJbWFnZVNvdXJjZSB7XG4gICAgaWYgKHByb3BzLmRhdGEgaW5zdGFuY2VvZiBJbWFnZVNvdXJjZSkge1xuICAgICAgcmV0dXJuIHByb3BzLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG5ldyBXTVNJbWFnZVNvdXJjZShwcm9wcy5kYXRhLCB7XG4gICAgICAgIGxvYWRPcHRpb25zOiBwcm9wcy5sb2FkT3B0aW9uc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGltYWdlIHNvdXJjZSBpbiBwcm9wcy5kYXRhJyk7XG4gIH1cblxuICAvKiogUnVuIGEgZ2V0TWV0YWRhdGEgb24gdGhlIGltYWdlIHNlcnZpY2UgKi9cbiAgYXN5bmMgX2xvYWRNZXRhZGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7aW1hZ2VTb3VyY2V9ID0gdGhpcy5zdGF0ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zdGF0ZS5sb2FkQ291bnRlcisrO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBpbWFnZVNvdXJjZS5nZXRNZXRhZGF0YSgpO1xuXG4gICAgICAvLyBJZiBhIHJlcXVlc3QgdGFrZXMgYSBsb25nIHRpbWUsIGl0IG1heSBubyBsb25nZXIgYmUgZXhwZWN0ZWRcbiAgICAgIGlmICh0aGlzLnN0YXRlLmltYWdlU291cmNlID09PSBpbWFnZVNvdXJjZSkge1xuICAgICAgICB0aGlzLmdldEN1cnJlbnRMYXllcigpPy5wcm9wcy5vbk1ldGFkYXRhTG9hZChtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uTWV0YWRhdGFMb2FkRXJyb3IoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgLyoqIExvYWQgYW4gaW1hZ2UgKi9cbiAgYXN5bmMgbG9hZEltYWdlKHZpZXdwb3J0OiBWaWV3cG9ydCwgX3JlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2xheWVycywgc2VydmljZVR5cGUsIHRyYW5zcGFyZW50fSA9IHRoaXMucHJvcHM7XG5cbiAgICAvLyBUT0RPIC0gbW92ZSB0byBJbWFnZVNvdXJjZT9cbiAgICBpZiAoc2VydmljZVR5cGUgPT09ICd3bXMnICYmIGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBnbG9iZSBtb2RlIGRlY2sncyBHbG9iZVZpZXdwb3J0LmdldEJvdW5kcygpIG9ubHkgdW5wcm9qZWN0cyA0IGVkZ2VcbiAgICAvLyBtaWRwb2ludHMgYW5kIHRha2VzIHRoZWlyIG1pbi9tYXguIFRoYXQgbWlzc2VzIHRoZSBzY3JlZW4gY29ybmVycywgdGhlXG4gICAgLy8gY3VydmVkIGxpbWIsIGFuZCAobW9zdCBpbXBvcnRhbnRseSkgdGhlIGNhc2Ugd2hlcmUgYSBwb2xlIGlzIGluIHZpZXcgd2hlblxuICAgIC8vIGxvb2tpbmcgZnJvbSBhIGhpZ2ggbGF0aXR1ZGUg4oCUIHdoZXJlIGV2ZXJ5IG1lcmlkaWFuIGFuZCBwYXJ0IG9mIHRoZSBmYXJcbiAgICAvLyBoZW1pc3BoZXJlIGJlY29tZSB2aXNpYmxlLiBDb21wdXRlIGEgZnVsbGVyIHZpc2libGUgYm91bmRpbmcgYm94IGluc3RlYWQgc29cbiAgICAvLyB0aGUgcmVxdWVzdGVkIFdNUyBpbWFnZSBjb3ZlcnMgZXZlcnl0aGluZyBvbiBzY3JlZW4uXG4gICAgY29uc3QgYm91bmRzID0gdmlld3BvcnQucmVzb2x1dGlvblxuICAgICAgPyBnZXRHbG9iZVZpc2libGVCb3VuZHModmlld3BvcnQpXG4gICAgICA6IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuICAgIGxldCB7c3JzfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHNycyA9PT0gJ2F1dG8nKSB7XG4gICAgICAvLyBCaXRtYXBMYXllciBvbmx5IHN1cHBvcnRzIExOR0xBVCBvciBDQVJURVNJQU4gKFdlYi1NZXJjYXRvcilcbiAgICAgIHNycyA9IHZpZXdwb3J0LnJlc29sdXRpb24gPyAnRVBTRzo0MzI2JyA6ICdFUFNHOjM4NTcnO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICBiYm94OiBib3VuZHMsXG4gICAgICBib3VuZGluZ0JveDogW1xuICAgICAgICBbYm91bmRzWzBdLCBib3VuZHNbMV1dLFxuICAgICAgICBbYm91bmRzWzJdLCBib3VuZHNbM11dXG4gICAgICBdIGFzIFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICAgIGxheWVycyxcbiAgICAgIHNycyxcbiAgICAgIHRyYW5zcGFyZW50XG4gICAgfTtcbiAgICBpZiAoc3JzID09PSAnRVBTRzozODU3Jykge1xuICAgICAgY29uc3QgW21pblgsIG1pblldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMF0sIGJvdW5kc1sxXV0pO1xuICAgICAgY29uc3QgW21heFgsIG1heFldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMl0sIGJvdW5kc1szXV0pO1xuICAgICAgcmVxdWVzdFBhcmFtcy5ib3VuZGluZ0JveCA9IFtcbiAgICAgICAgW21pblgsIG1pblldLFxuICAgICAgICBbbWF4WCwgbWF4WV1cbiAgICAgIF07XG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICByZXF1ZXN0UGFyYW1zLmJib3ggPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gICAgfVxuXG4gICAgLy8gU2tpcCByZXF1ZXN0IGlmIHBhcmFtZXRlcnMgaGF2ZW4ndCBtZWFuaW5nZnVsbHkgY2hhbmdlZFxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUubGFzdFJlcXVlc3RQYXJhbWV0ZXJzICYmXG4gICAgICB0aGlzLl9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwodGhpcy5zdGF0ZS5sYXN0UmVxdWVzdFBhcmFtZXRlcnMsIHJlcXVlc3RQYXJhbXMpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2tpcCByZXF1ZXN0IGlmIHRoZSBuZXcgdmlldyBpcyBhbHJlYWR5IGZ1bGx5IGNvdmVyZWQgYnkgdGhlIGxhc3QgcmVxdWVzdGVkXG4gICAgLy8gaW1hZ2UgYXQgY29tcGFyYWJsZSByZXNvbHV0aW9uLiBUaGlzIGlzIHZlcnkgY29tbW9uIHdoaWxlIHBhbm5pbmcgKGFuZCBzbWFsbFxuICAgIC8vIHpvb20taW5zKSB3aXRoaW4gYSBsYXJnZXIsIHJlY2VudGx5IGZldGNoZWQgZXh0ZW50IOKAlCBlLmcuIG9uIHRoZSBnbG9iZSBhXG4gICAgLy8gc2luZ2xlIHJlcXVlc3QgY2FuIGNvdmVyIHRoZSB3aG9sZSB2aXNpYmxlIGhlbWlzcGhlcmUsIHNvIHJvdGF0aW5nIGFyb3VuZCBpdFxuICAgIC8vIHNob3VsZG4ndCBoaXQgdGhlIG5ldHdvcmsgYWdhaW4uIFRoZSBleGlzdGluZyBpbWFnZSBpcyBzaW1wbHkgcmVwb3NpdGlvbmVkIGJ5XG4gICAgLy8gdGhlIEJpdG1hcExheWVyLiBXZSBzdGlsbCByZWZldGNoIG9uY2UgdGhlIHVzZXIgem9vbXMgaW4gZW5vdWdoIHRoYXQgdGhlXG4gICAgLy8gY2FjaGVkIGltYWdlIHdvdWxkIGJlIHZpc2libHkgc3RyZXRjaGVkIChzZWUgQ09WRVJBR0VfUkVGRVRDSF9aT09NX0ZBQ1RPUikuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5sYXN0UmVxdWVzdFBhcmFtZXRlcnMgJiZcbiAgICAgIHRoaXMuX2lzVmlld0NvdmVyZWRCeUxhc3RSZXF1ZXN0KHRoaXMuc3RhdGUubGFzdFJlcXVlc3RQYXJhbWV0ZXJzLCByZXF1ZXN0UGFyYW1zKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIER1cmluZyB2aWRlbyBleHBvcnQsIHRocm90dGxlIHpvb20taW4gcmVxdWVzdHMgdG8gb25seSBmaXJlIG9uIHpvb20gbGV2ZWwgY3Jvc3NpbmdzLlxuICAgIC8vIFRoZSBleGlzdGluZyBpbWFnZSBpcyBzdHJldGNoZWQgYnkgdGhlIEJpdG1hcExheWVyIHVudGlsIHRoZSBuZXh0IGxldmVsIGlzIHJlYWNoZWQuXG4gICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgY29uc3QgaXNFeHBvcnRpbmcgPSBnbD8uZ2V0Q29udGV4dEF0dHJpYnV0ZXM/LigpPy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XG4gICAgaWYgKGlzRXhwb3J0aW5nICYmIHRoaXMuc3RhdGUuX2xhc3RSZXF1ZXN0Wm9vbSA+PSAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50Wm9vbSA9IHZpZXdwb3J0Lnpvb207XG4gICAgICBjb25zdCBsYXN0Wm9vbSA9IHRoaXMuc3RhdGUuX2xhc3RSZXF1ZXN0Wm9vbTtcbiAgICAgIGNvbnN0IGlzWm9vbWluZ0luID0gY3VycmVudFpvb20gPiBsYXN0Wm9vbTtcbiAgICAgIGlmIChpc1pvb21pbmdJbiAmJiBNYXRoLmZsb29yKGN1cnJlbnRab29tKSA9PT0gTWF0aC5mbG9vcihsYXN0Wm9vbSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsYXN0UmVxdWVzdFBhcmFtZXRlcnMgQkVGT1JFIG1ha2luZyB0aGUgcmVxdWVzdCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIC8vIHdoZXJlIG11bHRpcGxlIGRlYm91bmNlZCBjYWxscyBzZWUgdGhlIHNhbWUgb2xkIHBhcmFtZXRlcnMgYW5kIGFsbCBwcm9jZWVkXG4gICAgdGhpcy5zdGF0ZS5sYXN0UmVxdWVzdFBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1zO1xuICAgIHRoaXMuc3RhdGUuX2xhc3RSZXF1ZXN0Wm9vbSA9IHZpZXdwb3J0Lnpvb207XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdldFJlcXVlc3RJZCgpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyKys7XG4gICAgICB0aGlzLnByb3BzLm9uSW1hZ2VMb2FkU3RhcnQocmVxdWVzdElkKTtcblxuICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLnN0YXRlLmltYWdlU291cmNlLmdldEltYWdlKHJlcXVlc3RQYXJhbXMpO1xuXG4gICAgICAvLyBJZiBhIHJlcXVlc3QgdGFrZXMgYSBsb25nIHRpbWUsIGxhdGVyIHJlcXVlc3RzIG1heSBoYXZlIGFscmVhZHkgbG9hZGVkLlxuICAgICAgaWYgKHRoaXMuc3RhdGUubGFzdFJlcXVlc3RJZCA8IHJlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLmdldEN1cnJlbnRMYXllcigpPy5wcm9wcy5vbkltYWdlTG9hZChyZXF1ZXN0SWQpO1xuICAgICAgICAvLyBOb3QgdHlwZSBzYWZlLi4uXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICBsYXN0UmVxdWVzdElkOiByZXF1ZXN0SWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkVycm9yPy4oZXJyb3IgYXMgRXJyb3IsIHRoaXMpO1xuICAgICAgdGhpcy5nZXRDdXJyZW50TGF5ZXIoKT8ucHJvcHMub25JbWFnZUxvYWRFcnJvcihyZXF1ZXN0SWQsIGVycm9yIGFzIEVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGF0ZS5sb2FkQ291bnRlci0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhFTFBFUlNcblxuICAvKiogR2xvYmFsIGNvdW50ZXIgZm9yIGlzc3VpbmcgdW5pcXVlIHJlcXVlc3QgaWRzICovXG4gIHByaXZhdGUgZ2V0UmVxdWVzdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuX25leHRSZXF1ZXN0SWQrKztcbiAgfVxuXG4gIC8qKiBSdW5zIGFuIGFjdGlvbiBpbiB0aGUgZnV0dXJlLCBjYW5jZWxzIGl0IGlmIHRoZSBuZXcgYWN0aW9uIGlzIGlzc3VlZCBiZWZvcmUgaXQgZXhlY3V0ZXMgKi9cbiAgcHJpdmF0ZSBkZWJvdW5jZShmbjogKCkgPT4gdm9pZCwgbXMgPSA1MDApOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5zdGF0ZS5fdGltZW91dElkKTtcbiAgICB0aGlzLnN0YXRlLl90aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGZuKCksIG1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgYG5leHRgIHZpZXcgaXMgZnVsbHkgaW5zaWRlIHRoZSBgcHJldmAgKGxhc3QgcmVxdWVzdGVkKVxuICAgKiBleHRlbnQgQU5EIG5vdCBtZWFuaW5nZnVsbHkgaGlnaGVyIHJlc29sdXRpb24sIHNvIHRoZSBjYWNoZWQgaW1hZ2UgYWxyZWFkeVxuICAgKiBjb3ZlcnMgdGhlIHNjcmVlbiBhbmQgbm8gbmV3IHJlcXVlc3QgaXMgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNWaWV3Q292ZXJlZEJ5TGFzdFJlcXVlc3QocHJldjogYW55LCBuZXh0OiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDb3ZlcmFnZSBvbmx5IG1ha2VzIHNlbnNlIHdpdGhpbiB0aGUgc2FtZSBwcm9qZWN0aW9uIC8gZGF0YXNldCAvIGNhbnZhcyBzaXplLlxuICAgIGlmIChcbiAgICAgIHByZXYuc3JzICE9PSBuZXh0LnNycyB8fFxuICAgICAgcHJldi53aWR0aCAhPT0gbmV4dC53aWR0aCB8fFxuICAgICAgcHJldi5oZWlnaHQgIT09IG5leHQuaGVpZ2h0IHx8XG4gICAgICBwcmV2LnRyYW5zcGFyZW50ICE9PSBuZXh0LnRyYW5zcGFyZW50IHx8XG4gICAgICAhZGVlcEVxdWFsKHByZXYubGF5ZXJzLCBuZXh0LmxheWVycylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwID0gcHJldi5iYm94O1xuICAgIGNvbnN0IG4gPSBuZXh0LmJib3g7XG4gICAgaWYgKCFwIHx8ICFuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhlIG5ldyBiYm94IGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIHByZXZpb3VzbHkgcmVxdWVzdGVkIGJib3g/XG4gICAgY29uc3QgY29udGFpbmVkID0gblswXSA+PSBwWzBdICYmIG5bMV0gPj0gcFsxXSAmJiBuWzJdIDw9IHBbMl0gJiYgblszXSA8PSBwWzNdO1xuICAgIGlmICghY29udGFpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gR3JvdW5kIHJlc29sdXRpb24gaXMgcHJvcG9ydGlvbmFsIHRvIGJib3ggc3BhbiAvIHBpeGVsIGNvdW50LiBUaGUgZ3VhcmRcbiAgICAvLyBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgcHJldiBhbmQgbmV4dCBzaGFyZSB0aGUgc2FtZSB3aWR0aC9oZWlnaHQsIHNvIGVxdWFsXG4gICAgLy8gcGl4ZWwgY291bnRzIGxldCB1cyBjb21wYXJlIHNwYW5zIGRpcmVjdGx5LiBPbmx5IHNraXAgd2hpbGUgdGhlIG5ldyB2aWV3XG4gICAgLy8gaXNuJ3QgbXVjaCBmaW5lciB0aGFuIHdoYXQgd2UgYWxyZWFkeSBmZXRjaGVkLCBvdGhlcndpc2UgdGhlIGNhY2hlZCBpbWFnZVxuICAgIC8vIHdvdWxkIGxvb2sgc3RyZXRjaGVkL2JsdXJyeS5cbiAgICBjb25zdCBwcmV2U3BhblggPSBwWzJdIC0gcFswXTtcbiAgICBjb25zdCBuZXh0U3BhblggPSBuWzJdIC0gblswXTtcbiAgICBjb25zdCBwcmV2U3BhblkgPSBwWzNdIC0gcFsxXTtcbiAgICBjb25zdCBuZXh0U3BhblkgPSBuWzNdIC0gblsxXTtcblxuICAgIHJldHVybiAoXG4gICAgICBuZXh0U3BhblggPj0gcHJldlNwYW5YIC8gQ09WRVJBR0VfUkVGRVRDSF9aT09NX0ZBQ1RPUiAmJlxuICAgICAgbmV4dFNwYW5ZID49IHByZXZTcGFuWSAvIENPVkVSQUdFX1JFRkVUQ0hfWk9PTV9GQUNUT1JcbiAgICApO1xuICB9XG5cbiAgLyoqIENvbXBhcmUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGRldGVybWluZSBpZiBhIG5ldyByZXF1ZXN0IGlzIG5lZWRlZCAqL1xuICBwcml2YXRlIF9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwocHJldjogYW55LCBuZXh0OiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDb21wYXJlIGRpbWVuc2lvbnNcbiAgICBpZiAocHJldi53aWR0aCAhPT0gbmV4dC53aWR0aCB8fCBwcmV2LmhlaWdodCAhPT0gbmV4dC5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIFNSU1xuICAgIGlmIChwcmV2LnNycyAhPT0gbmV4dC5zcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIGxheWVyc1xuICAgIGlmICghZGVlcEVxdWFsKHByZXYubGF5ZXJzLCBuZXh0LmxheWVycykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIHRyYW5zcGFyZW50XG4gICAgaWYgKHByZXYudHJhbnNwYXJlbnQgIT09IG5leHQudHJhbnNwYXJlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIGJvdW5kcyB3aXRoIHRvbGVyYW5jZSBmb3IgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uXG4gICAgY29uc3QgdG9sZXJhbmNlID0gMWUtMTA7XG4gICAgY29uc3QgcHJldkJib3ggPSBwcmV2LmJib3g7XG4gICAgY29uc3QgbmV4dEJib3ggPSBuZXh0LmJib3g7XG5cbiAgICBpZiAocHJldkJib3ggJiYgbmV4dEJib3gpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhwcmV2QmJveFtpXSAtIG5leHRCYm94W2ldKSA+IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgW21pbkxuZywgbWluTGF0LCBtYXhMbmcsIG1heExhdF0gYm91bmRpbmcgYm94IG9mIHRoZSBwYXJ0IG9mIHRoZVxuICogZ2xvYmUgdGhhdCBpcyBhY3R1YWxseSB2aXNpYmxlIG9uIHNjcmVlbi5cbiAqXG4gKiBVbmxpa2UgYEdsb2JlVmlld3BvcnQuZ2V0Qm91bmRzKClgICg0IGVkZ2UgbWlkcG9pbnRzKSwgdGhpcyBzYW1wbGVzIGEgZ3JpZCBvZlxuICogc2NyZWVuIHBpeGVscywgdW5wcm9qZWN0cyBlYWNoIG9udG8gdGhlIHNwaGVyZSAoZGVjay5nbCBjbGFtcHMgcmF5cyB0aGF0IG1pc3NcbiAqIHRoZSBnbG9iZSB0byB0aGUgc2lsaG91ZXR0ZS9saW1iLCB3aGljaCBpcyBleGFjdGx5IHRoZSBib3VuZGFyeSB3ZSB3YW50KSwgYW5kXG4gKiB0YWtlcyB0aGUgZXh0ZW50LiBJdCBhZGRpdGlvbmFsbHkgZGV0ZWN0cyB3aGVuIGEgcG9sZSBpcyBpbiB2aWV3OiBhdCBhIHBvbGUgYWxsXG4gKiBtZXJpZGlhbnMgY29udmVyZ2UsIHNvIHdlIHdpZGVuIHRoZSBib3ggdG8gdGhlIGZ1bGwgbG9uZ2l0dWRlIHJhbmdlIGFuZCBleHRlbmRcbiAqIHRoZSBsYXRpdHVkZSB1cCB0byB0aGUgcG9sZSwgd2hpY2ggaXMgd2hhdCBtYWtlcyB2aWV3aW5nIGZyb20gbmVhciBhIHBvbGVcbiAqIChzZWVpbmcgYWNyb3NzIHRvIHRoZSBmYXIgaGVtaXNwaGVyZSkgd29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JlVmlzaWJsZUJvdW5kcyh2aWV3cG9ydDogVmlld3BvcnQpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuICBjb25zdCBjZW50ZXJMbmcgPSAodmlld3BvcnQgYXMgYW55KS5sb25naXR1ZGUgPz8gMDtcblxuICBjb25zdCBTQU1QTEVTID0gODsgLy8gOHg4IGNlbGxzID0+IDl4OSA9IDgxIHNhbXBsZSBwb2ludHNcbiAgY29uc3QgbGF0czogbnVtYmVyW10gPSBbXTtcbiAgLy8gTG9uZ2l0dWRlcyB0cmFja2VkIGFzIHNpZ25lZCBvZmZzZXRzIGZyb20gdGhlIGNlbnRlciBsb25naXR1ZGUsIHVud3JhcHBlZCB0b1xuICAvLyAoLTE4MCwgMTgwXSwgc28gYW4gYW50aW1lcmlkaWFuLWNyb3NzaW5nIHZpZXcgc3RheXMgYSBjb250aWd1b3VzIHJhbmdlLlxuICBjb25zdCBsbmdPZmZzZXRzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IFNBTVBMRVM7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDw9IFNBTVBMRVM7IGorKykge1xuICAgICAgY29uc3QgcHggPSAoaSAvIFNBTVBMRVMpICogd2lkdGg7XG4gICAgICBjb25zdCBweSA9IChqIC8gU0FNUExFUykgKiBoZWlnaHQ7XG4gICAgICBjb25zdCBjb29yZCA9IHZpZXdwb3J0LnVucHJvamVjdChbcHgsIHB5XSk7XG4gICAgICBjb25zdCBsbmcgPSBjb29yZFswXTtcbiAgICAgIGNvbnN0IGxhdCA9IGNvb3JkWzFdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobG5nKSB8fCAhTnVtYmVyLmlzRmluaXRlKGxhdCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsYXRzLnB1c2gobGF0KTtcbiAgICAgIC8vIFdyYXAgdGhlIG9mZnNldCBpbnRvICgtMTgwLCAxODBdLlxuICAgICAgY29uc3Qgb2Zmc2V0ID0gKChsbmcgLSBjZW50ZXJMbmcgKyA1NDApICUgMzYwKSAtIDE4MDtcbiAgICAgIGxuZ09mZnNldHMucHVzaChvZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV4dHJlbWVseSBkZWdlbmVyYXRlIHZpZXdwb3J0OiBmYWxsIGJhY2sgdG8gZGVjaydzIGRlZmF1bHQuXG4gIGlmIChsYXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2aWV3cG9ydC5nZXRCb3VuZHMoKTtcbiAgfVxuXG4gIGxldCBtaW5MYXQgPSBNYXRoLm1pbiguLi5sYXRzKTtcbiAgbGV0IG1heExhdCA9IE1hdGgubWF4KC4uLmxhdHMpO1xuXG4gIGNvbnN0IG5vcnRoUG9sZVZpc2libGUgPSBpc0dsb2JlU3VyZmFjZVBvaW50VmlzaWJsZSh2aWV3cG9ydCwgOTApO1xuICBjb25zdCBzb3V0aFBvbGVWaXNpYmxlID0gaXNHbG9iZVN1cmZhY2VQb2ludFZpc2libGUodmlld3BvcnQsIC05MCk7XG5cbiAgbGV0IG1pbkxuZzogbnVtYmVyO1xuICBsZXQgbWF4TG5nOiBudW1iZXI7XG5cbiAgaWYgKG5vcnRoUG9sZVZpc2libGUgfHwgc291dGhQb2xlVmlzaWJsZSkge1xuICAgIC8vIEEgcG9sZSBpcyBvbiBzY3JlZW46IGV2ZXJ5IG1lcmlkaWFuIGlzIHZpc2libGUsIHNvIGNvdmVyIGFsbCBsb25naXR1ZGVzIGFuZFxuICAgIC8vIGV4dGVuZCBsYXRpdHVkZSB1cCB0byB0aGUgdmlzaWJsZSBwb2xlLlxuICAgIG1pbkxuZyA9IC0xODA7XG4gICAgbWF4TG5nID0gMTgwO1xuICAgIGlmIChub3J0aFBvbGVWaXNpYmxlKSB7XG4gICAgICBtYXhMYXQgPSA5MDtcbiAgICB9XG4gICAgaWYgKHNvdXRoUG9sZVZpc2libGUpIHtcbiAgICAgIG1pbkxhdCA9IC05MDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWluTG5nID0gY2VudGVyTG5nICsgTWF0aC5taW4oLi4ubG5nT2Zmc2V0cyk7XG4gICAgbWF4TG5nID0gY2VudGVyTG5nICsgTWF0aC5tYXgoLi4ubG5nT2Zmc2V0cyk7XG4gIH1cblxuICAvLyBQYWQgc2xpZ2h0bHkgc28gdGhlIGRpc2NyZXRlIHNhbXBsaW5nIGRvZXNuJ3QgY2xpcCB0aGUgdHJ1ZSBsaW1iLlxuICBjb25zdCBsYXRQYWQgPSBNYXRoLm1pbig1LCAobWF4TGF0IC0gbWluTGF0KSAqIDAuMDUgKyAwLjUpO1xuICBtaW5MYXQgPSBNYXRoLm1heCgtOTAsIG1pbkxhdCAtIGxhdFBhZCk7XG4gIG1heExhdCA9IE1hdGgubWluKDkwLCBtYXhMYXQgKyBsYXRQYWQpO1xuXG4gIGlmIChtYXhMbmcgLSBtaW5MbmcgPCAzNjApIHtcbiAgICBjb25zdCBsbmdQYWQgPSBNYXRoLm1pbig1LCAobWF4TG5nIC0gbWluTG5nKSAqIDAuMDUgKyAwLjUpO1xuICAgIG1pbkxuZyAtPSBsbmdQYWQ7XG4gICAgbWF4TG5nICs9IGxuZ1BhZDtcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIEVQU0c6NDMyNiByZWN0YW5nbGUgY2FuJ3QgY3Jvc3MgdGhlIGFudGltZXJpZGlhbiwgc28gaWYgdGhlIHZpc2libGVcbiAgLy8gc3BhbiB3cmFwcyBwYXN0IMKxMTgwIChvciBjb3ZlcnMgdGhlIHdob2xlIHdvcmxkKSByZXF1ZXN0IHRoZSBmdWxsIGxvbmdpdHVkZVxuICAvLyByYW5nZS4gVGhpcyBvdmVyLWNvdmVycyBvbmx5IG5lYXIgdGhlIGRhdGVsaW5lLCB3aGljaCBpcyBhbiBhY2NlcHRhYmxlXG4gIC8vIHRyYWRlLW9mZiBmb3IgYSB2YWxpZCwgZ2FwLWZyZWUgcmVxdWVzdC5cbiAgaWYgKG1heExuZyAtIG1pbkxuZyA+PSAzNjAgfHwgbWluTG5nIDwgLTE4MCB8fCBtYXhMbmcgPiAxODApIHtcbiAgICBtaW5MbmcgPSAtMTgwO1xuICAgIG1heExuZyA9IDE4MDtcbiAgfVxuXG4gIHJldHVybiBbbWluTG5nLCBtaW5MYXQsIG1heExuZywgbWF4TGF0XTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcG9pbnQgb24gdGhlIGdsb2JlIHN1cmZhY2UgYXQgdGhlIGdpdmVuIGxhdGl0dWRlIChsb25naXR1ZGUgaXNcbiAqIGlycmVsZXZhbnQgYXQgdGhlIHBvbGVzKSBpcyBib3RoIGZyb250LWZhY2luZyAobm90IG9jY2x1ZGVkIGJ5IHRoZSBnbG9iZSkgYW5kXG4gKiBpbnNpZGUgdGhlIHNjcmVlbi4gVXNlcyB0aGUgc3BoZXJlLWhvcml6b24gdGVzdCBpbiBkZWNrLmdsIGNvbW1vbiBzcGFjZTpcbiAqIGEgc3VyZmFjZSBwb2ludCBpcyBmcm9udC1mYWNpbmcgd2hlbiB0aGUgYW5nbGUgYmV0d2VlbiBpdHMgb3V0d2FyZCBub3JtYWwgYW5kXG4gKiB0aGUgY2FtZXJhIGRpcmVjdGlvbiBpcyB3aXRoaW4gdGhlIGhvcml6b24gaGFsZi1hbmdsZSwgaS5lLlxuICogICBkb3Qobm9ybWFsaXplKHBvaW50Q29tbW9uKSwgbm9ybWFsaXplKGNhbWVyYVBvc2l0aW9uKSkgPj0gcmFkaXVzIC8gY2FtZXJhRGlzdFxuICovXG5mdW5jdGlvbiBpc0dsb2JlU3VyZmFjZVBvaW50VmlzaWJsZSh2aWV3cG9ydDogVmlld3BvcnQsIGxhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuICBjb25zdCBwb2ludCA9IHZpZXdwb3J0LnByb2plY3RQb3NpdGlvbihbMCwgbGF0LCAwXSk7XG4gIGNvbnN0IGNhbWVyYSA9IHZpZXdwb3J0LmNhbWVyYVBvc2l0aW9uO1xuXG4gIGNvbnN0IHJQb2ludCA9IE1hdGguaHlwb3QocG9pbnRbMF0sIHBvaW50WzFdLCBwb2ludFsyXSk7XG4gIGNvbnN0IHJDYW0gPSBNYXRoLmh5cG90KGNhbWVyYVswXSwgY2FtZXJhWzFdLCBjYW1lcmFbMl0pO1xuICBpZiAoclBvaW50ID09PSAwIHx8IHJDYW0gPT09IDAgfHwgckNhbSA8PSByUG9pbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb3NTdXJmYWNlID1cbiAgICAocG9pbnRbMF0gKiBjYW1lcmFbMF0gKyBwb2ludFsxXSAqIGNhbWVyYVsxXSArIHBvaW50WzJdICogY2FtZXJhWzJdKSAvIChyUG9pbnQgKiByQ2FtKTtcbiAgY29uc3QgY29zSG9yaXpvbiA9IHJQb2ludCAvIHJDYW07XG4gIGlmIChjb3NTdXJmYWNlIDwgY29zSG9yaXpvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHNjcmVlbiA9IHZpZXdwb3J0LnByb2plY3QoWzAsIGxhdCwgMF0pO1xuICByZXR1cm4gc2NyZWVuWzBdID49IDAgJiYgc2NyZWVuWzBdIDw9IHdpZHRoICYmIHNjcmVlblsxXSA+PSAwICYmIHNjcmVlblsxXSA8PSBoZWlnaHQ7XG59XG5cbi8vIGh0dHBzOi8vZXBzZy5pby8zODU3XG4vLyArcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAgK2xvbl8wPTAgK3hfMD0wICt5XzA9MCAraz0xICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArd2t0ZXh0ICtub19kZWZzICt0eXBlPWNyc1xuY29uc3QgSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFID0gNjM3ODEzNyAqIE1hdGguUEk7XG5cbi8qKiBQcm9qZWN0cyBFUFNHOjQzMjYgdG8gRVBTRzozODU3XG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgcmVwbGFjZW1lbnQgb2YgcHJvajQuIFVzZSB0ZXN0cyB0byBlbnN1cmUgY29uZm9ybWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXR1M4NFRvUHNldWRvTWVyY2F0b3IoY29vcmQ6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbWVyY2F0b3IgPSBsbmdMYXRUb1dvcmxkKGNvb3JkKTtcbiAgbWVyY2F0b3JbMF0gPSAobWVyY2F0b3JbMF0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgbWVyY2F0b3JbMV0gPSAobWVyY2F0b3JbMV0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgcmV0dXJuIG1lcmNhdG9yO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBVUEsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBSCxPQUFBO0FBQTRELFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUs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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/deckgl-layers",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.3.0-alpha.3",
4
+ "version": "3.3.0-alpha.4",
5
5
  "description": "kepler.gl constants used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "scripts": {
22
22
  "build": "rm -fr dist && babel src --out-dir dist --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts'",
23
- "build:umd": "NODE_OPTIONS=--openssl-legacy-provider webpack --config ./webpack/umd.js --progress --env.prod",
23
+ "build:umd": "webpack --config ./webpack/umd.js --progress --env prod",
24
24
  "build:types": "tsc --project ./tsconfig.production.json",
25
25
  "prepublishOnly": "babel-node ../../scripts/license-header/bin --license ../../FILE-HEADER && yarn build && yarn build:types",
26
26
  "stab": "mkdir -p dist && touch dist/index.js"
@@ -34,9 +34,10 @@
34
34
  "@deck.gl/core": "^9.3.1",
35
35
  "@deck.gl/geo-layers": "^9.3.1",
36
36
  "@deck.gl/layers": "^9.3.1",
37
- "@kepler.gl/constants": "3.3.0-alpha.3",
38
- "@kepler.gl/types": "3.3.0-alpha.3",
39
- "@kepler.gl/utils": "3.3.0-alpha.3",
37
+ "@deck.gl/mesh-layers": "^9.3.1",
38
+ "@kepler.gl/constants": "3.3.0-alpha.4",
39
+ "@kepler.gl/types": "3.3.0-alpha.4",
40
+ "@kepler.gl/utils": "3.3.0-alpha.4",
40
41
  "@loaders.gl/wms": "4.4.1",
41
42
  "@luma.gl/constants": "^9.3.2",
42
43
  "@luma.gl/core": "^9.3.2",
@@ -45,6 +46,8 @@
45
46
  "@luma.gl/webgl": "^9.3.2",
46
47
  "@mapbox/geo-viewport": "^0.4.1",
47
48
  "@mapbox/vector-tile": "^1.3.1",
49
+ "@math.gl/core": "^4.1.0",
50
+ "@math.gl/sun": "^4.1.0",
48
51
  "@math.gl/web-mercator": "^4.1.0",
49
52
  "@types/d3-array": "^2.8.0",
50
53
  "@types/geojson": "^7946.0.8",