kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
145 lines (140 loc) • 24.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _core = require("@deck.gl/core");
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
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)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
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; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Exposes private members of LightingEffect that we need to access.
* These are runtime-accessible but TypeScript marks them as private.
*/
/** Extended shadow module props with our custom field. */
/**
* Insert text before a target string in shader source.
*/
function insertBefore(source, target, textToInsert) {
var at = source.indexOf(target);
if (at < 0) return source;
return source.slice(0, at) + textToInsert + source.slice(at);
}
/**
* Create a patched shadow module that adds `outputUniformShadow` to the
* shadow UBO. When true, `shadow_getShadowWeight` returns 1.0 (full
* uniform shadow) instead of sampling the shadow map. Used for nighttime
* rendering to avoid partial shadows from below.
*/
function createCustomShadowModule() {
if (!_core.shadow) return null;
var mod = _objectSpread({}, _core.shadow);
var uboField = ' float outputUniformShadow;\n';
mod.vs = insertBefore(mod.vs, '} shadow;', uboField);
mod.fs = insertBefore(mod.fs, '} shadow;', uboField);
mod.fs = insertBefore(mod.fs, 'vec4 rgbaDepth = texture(shadowMap, position.xy);', 'if (shadow.outputUniformShadow > 0.5) return 1.0;\n ');
mod.uniformTypes = _objectSpread(_objectSpread({}, _core.shadow.uniformTypes), {}, {
outputUniformShadow: 'f32'
});
var originalGetUniforms = _core.shadow.getUniforms;
mod.getUniforms = function () {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var u = originalGetUniforms(opts, context);
u.outputUniformShadow = opts.outputUniformShadow ? 1.0 : 0.0;
return u;
};
return mod;
}
var CustomShadowModule = createCustomShadowModule();
/**
* Custom LightingEffect for kepler.gl.
*
* Extends deck.gl's LightingEffect with:
* - A patched shadow module with `outputUniformShadow` for uniform shadow
* during nighttime (avoids partial shadows from below).
* - getShaderModuleProps override that always provides dummyShadowMap
* to prevent "Bad texture binding" errors when shadows are disabled.
*/
var CustomDeckLightingEffect = /*#__PURE__*/function (_LightingEffect) {
function CustomDeckLightingEffect(props) {
var _this;
(0, _classCallCheck2["default"])(this, CustomDeckLightingEffect);
_this = _callSuper(this, CustomDeckLightingEffect, [props]);
(0, _defineProperty2["default"])(_this, "outputUniformShadow", void 0);
_this.outputUniformShadow = false;
return _this;
}
(0, _inherits2["default"])(CustomDeckLightingEffect, _LightingEffect);
return (0, _createClass2["default"])(CustomDeckLightingEffect, [{
key: "_private",
get: function get() {
return this;
}
}, {
key: "setup",
value: function setup(context) {
this.context = context;
var device = context.device,
deck = context.deck;
if (this._private.shadow && !this._private.dummyShadowMap) {
this._private._createShadowPasses(device);
deck._addDefaultShaderModule(CustomShadowModule || _core.shadow);
this._private.dummyShadowMap = device.createTexture({
width: 1,
height: 1
});
}
}
}, {
key: "cleanup",
value: function cleanup(context) {
var _iterator = _createForOfIteratorHelper(this._private.shadowPasses),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var shadowPass = _step.value;
shadowPass["delete"]();
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
this._private.shadowPasses.length = 0;
if (this._private.dummyShadowMap) {
this._private.dummyShadowMap.destroy();
this._private.dummyShadowMap = null;
context.deck._removeDefaultShaderModule(CustomShadowModule || _core.shadow);
}
}
}, {
key: "getShaderModuleProps",
value: function getShaderModuleProps(layer, otherShaderModuleProps) {
var props = _superPropGet(CustomDeckLightingEffect, "getShaderModuleProps", this, 3)([layer, otherShaderModuleProps]);
if (props.shadow && !props.shadow.dummyShadowMap && this._private.dummyShadowMap) {
props.shadow.dummyShadowMap = this._private.dummyShadowMap;
}
if (props.shadow) {
props.shadow.outputUniformShadow = this.outputUniformShadow;
}
return props;
}
}]);
}(_core.LightingEffect);
var _default = exports["default"] = CustomDeckLightingEffect;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiaW5zZXJ0QmVmb3JlIiwic291cmNlIiwidGFyZ2V0IiwidGV4dFRvSW5zZXJ0IiwiYXQiLCJpbmRleE9mIiwiY3JlYXRlQ3VzdG9tU2hhZG93TW9kdWxlIiwic2hhZG93IiwibW9kIiwidWJvRmllbGQiLCJ2cyIsImZzIiwidW5pZm9ybVR5cGVzIiwib3V0cHV0VW5pZm9ybVNoYWRvdyIsIm9yaWdpbmFsR2V0VW5pZm9ybXMiLCJnZXRVbmlmb3JtcyIsIm9wdHMiLCJ1bmRlZmluZWQiLCJjb250ZXh0IiwiQ3VzdG9tU2hhZG93TW9kdWxlIiwiQ3VzdG9tRGVja0xpZ2h0aW5nRWZmZWN0IiwiX0xpZ2h0aW5nRWZmZWN0IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImdldCIsInNldHVwIiwiZGV2aWNlIiwiZGVjayIsIl9wcml2YXRlIiwiZHVtbXlTaGFkb3dNYXAiLCJfY3JlYXRlU2hhZG93UGFzc2VzIiwiX2FkZERlZmF1bHRTaGFkZXJNb2R1bGUiLCJjcmVhdGVUZXh0dXJlIiwid2lkdGgiLCJoZWlnaHQiLCJjbGVhbnVwIiwiX2l0ZXJhdG9yIiwic2hhZG93UGFzc2VzIiwiX3N0ZXAiLCJzaGFkb3dQYXNzIiwiZXJyIiwiZGVzdHJveSIsIl9yZW1vdmVEZWZhdWx0U2hhZGVyTW9kdWxlIiwiZ2V0U2hhZGVyTW9kdWxlUHJvcHMiLCJsYXllciIsIm90aGVyU2hhZGVyTW9kdWxlUHJvcHMiLCJMaWdodGluZ0VmZmVjdCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jdXN0b20tZGVjay1saWdodGluZy1lZmZlY3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtMaWdodGluZ0VmZmVjdCwgc2hhZG93fSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB0eXBlIHtUZXh0dXJlfSBmcm9tICdAbHVtYS5nbC9jb3JlJztcbmltcG9ydCB0eXBlIHtTaGFkZXJNb2R1bGV9IGZyb20gJ0BsdW1hLmdsL3NoYWRlcnRvb2xzJztcblxuLyoqXG4gKiBFeHBvc2VzIHByaXZhdGUgbWVtYmVycyBvZiBMaWdodGluZ0VmZmVjdCB0aGF0IHdlIG5lZWQgdG8gYWNjZXNzLlxuICogVGhlc2UgYXJlIHJ1bnRpbWUtYWNjZXNzaWJsZSBidXQgVHlwZVNjcmlwdCBtYXJrcyB0aGVtIGFzIHByaXZhdGUuXG4gKi9cbmludGVyZmFjZSBMaWdodGluZ0VmZmVjdFByaXZhdGUge1xuICBzaGFkb3c6IGJvb2xlYW47XG4gIHNoYWRvd1Bhc3Nlczoge2RlbGV0ZSgpOiB2b2lkfVtdO1xuICBkdW1teVNoYWRvd01hcDogVGV4dHVyZSB8IG51bGw7XG4gIF9jcmVhdGVTaGFkb3dQYXNzZXMoZGV2aWNlOiB1bmtub3duKTogdm9pZDtcbn1cblxuLyoqIEV4dGVuZGVkIHNoYWRvdyBtb2R1bGUgcHJvcHMgd2l0aCBvdXIgY3VzdG9tIGZpZWxkLiAqL1xuaW50ZXJmYWNlIEN1c3RvbVNoYWRvd1Byb3BzIHtcbiAgb3V0cHV0VW5pZm9ybVNoYWRvdz86IGJvb2xlYW47XG4gIGR1bW15U2hhZG93TWFwPzogVGV4dHVyZSB8IG51bGw7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogSW5zZXJ0IHRleHQgYmVmb3JlIGEgdGFyZ2V0IHN0cmluZyBpbiBzaGFkZXIgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nLCB0ZXh0VG9JbnNlcnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGF0ID0gc291cmNlLmluZGV4T2YodGFyZ2V0KTtcbiAgaWYgKGF0IDwgMCkgcmV0dXJuIHNvdXJjZTtcbiAgcmV0dXJuIHNvdXJjZS5zbGljZSgwLCBhdCkgKyB0ZXh0VG9JbnNlcnQgKyBzb3VyY2Uuc2xpY2UoYXQpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHBhdGNoZWQgc2hhZG93IG1vZHVsZSB0aGF0IGFkZHMgYG91dHB1dFVuaWZvcm1TaGFkb3dgIHRvIHRoZVxuICogc2hhZG93IFVCTy4gV2hlbiB0cnVlLCBgc2hhZG93X2dldFNoYWRvd1dlaWdodGAgcmV0dXJucyAxLjAgKGZ1bGxcbiAqIHVuaWZvcm0gc2hhZG93KSBpbnN0ZWFkIG9mIHNhbXBsaW5nIHRoZSBzaGFkb3cgbWFwLiBVc2VkIGZvciBuaWdodHRpbWVcbiAqIHJlbmRlcmluZyB0byBhdm9pZCBwYXJ0aWFsIHNoYWRvd3MgZnJvbSBiZWxvdy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3VzdG9tU2hhZG93TW9kdWxlKCk6IFNoYWRlck1vZHVsZSB8IG51bGwge1xuICBpZiAoIXNoYWRvdykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgbW9kID0gey4uLnNoYWRvd30gYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICBjb25zdCB1Ym9GaWVsZCA9ICcgIGZsb2F0IG91dHB1dFVuaWZvcm1TaGFkb3c7XFxuJztcbiAgbW9kLnZzID0gaW5zZXJ0QmVmb3JlKG1vZC52cywgJ30gc2hhZG93OycsIHVib0ZpZWxkKTtcbiAgbW9kLmZzID0gaW5zZXJ0QmVmb3JlKG1vZC5mcywgJ30gc2hhZG93OycsIHVib0ZpZWxkKTtcblxuICBtb2QuZnMgPSBpbnNlcnRCZWZvcmUoXG4gICAgbW9kLmZzLFxuICAgICd2ZWM0IHJnYmFEZXB0aCA9IHRleHR1cmUoc2hhZG93TWFwLCBwb3NpdGlvbi54eSk7JyxcbiAgICAnaWYgKHNoYWRvdy5vdXRwdXRVbmlmb3JtU2hhZG93ID4gMC41KSByZXR1cm4gMS4wO1xcbiAgJ1xuICApO1xuXG4gIG1vZC51bmlmb3JtVHlwZXMgPSB7XG4gICAgLi4uc2hhZG93LnVuaWZvcm1UeXBlcyxcbiAgICBvdXRwdXRVbmlmb3JtU2hhZG93OiAnZjMyJ1xuICB9O1xuXG4gIGNvbnN0IG9yaWdpbmFsR2V0VW5pZm9ybXMgPSBzaGFkb3cuZ2V0VW5pZm9ybXMgYXMgKFxuICAgIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHByZXZVbmlmb3JtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kLmdldFVuaWZvcm1zID0gKG9wdHM6IEN1c3RvbVNoYWRvd1Byb3BzID0ge30sIGNvbnRleHQgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHUgPSBvcmlnaW5hbEdldFVuaWZvcm1zKG9wdHMsIGNvbnRleHQpO1xuICAgIHUub3V0cHV0VW5pZm9ybVNoYWRvdyA9IG9wdHMub3V0cHV0VW5pZm9ybVNoYWRvdyA/IDEuMCA6IDAuMDtcbiAgICByZXR1cm4gdTtcbiAgfTtcblxuICByZXR1cm4gbW9kIGFzIHVua25vd24gYXMgU2hhZGVyTW9kdWxlO1xufVxuXG5jb25zdCBDdXN0b21TaGFkb3dNb2R1bGUgPSBjcmVhdGVDdXN0b21TaGFkb3dNb2R1bGUoKTtcblxuLyoqXG4gKiBDdXN0b20gTGlnaHRpbmdFZmZlY3QgZm9yIGtlcGxlci5nbC5cbiAqXG4gKiBFeHRlbmRzIGRlY2suZ2wncyBMaWdodGluZ0VmZmVjdCB3aXRoOlxuICogLSBBIHBhdGNoZWQgc2hhZG93IG1vZHVsZSB3aXRoIGBvdXRwdXRVbmlmb3JtU2hhZG93YCBmb3IgdW5pZm9ybSBzaGFkb3dcbiAqICAgZHVyaW5nIG5pZ2h0dGltZSAoYXZvaWRzIHBhcnRpYWwgc2hhZG93cyBmcm9tIGJlbG93KS5cbiAqIC0gZ2V0U2hhZGVyTW9kdWxlUHJvcHMgb3ZlcnJpZGUgdGhhdCBhbHdheXMgcHJvdmlkZXMgZHVtbXlTaGFkb3dNYXBcbiAqICAgdG8gcHJldmVudCBcIkJhZCB0ZXh0dXJlIGJpbmRpbmdcIiBlcnJvcnMgd2hlbiBzaGFkb3dzIGFyZSBkaXNhYmxlZC5cbiAqL1xuY2xhc3MgQ3VzdG9tRGVja0xpZ2h0aW5nRWZmZWN0IGV4dGVuZHMgTGlnaHRpbmdFZmZlY3Qge1xuICBvdXRwdXRVbmlmb3JtU2hhZG93OiBib29sZWFuO1xuXG4gIHByaXZhdGUgZ2V0IF9wcml2YXRlKCk6IExpZ2h0aW5nRWZmZWN0UHJpdmF0ZSB7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBMaWdodGluZ0VmZmVjdFByaXZhdGU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLm91dHB1dFVuaWZvcm1TaGFkb3cgPSBmYWxzZTtcbiAgfVxuXG4gIHNldHVwKGNvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIGNvbnN0IHtkZXZpY2UsIGRlY2t9ID0gY29udGV4dDtcbiAgICBpZiAodGhpcy5fcHJpdmF0ZS5zaGFkb3cgJiYgIXRoaXMuX3ByaXZhdGUuZHVtbXlTaGFkb3dNYXApIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuX2NyZWF0ZVNoYWRvd1Bhc3NlcyhkZXZpY2UpO1xuICAgICAgZGVjay5fYWRkRGVmYXVsdFNoYWRlck1vZHVsZShDdXN0b21TaGFkb3dNb2R1bGUgfHwgc2hhZG93KTtcbiAgICAgIHRoaXMuX3ByaXZhdGUuZHVtbXlTaGFkb3dNYXAgPSBkZXZpY2UuY3JlYXRlVGV4dHVyZSh7d2lkdGg6IDEsIGhlaWdodDogMX0pO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFudXAoY29udGV4dCkge1xuICAgIGZvciAoY29uc3Qgc2hhZG93UGFzcyBvZiB0aGlzLl9wcml2YXRlLnNoYWRvd1Bhc3Nlcykge1xuICAgICAgc2hhZG93UGFzcy5kZWxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5fcHJpdmF0ZS5zaGFkb3dQYXNzZXMubGVuZ3RoID0gMDtcbiAgICBpZiAodGhpcy5fcHJpdmF0ZS5kdW1teVNoYWRvd01hcCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5kdW1teVNoYWRvd01hcC5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9wcml2YXRlLmR1bW15U2hhZG93TWFwID0gbnVsbDtcbiAgICAgIGNvbnRleHQuZGVjay5fcmVtb3ZlRGVmYXVsdFNoYWRlck1vZHVsZShDdXN0b21TaGFkb3dNb2R1bGUgfHwgc2hhZG93KTtcbiAgICB9XG4gIH1cblxuICBnZXRTaGFkZXJNb2R1bGVQcm9wcyhsYXllciwgb3RoZXJTaGFkZXJNb2R1bGVQcm9wcykge1xuICAgIGNvbnN0IHByb3BzID0gc3VwZXIuZ2V0U2hhZGVyTW9kdWxlUHJvcHMobGF5ZXIsIG90aGVyU2hhZGVyTW9kdWxlUHJvcHMpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuc2hhZG93ICYmXG4gICAgICAhKHByb3BzLnNoYWRvdyBhcyBDdXN0b21TaGFkb3dQcm9wcykuZHVtbXlTaGFkb3dNYXAgJiZcbiAgICAgIHRoaXMuX3ByaXZhdGUuZHVtbXlTaGFkb3dNYXBcbiAgICApIHtcbiAgICAgIChwcm9wcy5zaGFkb3cgYXMgQ3VzdG9tU2hhZG93UHJvcHMpLmR1bW15U2hhZG93TWFwID0gdGhpcy5fcHJpdmF0ZS5kdW1teVNoYWRvd01hcDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuc2hhZG93KSB7XG4gICAgICAocHJvcHMuc2hhZG93IGFzIEN1c3RvbVNoYWRvd1Byb3BzKS5vdXRwdXRVbmlmb3JtU2hhZG93ID0gdGhpcy5vdXRwdXRVbmlmb3JtU2hhZG93O1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21EZWNrTGlnaHRpbmdFZmZlY3Q7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBQXFELFNBQUFDLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFB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