UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

159 lines (155 loc) 24.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; exports.insertBefore = insertBefore; 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"); var _core2 = require("@luma.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 // @ts-nocheck This is a hack, don't check types // import {console as Console} from 'global/window'; /** * Inserts shader code before detected part. * @param {string} vs Original shader code. * @param {string} type Debug string. * @param {string} insertBeforeText Text chunk to insert before. * @param {string} textToInsert Text to insert. * @returns Modified shader code. */ function insertBefore(vs, type, insertBeforeText, textToInsert) { var at = vs.indexOf(insertBeforeText); if (at < 0) { // Console.error(`Cannot edit ${type} layer shader`); return vs; } return vs.slice(0, at) + textToInsert + vs.slice(at); } var CustomShadowModule = _core.shadow ? _objectSpread({}, _core.shadow) : undefined; /** * Custom shadow module * 1) Add u_outputUniformShadow uniform * 2) always produce full shadow when the uniform is set to true. */ CustomShadowModule.fs = insertBefore(CustomShadowModule.fs, 'custom shadow #1', 'uniform vec4 shadow_uColor;', 'uniform bool u_outputUniformShadow;'); CustomShadowModule.fs = insertBefore(CustomShadowModule.fs, 'custom shadow #1', 'vec4 rgbaDepth = texture2D(shadowMap, position.xy);', 'if(u_outputUniformShadow) return 1.0;'); CustomShadowModule.getUniforms = function () { var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var u = _core.shadow.getUniforms(opts, context); if (opts.outputUniformShadow !== undefined) { u.u_outputUniformShadow = opts.outputUniformShadow; } return u; }; /** * Custom LightingEffect * 1) adds CustomShadowModule * 2) pass outputUniformShadow as module parameters * 3) properly removes CustomShadowModule */ var CustomDeckLightingEffect = /*#__PURE__*/function (_LightingEffect) { function CustomDeckLightingEffect(props) { var _this; (0, _classCallCheck2["default"])(this, CustomDeckLightingEffect); _this = _callSuper(this, CustomDeckLightingEffect, [props]); _this.useOutputUniformShadow = false; return _this; } (0, _inherits2["default"])(CustomDeckLightingEffect, _LightingEffect); return (0, _createClass2["default"])(CustomDeckLightingEffect, [{ key: "preRender", value: function preRender(gl, _ref) { var layers = _ref.layers, layerFilter = _ref.layerFilter, viewports = _ref.viewports, onViewportActive = _ref.onViewportActive, views = _ref.views; if (!this.shadow) return; // create light matrix every frame to make sure always updated from light source this.shadowMatrices = this._calculateMatrices(); if (this.shadowPasses.length === 0) { this._createShadowPasses(gl); } if (!this.programManager) { this.programManager = _core2.ProgramManager.getDefaultProgramManager(gl); if (CustomShadowModule) { this.programManager.addDefaultModule(CustomShadowModule); } } if (!this.dummyShadowMap) { this.dummyShadowMap = new _core2.Texture2D(gl, { width: 1, height: 1 }); } for (var i = 0; i < this.shadowPasses.length; i++) { var shadowPass = this.shadowPasses[i]; shadowPass.render({ layers: layers, layerFilter: layerFilter, viewports: viewports, onViewportActive: onViewportActive, views: views, moduleParameters: { shadowLightId: i, dummyShadowMap: this.dummyShadowMap, shadowMatrices: this.shadowMatrices, useOutputUniformShadow: false } }); } } }, { key: "getModuleParameters", value: function getModuleParameters(layer) { var parameters = _superPropGet(CustomDeckLightingEffect, "getModuleParameters", this, 3)([layer]); parameters.outputUniformShadow = this.outputUniformShadow; return parameters; } }, { key: "cleanup", value: function cleanup() { var _iterator = _createForOfIteratorHelper(this.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.shadowPasses.length = 0; this.shadowMaps.length = 0; if (this.dummyShadowMap) { this.dummyShadowMap["delete"](); this.dummyShadowMap = null; } if (this.shadow && this.programManager) { this.programManager.removeDefaultModule(CustomShadowModule); this.programManager = null; } } }]); }(_core.LightingEffect); var _default = exports["default"] = CustomDeckLightingEffect; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfY29yZTIiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiaW5zZXJ0QmVmb3JlIiwidnMiLCJ0eXBlIiwiaW5zZXJ0QmVmb3JlVGV4dCIsInRleHRUb0luc2VydCIsImF0IiwiaW5kZXhPZiIsIkN1c3RvbVNoYWRvd01vZHVsZSIsInNoYWRvdyIsInVuZGVmaW5lZCIsImZzIiwiZ2V0VW5pZm9ybXMiLCJvcHRzIiwiY29udGV4dCIsIm91dHB1dFVuaWZvcm1TaGFkb3ciLCJ1X291dHB1dFVuaWZvcm1TaGFkb3ciLCJDdXN0b21EZWNrTGlnaHRpbmdFZmZlY3QiLCJfTGlnaHRpbmdFZmZlY3QiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInVzZU91dHB1dFVuaWZvcm1TaGFkb3ciLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInByZVJlbmRlciIsImdsIiwiX3JlZiIsImxheWVycyIsImxheWVyRmlsdGVyIiwidmlld3BvcnRzIiwib25WaWV3cG9ydEFjdGl2ZSIsInZpZXdzIiwic2hhZG93TWF0cmljZXMiLCJfY2FsY3VsYXRlTWF0cmljZXMiLCJzaGFkb3dQYXNzZXMiLCJfY3JlYXRlU2hhZG93UGFzc2VzIiwicHJvZ3JhbU1hbmFnZXIiLCJQcm9ncmFtTWFuYWdlciIsImdldERlZmF1bHRQcm9ncmFtTWFuYWdlciIsImFkZERlZmF1bHRNb2R1bGUiLCJkdW1teVNoYWRvd01hcCIsIlRleHR1cmUyRCIsIndpZHRoIiwiaGVpZ2h0IiwiaSIsInNoYWRvd1Bhc3MiLCJyZW5kZXIiLCJtb2R1bGVQYXJhbWV0ZXJzIiwic2hhZG93TGlnaHRJZCIsImdldE1vZHVsZVBhcmFtZXRlcnMiLCJsYXllciIsInBhcmFtZXRlcnMiLCJjbGVhbnVwIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJlcnIiLCJzaGFkb3dNYXBzIiwicmVtb3ZlRGVmYXVsdE1vZHVsZSIsIkxpZ2h0aW5nRWZmZWN0IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2N1c3RvbS1kZWNrLWxpZ2h0aW5nLWVmZmVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBAdHMtbm9jaGVjayBUaGlzIGlzIGEgaGFjaywgZG9uJ3QgY2hlY2sgdHlwZXNcblxuLy8gaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtMaWdodGluZ0VmZmVjdCwgc2hhZG93fSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7VGV4dHVyZTJELCBQcm9ncmFtTWFuYWdlcn0gZnJvbSAnQGx1bWEuZ2wvY29yZSc7XG5cbi8qKlxuICogSW5zZXJ0cyBzaGFkZXIgY29kZSBiZWZvcmUgZGV0ZWN0ZWQgcGFydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2cyBPcmlnaW5hbCBzaGFkZXIgY29kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIERlYnVnIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnNlcnRCZWZvcmVUZXh0IFRleHQgY2h1bmsgdG8gaW5zZXJ0IGJlZm9yZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0VG9JbnNlcnQgVGV4dCB0byBpbnNlcnQuXG4gKiBAcmV0dXJucyBNb2RpZmllZCBzaGFkZXIgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJlZm9yZSh2cywgdHlwZSwgaW5zZXJ0QmVmb3JlVGV4dCwgdGV4dFRvSW5zZXJ0KSB7XG4gIGNvbnN0IGF0ID0gdnMuaW5kZXhPZihpbnNlcnRCZWZvcmVUZXh0KTtcbiAgaWYgKGF0IDwgMCkge1xuICAgIC8vIENvbnNvbGUuZXJyb3IoYENhbm5vdCBlZGl0ICR7dHlwZX0gbGF5ZXIgc2hhZGVyYCk7XG4gICAgcmV0dXJuIHZzO1xuICB9XG5cbiAgcmV0dXJuIHZzLnNsaWNlKDAsIGF0KSArIHRleHRUb0luc2VydCArIHZzLnNsaWNlKGF0KTtcbn1cblxuY29uc3QgQ3VzdG9tU2hhZG93TW9kdWxlID0gc2hhZG93ID8gey4uLnNoYWRvd30gOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3VzdG9tIHNoYWRvdyBtb2R1bGVcbiAqIDEpIEFkZCB1X291dHB1dFVuaWZvcm1TaGFkb3cgdW5pZm9ybVxuICogMikgYWx3YXlzIHByb2R1Y2UgZnVsbCBzaGFkb3cgd2hlbiB0aGUgdW5pZm9ybSBpcyBzZXQgdG8gdHJ1ZS5cbiAqL1xuQ3VzdG9tU2hhZG93TW9kdWxlLmZzID0gaW5zZXJ0QmVmb3JlKFxuICBDdXN0b21TaGFkb3dNb2R1bGUuZnMsXG4gICdjdXN0b20gc2hhZG93ICMxJyxcbiAgJ3VuaWZvcm0gdmVjNCBzaGFkb3dfdUNvbG9yOycsXG4gICd1bmlmb3JtIGJvb2wgdV9vdXRwdXRVbmlmb3JtU2hhZG93Oydcbik7XG5cbkN1c3RvbVNoYWRvd01vZHVsZS5mcyA9IGluc2VydEJlZm9yZShcbiAgQ3VzdG9tU2hhZG93TW9kdWxlLmZzLFxuICAnY3VzdG9tIHNoYWRvdyAjMScsXG4gICd2ZWM0IHJnYmFEZXB0aCA9IHRleHR1cmUyRChzaGFkb3dNYXAsIHBvc2l0aW9uLnh5KTsnLFxuICAnaWYodV9vdXRwdXRVbmlmb3JtU2hhZG93KSByZXR1cm4gMS4wOydcbik7XG5cbkN1c3RvbVNoYWRvd01vZHVsZS5nZXRVbmlmb3JtcyA9IChvcHRzID0ge30sIGNvbnRleHQgPSB7fSkgPT4ge1xuICBjb25zdCB1ID0gc2hhZG93LmdldFVuaWZvcm1zKG9wdHMsIGNvbnRleHQpO1xuICBpZiAob3B0cy5vdXRwdXRVbmlmb3JtU2hhZG93ICE9PSB1bmRlZmluZWQpIHtcbiAgICB1LnVfb3V0cHV0VW5pZm9ybVNoYWRvdyA9IG9wdHMub3V0cHV0VW5pZm9ybVNoYWRvdztcbiAgfVxuICByZXR1cm4gdTtcbn07XG5cbi8qKlxuICogQ3VzdG9tIExpZ2h0aW5nRWZmZWN0XG4gKiAxKSBhZGRzIEN1c3RvbVNoYWRvd01vZHVsZVxuICogMikgcGFzcyBvdXRwdXRVbmlmb3JtU2hhZG93IGFzIG1vZHVsZSBwYXJhbWV0ZXJzXG4gKiAzKSBwcm9wZXJseSByZW1vdmVzIEN1c3RvbVNoYWRvd01vZHVsZVxuICovXG5jbGFzcyBDdXN0b21EZWNrTGlnaHRpbmdFZmZlY3QgZXh0ZW5kcyBMaWdodGluZ0VmZmVjdCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMudXNlT3V0cHV0VW5pZm9ybVNoYWRvdyA9IGZhbHNlO1xuICB9XG5cbiAgcHJlUmVuZGVyKGdsLCB7bGF5ZXJzLCBsYXllckZpbHRlciwgdmlld3BvcnRzLCBvblZpZXdwb3J0QWN0aXZlLCB2aWV3c30pIHtcbiAgICBpZiAoIXRoaXMuc2hhZG93KSByZXR1cm47XG5cbiAgICAvLyBjcmVhdGUgbGlnaHQgbWF0cml4IGV2ZXJ5IGZyYW1lIHRvIG1ha2Ugc3VyZSBhbHdheXMgdXBkYXRlZCBmcm9tIGxpZ2h0IHNvdXJjZVxuICAgIHRoaXMuc2hhZG93TWF0cmljZXMgPSB0aGlzLl9jYWxjdWxhdGVNYXRyaWNlcygpO1xuXG4gICAgaWYgKHRoaXMuc2hhZG93UGFzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fY3JlYXRlU2hhZG93UGFzc2VzKGdsKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb2dyYW1NYW5hZ2VyKSB7XG4gICAgICB0aGlzLnByb2dyYW1NYW5hZ2VyID0gUHJvZ3JhbU1hbmFnZXIuZ2V0RGVmYXVsdFByb2dyYW1NYW5hZ2VyKGdsKTtcbiAgICAgIGlmIChDdXN0b21TaGFkb3dNb2R1bGUpIHtcbiAgICAgICAgdGhpcy5wcm9ncmFtTWFuYWdlci5hZGREZWZhdWx0TW9kdWxlKEN1c3RvbVNoYWRvd01vZHVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmR1bW15U2hhZG93TWFwKSB7XG4gICAgICB0aGlzLmR1bW15U2hhZG93TWFwID0gbmV3IFRleHR1cmUyRChnbCwge1xuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgaGVpZ2h0OiAxXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hhZG93UGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzaGFkb3dQYXNzID0gdGhpcy5zaGFkb3dQYXNzZXNbaV07XG4gICAgICBzaGFkb3dQYXNzLnJlbmRlcih7XG4gICAgICAgIGxheWVycyxcbiAgICAgICAgbGF5ZXJGaWx0ZXIsXG4gICAgICAgIHZpZXdwb3J0cyxcbiAgICAgICAgb25WaWV3cG9ydEFjdGl2ZSxcbiAgICAgICAgdmlld3MsXG4gICAgICAgIG1vZHVsZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzaGFkb3dMaWdodElkOiBpLFxuICAgICAgICAgIGR1bW15U2hhZG93TWFwOiB0aGlzLmR1bW15U2hhZG93TWFwLFxuICAgICAgICAgIHNoYWRvd01hdHJpY2VzOiB0aGlzLnNoYWRvd01hdHJpY2VzLFxuICAgICAgICAgIHVzZU91dHB1dFVuaWZvcm1TaGFkb3c6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vZHVsZVBhcmFtZXRlcnMobGF5ZXIpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gc3VwZXIuZ2V0TW9kdWxlUGFyYW1ldGVycyhsYXllcik7XG4gICAgcGFyYW1ldGVycy5vdXRwdXRVbmlmb3JtU2hhZG93ID0gdGhpcy5vdXRwdXRVbmlmb3JtU2hhZG93O1xuICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICB9XG5cbiAgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IHNoYWRvd1Bhc3Mgb2YgdGhpcy5zaGFkb3dQYXNzZXMpIHtcbiAgICAgIHNoYWRvd1Bhc3MuZGVsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuc2hhZG93UGFzc2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zaGFkb3dNYXBzLmxlbmd0aCA9IDA7XG5cbiAgICBpZiAodGhpcy5kdW1teVNoYWRvd01hcCkge1xuICAgICAgdGhpcy5kdW1teVNoYWRvd01hcC5kZWxldGUoKTtcbiAgICAgIHRoaXMuZHVtbXlTaGFkb3dNYXAgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNoYWRvdyAmJiB0aGlzLnByb2dyYW1NYW5hZ2VyKSB7XG4gICAgICB0aGlzLnByb2dyYW1NYW5hZ2VyLnJlbW92ZURlZmF1bHRNb2R1bGUoQ3VzdG9tU2hhZG93TW9kdWxlKTtcbiAgICAgIHRoaXMucHJvZ3JhbU1hbmFnZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21EZWNrTGlnaHRpbmdFZmZlY3Q7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUF3RCxTQUFBRSwyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEseUJBQUFDLE1BQUEsSUFBQUgsQ0FBQSxDQUFBRyxNQUFBLENBQUFDLFFBQUEsS0FBQUosQ0FBQSxxQkFBQUUsQ0FBQSxRQUFBRyxLQUFBLENBQUFDLE9BQUEsQ0FBQU4sQ0FBQSxNQUFBRSxDQUFBLEdBQUFLLDJCQUFBLENBQUFQLENBQUEsTUFBQUMsQ0FBQSxJQUFBRCxDQUFBLHVCQUFBQSxDQUFBLENBQUFRLE1BQUEsSUFBQU4sQ0FBQSxLQUFBRixDQUFBLEdBQUFFLENBQUEsT0FBQU8sRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUEsRUFBQSxXQUFBSCxFQUFBLElBQUFULENBQUEsQ0FBQVEsTUFBQSxLQUFBSyxJQUFBLFdBQUFBLElBQUEsTUFBQUMsS0FBQSxFQUFBZCxDQUFBLENBQUFTLEVBQUEsVUFBQVIsQ0FBQSxXQUFBQSxFQUFBRCxDQUFBLFVBQUFBLENBQUEsS0FBQWUsQ0FBQSxFQUFBTCxDQUFBLGdCQUFBTSxTQUFBLGlKQUFBQyxDQUFBLEVBQUFDLENBQUEsT0FBQUMsQ0FBQSxnQkFBQVIsQ0FBQSxXQUFBQSxFQUFBLElBQUFULENBQUEsR0FBQUEsQ0FBQSxDQUFBa0IsSUFBQSxDQUFBcEIsQ0FBQSxNQUFBWSxDQUFBLFdBQUFBLEVBQUEsUUFBQVosQ0FBQSxHQUFBRSxDQUFBLENBQUFtQixJQUFBLFdBQUFILENBQUEsR0FBQWxCLENBQUEsQ0FBQWEsSUFBQSxFQUFBYixDQUFBLEtBQUFDLENBQUEsV0FBQUEsRUFBQUQsQ0FBQSxJ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