diff --git a/current/dist/openlayers/Common/Utils/SearchEngineUtils.d.ts.map b/current/dist/openlayers/Common/Utils/SearchEngineUtils.d.ts.map index 88999758f..ce90dea5d 100644 --- a/current/dist/openlayers/Common/Utils/SearchEngineUtils.d.ts.map +++ b/current/dist/openlayers/Common/Utils/SearchEngineUtils.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SearchEngineUtils.d.ts","sourceRoot":"","sources":["../../../../src/Common/Utils/SearchEngineUtils.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;IAwG6B,uDA4CxB"} \ No newline at end of file +{"version":3,"file":"SearchEngineUtils.d.ts","sourceRoot":"","sources":["../../../../src/Common/Utils/SearchEngineUtils.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;IAoG6B,uDA4CxB"} \ No newline at end of file diff --git a/current/dist/openlayers/GpPluginOpenLayers-map.css b/current/dist/openlayers/GpPluginOpenLayers-map.css index 08fec4192..7005c39cc 100644 --- a/current/dist/openlayers/GpPluginOpenLayers-map.css +++ b/current/dist/openlayers/GpPluginOpenLayers-map.css @@ -9,8 +9,8 @@ * @copyright copyright (c) IGN * @license CeCILL-B * @author IGN - * @version 3.4.3 - * @date 14/05/2024 + * @version 3.4.4 + * @date 05/06/2024 * */ diff --git a/current/dist/openlayers/GpPluginOpenLayers-map.js b/current/dist/openlayers/GpPluginOpenLayers-map.js index 71b17c862..919d9ab7f 100644 --- a/current/dist/openlayers/GpPluginOpenLayers-map.js +++ b/current/dist/openlayers/GpPluginOpenLayers-map.js @@ -9,8 +9,8 @@ * @copyright copyright (c) IGN * @license CeCILL-B * @author IGN - * @version 3.4.3 - * @date 14/05/2024 + * @version 3.4.4 + * @date 05/06/2024 * */ @@ -192,7 +192,7 @@ var Gp = /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global, Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Color\", function() { return Color; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ParsingError\", function() { return ParsingError$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ValidationError\", function() { return ValidationError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"composite\", function() { return composite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"convertFilter\", function() { return convertFilter$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"derefLayers\", function() { return derefLayers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"diff\", function() { return diffStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"expression\", function() { return expression$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"featureFilter\", function() { return createFilter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"format\", function() { return format; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"function\", function() { return styleFunction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"latest\", function() { return v8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"migrate\", function() { return migrate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v8\", function() { return v8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"validate\", function() { return validateStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"validateMapboxApiSupported\", function() { return validateMapboxApiSupported; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"visit\", function() { return visit; });\nfunction _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\nfunction _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _isNativeFunction(fn) { try { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; } catch (e) { return typeof fn === \"function\"; } }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar $version = 8;\nvar $root = {\n version: {\n required: true,\n type: \"enum\",\n values: [8],\n doc: \"Style specification version number. Must be 8.\",\n example: 8\n },\n name: {\n type: \"string\",\n doc: \"A human-readable name for the style.\",\n example: \"Bright\"\n },\n metadata: {\n type: \"*\",\n doc: \"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"\n },\n center: {\n type: \"array\",\n value: \"number\",\n doc: \"Default map center in longitude and latitude. The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: [-73.9749, 40.7736]\n },\n zoom: {\n type: \"number\",\n doc: \"Default zoom level. The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: 12.5\n },\n bearing: {\n type: \"number\",\n \"default\": 0,\n period: 360,\n units: \"degrees\",\n doc: \"Default bearing, in degrees. The bearing is the compass direction that is \\\"up\\\"; for example, a bearing of 90° orients the map so that east is up. This value will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: 29\n },\n pitch: {\n type: \"number\",\n \"default\": 0,\n units: \"degrees\",\n doc: \"Default pitch, in degrees. Zero is perpendicular to the surface, for a look straight down at the map, while a greater value like 60 looks ahead towards the horizon. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: 50\n },\n light: {\n type: \"light\",\n doc: \"The global light source.\",\n example: {\n anchor: \"viewport\",\n color: \"white\",\n intensity: 0.4\n }\n },\n terrain: {\n type: \"terrain\",\n doc: \"A global modifier that elevates layers and markers based on a DEM data source.\"\n },\n fog: {\n type: \"fog\",\n doc: \"A global effect that fades layers and markers based on their distance to the camera. The fog can be used to approximate the effect of atmosphere on distant objects and enhance the depth perception of the map when used with terrain or 3D features.\"\n },\n sources: {\n required: true,\n type: \"sources\",\n doc: \"Data source specifications.\",\n example: {\n \"mapbox-streets\": {\n type: \"vector\",\n url: \"mapbox://mapbox.mapbox-streets-v6\"\n }\n }\n },\n sprite: {\n type: \"string\",\n doc: \"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended. This property is required if any layer uses the `background-pattern`, `fill-pattern`, `line-pattern`, `fill-extrusion-pattern`, or `icon-image` properties. The URL must be absolute, containing the [scheme, authority and path components](https://en.wikipedia.org/wiki/URL#Syntax).\",\n example: \"mapbox://sprites/mapbox/bright-v8\"\n },\n glyphs: {\n type: \"string\",\n doc: \"A URL template for loading signed-distance-field glyph sets in PBF format. The URL must include `{fontstack}` and `{range}` tokens. This property is required if any layer uses the `text-field` layout property. The URL must be absolute, containing the [scheme, authority and path components](https://en.wikipedia.org/wiki/URL#Syntax).\",\n example: \"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\"\n },\n transition: {\n type: \"transition\",\n doc: \"A global transition definition to use as a default across properties, to be used for timing transitions between one value and the next when no property-specific transition is set. Collision-based symbol fading is controlled independently of the style's `transition` property.\",\n example: {\n duration: 300,\n delay: 0\n }\n },\n layers: {\n required: true,\n type: \"array\",\n value: \"layer\",\n doc: \"Layers will be drawn in the order of this array.\",\n example: [{\n id: \"water\",\n source: \"mapbox-streets\",\n \"source-layer\": \"water\",\n type: \"fill\",\n paint: {\n \"fill-color\": \"#00ffff\"\n }\n }]\n }\n};\nvar sources = {\n \"*\": {\n type: \"source\",\n doc: \"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For image and video sources, a URL must be provided. For GeoJSON sources, a URL or inline GeoJSON must be provided.\"\n }\n};\nvar source = [\"source_vector\", \"source_raster\", \"source_raster_dem\", \"source_geojson\", \"source_video\", \"source_image\"];\nvar source_vector = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n vector: {\n doc: \"A vector tile source.\"\n }\n },\n doc: \"The type of the source.\"\n },\n url: {\n type: \"string\",\n doc: \"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`.\"\n },\n tiles: {\n type: \"array\",\n value: \"string\",\n doc: \"An array of one or more tile source URLs, as in the TileJSON spec.\"\n },\n bounds: {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [-180, -85.051129, 180, 85.051129],\n doc: \"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL.\"\n },\n scheme: {\n type: \"enum\",\n values: {\n xyz: {\n doc: \"Slippy map tilenames scheme.\"\n },\n tms: {\n doc: \"OSGeo spec scheme.\"\n }\n },\n \"default\": \"xyz\",\n doc: \"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\"\n },\n minzoom: {\n type: \"number\",\n \"default\": 0,\n doc: \"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 22,\n doc: \"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n promoteId: {\n type: \"promoteId\",\n doc: \"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`. If specified as a string for a vector tile source, the same property is used across all its source layers.\"\n },\n \"volatile\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"A setting to determine whether a source's tiles are cached locally.\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.3.0\",\n ios: \"5.10.0\"\n }\n }\n },\n \"*\": {\n type: \"*\",\n doc: \"Other keys to configure the data source.\"\n }\n};\nvar source_raster = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n raster: {\n doc: \"A raster tile source.\"\n }\n },\n doc: \"The type of the source.\"\n },\n url: {\n type: \"string\",\n doc: \"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`.\"\n },\n tiles: {\n type: \"array\",\n value: \"string\",\n doc: \"An array of one or more tile source URLs, as in the TileJSON spec.\"\n },\n bounds: {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [-180, -85.051129, 180, 85.051129],\n doc: \"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL.\"\n },\n minzoom: {\n type: \"number\",\n \"default\": 0,\n doc: \"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 22,\n doc: \"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"\n },\n tileSize: {\n type: \"number\",\n \"default\": 512,\n units: \"pixels\",\n doc: \"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"\n },\n scheme: {\n type: \"enum\",\n values: {\n xyz: {\n doc: \"Slippy map tilenames scheme.\"\n },\n tms: {\n doc: \"OSGeo spec scheme.\"\n }\n },\n \"default\": \"xyz\",\n doc: \"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n \"volatile\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"A setting to determine whether a source's tiles are cached locally.\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.3.0\",\n ios: \"5.10.0\"\n }\n }\n },\n \"*\": {\n type: \"*\",\n doc: \"Other keys to configure the data source.\"\n }\n};\nvar source_raster_dem = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n \"raster-dem\": {\n doc: \"A RGB-encoded raster DEM source\"\n }\n },\n doc: \"The type of the source.\"\n },\n url: {\n type: \"string\",\n doc: \"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`.\"\n },\n tiles: {\n type: \"array\",\n value: \"string\",\n doc: \"An array of one or more tile source URLs, as in the TileJSON spec.\"\n },\n bounds: {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [-180, -85.051129, 180, 85.051129],\n doc: \"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL.\"\n },\n minzoom: {\n type: \"number\",\n \"default\": 0,\n doc: \"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 22,\n doc: \"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"\n },\n tileSize: {\n type: \"number\",\n \"default\": 512,\n units: \"pixels\",\n doc: \"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n encoding: {\n type: \"enum\",\n values: {\n terrarium: {\n doc: \"Terrarium format PNG tiles. See https://aws.amazon.com/es/public-datasets/terrain/ for more info.\"\n },\n mapbox: {\n doc: \"Mapbox Terrain RGB tiles. See https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb for more info.\"\n }\n },\n \"default\": \"mapbox\",\n doc: \"The encoding used by this source. Mapbox Terrain RGB is used by default\"\n },\n \"volatile\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"A setting to determine whether a source's tiles are cached locally.\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.3.0\",\n ios: \"5.10.0\"\n }\n }\n },\n \"*\": {\n type: \"*\",\n doc: \"Other keys to configure the data source.\"\n }\n};\nvar source_geojson = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n geojson: {\n doc: \"A GeoJSON data source.\"\n }\n },\n doc: \"The data type of the GeoJSON source.\"\n },\n data: {\n type: \"*\",\n doc: \"A URL to a GeoJSON file, or inline GeoJSON.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 18,\n doc: \"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels).\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n buffer: {\n type: \"number\",\n \"default\": 128,\n maximum: 512,\n minimum: 0,\n doc: \"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance.\"\n },\n filter: {\n type: \"*\",\n doc: \"An expression for filtering features prior to processing them for rendering.\"\n },\n tolerance: {\n type: \"number\",\n \"default\": 0.375,\n doc: \"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\"\n },\n cluster: {\n type: \"boolean\",\n \"default\": false,\n doc: \"If the data is a collection of point features, setting this to true clusters the points by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\\n * `cluster` Is `true` if the point is a cluster \\n * `cluster_id` A unqiue id for the cluster to be used in conjunction with the [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\\n * `point_count` Number of original points grouped into this cluster\\n * `point_count_abbreviated` An abbreviated point count\"\n },\n clusterRadius: {\n type: \"number\",\n \"default\": 50,\n minimum: 0,\n doc: \"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile.\"\n },\n clusterMaxZoom: {\n type: \"number\",\n doc: \"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\"\n },\n clusterMinPoints: {\n type: \"number\",\n doc: \"Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`.\"\n },\n clusterProperties: {\n type: \"*\",\n doc: \"An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from clustered points. Has the form `{\\\"property_name\\\": [operator, map_expression]}`. `operator` is any expression function that accepts at least 2 operands (e.g. `\\\"+\\\"` or `\\\"max\\\"`) — it accumulates the property value from clusters/points the cluster contains; `map_expression` produces the value of a single point.\\n\\nExample: `{\\\"sum\\\": [\\\"+\\\", [\\\"get\\\", \\\"scalerank\\\"]]}`.\\n\\nFor more advanced use cases, in place of `operator`, you can use a custom reduce expression that references a special `[\\\"accumulated\\\"]` value, e.g.:\\n`{\\\"sum\\\": [[\\\"+\\\", [\\\"accumulated\\\"], [\\\"get\\\", \\\"sum\\\"]], [\\\"get\\\", \\\"scalerank\\\"]]}`\"\n },\n lineMetrics: {\n type: \"boolean\",\n \"default\": false,\n doc: \"Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\"\n },\n generateId: {\n type: \"boolean\",\n \"default\": false,\n doc: \"Whether to generate ids for the geojson features. When enabled, the `feature.id` property will be auto assigned based on its index in the `features` array, over-writing any previous values.\"\n },\n promoteId: {\n type: \"promoteId\",\n doc: \"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`.\"\n }\n};\nvar source_video = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n video: {\n doc: \"A video data source.\"\n }\n },\n doc: \"The data type of the video source.\"\n },\n urls: {\n required: true,\n type: \"array\",\n value: \"string\",\n doc: \"URLs to video content in order of preferred format.\"\n },\n coordinates: {\n required: true,\n doc: \"Corners of video specified in longitude, latitude pairs.\",\n type: \"array\",\n length: 4,\n value: {\n type: \"array\",\n length: 2,\n value: \"number\",\n doc: \"A single longitude, latitude pair.\"\n }\n }\n};\nvar source_image = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n image: {\n doc: \"An image data source.\"\n }\n },\n doc: \"The data type of the image source.\"\n },\n url: {\n required: true,\n type: \"string\",\n doc: \"URL that points to an image.\"\n },\n coordinates: {\n required: true,\n doc: \"Corners of image specified in longitude, latitude pairs.\",\n type: \"array\",\n length: 4,\n value: {\n type: \"array\",\n length: 2,\n value: \"number\",\n doc: \"A single longitude, latitude pair.\"\n }\n }\n};\nvar layer = {\n id: {\n type: \"string\",\n doc: \"Unique layer name.\",\n required: true\n },\n type: {\n type: \"enum\",\n values: {\n fill: {\n doc: \"A filled polygon with an optional stroked border.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n line: {\n doc: \"A stroked line.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n symbol: {\n doc: \"An icon or a text label.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n circle: {\n doc: \"A filled circle.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n heatmap: {\n doc: \"A heatmap.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"fill-extrusion\": {\n doc: \"An extruded (3D) polygon.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n raster: {\n doc: \"Raster map textures such as satellite imagery.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n hillshade: {\n doc: \"Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n background: {\n doc: \"The background color or pattern of the map.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n sky: {\n doc: \"A spherical dome around the map that is always rendered behind all other layers.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n }\n },\n doc: \"Rendering type of this layer.\",\n required: true\n },\n metadata: {\n type: \"*\",\n doc: \"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"\n },\n source: {\n type: \"string\",\n doc: \"Name of a source description to be used for this layer. Required for all layer types except `background`.\"\n },\n \"source-layer\": {\n type: \"string\",\n doc: \"Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\"\n },\n minzoom: {\n type: \"number\",\n minimum: 0,\n maximum: 24,\n doc: \"The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\"\n },\n maxzoom: {\n type: \"number\",\n minimum: 0,\n maximum: 24,\n doc: \"The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\"\n },\n filter: {\n type: \"filter\",\n doc: \"A expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression is not supported in filter expressions.\"\n },\n layout: {\n type: \"layout\",\n doc: \"Layout properties for the layer.\"\n },\n paint: {\n type: \"paint\",\n doc: \"Default paint properties for this layer.\"\n }\n};\nvar layout = [\"layout_fill\", \"layout_line\", \"layout_circle\", \"layout_heatmap\", \"layout_fill-extrusion\", \"layout_symbol\", \"layout_raster\", \"layout_hillshade\", \"layout_background\", \"layout_sky\"];\nvar layout_background = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_sky = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_fill = {\n \"fill-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n },\n \"data-driven styling\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_circle = {\n \"circle-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.2.0\",\n android: \"9.2.0\",\n ios: \"5.9.0\",\n macos: \"0.16.0\"\n },\n \"data-driven styling\": {\n js: \"1.2.0\",\n android: \"9.2.0\",\n ios: \"5.9.0\",\n macos: \"0.16.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_heatmap = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_line = {\n \"line-cap\": {\n type: \"enum\",\n values: {\n butt: {\n doc: \"A cap with a squared-off end which is drawn to the exact endpoint of the line.\"\n },\n round: {\n doc: \"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"\n },\n square: {\n doc: \"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"\n }\n },\n \"default\": \"butt\",\n doc: \"The display of line endings.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"2.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-join\": {\n type: \"enum\",\n values: {\n bevel: {\n doc: \"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"\n },\n round: {\n doc: \"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"\n },\n miter: {\n doc: \"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\"\n }\n },\n \"default\": \"miter\",\n doc: \"The display of lines when joining.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-miter-limit\": {\n type: \"number\",\n \"default\": 2,\n doc: \"Used to automatically convert miter joins to bevel joins for sharp angles.\",\n requires: [{\n \"line-join\": \"miter\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-round-limit\": {\n type: \"number\",\n \"default\": 1.05,\n doc: \"Used to automatically convert round joins to miter joins for shallow angles.\",\n requires: [{\n \"line-join\": \"round\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n },\n \"data-driven styling\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_symbol = {\n \"symbol-placement\": {\n type: \"enum\",\n values: {\n point: {\n doc: \"The label is placed at the point where the geometry is located.\"\n },\n line: {\n doc: \"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\"\n },\n \"line-center\": {\n doc: \"The label is placed at the center of the line of the geometry. Can only be used on `LineString` and `Polygon` geometries. Note that a single feature in a vector tile may contain multiple line geometries.\"\n }\n },\n \"default\": \"point\",\n doc: \"Label placement relative to its geometry.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"`line-center` value\": {\n js: \"0.47.0\",\n android: \"6.4.0\",\n ios: \"4.3.0\",\n macos: \"0.10.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"symbol-spacing\": {\n type: \"number\",\n \"default\": 250,\n minimum: 1,\n units: \"pixels\",\n doc: \"Distance between two symbol anchors.\",\n requires: [{\n \"symbol-placement\": \"line\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"symbol-avoid-edges\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"symbol-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.53.0\",\n android: \"7.4.0\",\n ios: \"4.11.0\",\n macos: \"0.14.0\"\n },\n \"data-driven styling\": {\n js: \"0.53.0\",\n android: \"7.4.0\",\n ios: \"4.11.0\",\n macos: \"0.14.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"symbol-z-order\": {\n type: \"enum\",\n values: {\n auto: {\n doc: \"Sorts symbols by `symbol-sort-key` if set. Otherwise, sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`.\"\n },\n \"viewport-y\": {\n doc: \"Sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`.\"\n },\n source: {\n doc: \"Sorts symbols by `symbol-sort-key` if set. Otherwise, no sorting is applied; symbols are rendered in the same order as the source data.\"\n }\n },\n \"default\": \"auto\",\n doc: \"Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.49.0\",\n android: \"6.6.0\",\n ios: \"4.5.0\",\n macos: \"0.12.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-allow-overlap\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the icon will be visible even if it collides with other previously drawn symbols.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-ignore-placement\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, other symbols can be visible even if they collide with the icon.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-optional\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.\",\n requires: [\"icon-image\", \"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-rotation-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line` or `line-center`, aligns icon x-axes with the line.\"\n },\n viewport: {\n doc: \"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"\n },\n auto: {\n doc: \"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"In combination with `symbol-placement`, determines the rotation behavior of icons.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"`auto` value\": {\n js: \"0.25.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-size\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n units: \"factor of the original icon size\",\n doc: \"Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-text-fit\": {\n type: \"enum\",\n values: {\n none: {\n doc: \"The icon is displayed at its intrinsic aspect ratio.\"\n },\n width: {\n doc: \"The icon is scaled in the x-dimension to fit the width of the text.\"\n },\n height: {\n doc: \"The icon is scaled in the y-dimension to fit the height of the text.\"\n },\n both: {\n doc: \"The icon is scaled in both x- and y-dimensions.\"\n }\n },\n \"default\": \"none\",\n doc: \"Scales the icon to fit around the associated text.\",\n requires: [\"icon-image\", \"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n },\n \"stretchable icons\": {\n js: \"1.6.0\",\n android: \"9.2.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-text-fit-padding\": {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [0, 0, 0, 0],\n units: \"pixels\",\n doc: \"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.\",\n requires: [\"icon-image\", \"text-field\", {\n \"icon-text-fit\": [\"both\", \"width\", \"height\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-image\": {\n type: \"resolvedImage\",\n doc: \"Name of image in sprite to use for drawing an image background.\",\n tokens: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-rotate\": {\n type: \"number\",\n \"default\": 0,\n period: 360,\n units: \"degrees\",\n doc: \"Rotates the icon clockwise.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.21.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-padding\": {\n type: \"number\",\n \"default\": 2,\n minimum: 0,\n units: \"pixels\",\n doc: \"Size of the additional area around the icon bounding box used for detecting symbol collisions.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-keep-upright\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the icon may be flipped to prevent it from being rendered upside-down.\",\n requires: [\"icon-image\", {\n \"icon-rotation-alignment\": \"map\"\n }, {\n \"symbol-placement\": [\"line\", \"line-center\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-offset\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n doc: \"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-anchor\": {\n type: \"enum\",\n values: {\n center: {\n doc: \"The center of the icon is placed closest to the anchor.\"\n },\n left: {\n doc: \"The left side of the icon is placed closest to the anchor.\"\n },\n right: {\n doc: \"The right side of the icon is placed closest to the anchor.\"\n },\n top: {\n doc: \"The top of the icon is placed closest to the anchor.\"\n },\n bottom: {\n doc: \"The bottom of the icon is placed closest to the anchor.\"\n },\n \"top-left\": {\n doc: \"The top left corner of the icon is placed closest to the anchor.\"\n },\n \"top-right\": {\n doc: \"The top right corner of the icon is placed closest to the anchor.\"\n },\n \"bottom-left\": {\n doc: \"The bottom left corner of the icon is placed closest to the anchor.\"\n },\n \"bottom-right\": {\n doc: \"The bottom right corner of the icon is placed closest to the anchor.\"\n }\n },\n \"default\": \"center\",\n doc: \"Part of the icon placed closest to the anchor.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-pitch-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The icon is aligned to the plane of the map.\"\n },\n viewport: {\n doc: \"The icon is aligned to the plane of the viewport.\"\n },\n auto: {\n doc: \"Automatically matches the value of `icon-rotation-alignment`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"Orientation of icon when map is pitched.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-pitch-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The text is aligned to the plane of the map.\"\n },\n viewport: {\n doc: \"The text is aligned to the plane of the viewport.\"\n },\n auto: {\n doc: \"Automatically matches the value of `text-rotation-alignment`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"Orientation of text when map is pitched.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n },\n \"`auto` value\": {\n js: \"0.25.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-rotation-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line` or `line-center`, aligns text x-axes with the line.\"\n },\n viewport: {\n doc: \"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"\n },\n auto: {\n doc: \"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"`auto` value\": {\n js: \"0.25.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-field\": {\n type: \"formatted\",\n \"default\": \"\",\n tokens: true,\n doc: \"Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-font\": {\n type: \"array\",\n value: \"string\",\n \"default\": [\"Open Sans Regular\", \"Arial Unicode MS Regular\"],\n doc: \"Font stack to use for displaying text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-size\": {\n type: \"number\",\n \"default\": 16,\n minimum: 0,\n units: \"pixels\",\n doc: \"Font size.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-max-width\": {\n type: \"number\",\n \"default\": 10,\n minimum: 0,\n units: \"ems\",\n doc: \"The maximum line width for text wrapping.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-line-height\": {\n type: \"number\",\n \"default\": 1.2,\n units: \"ems\",\n doc: \"Text leading value for multi-line text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"2.3.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-letter-spacing\": {\n type: \"number\",\n \"default\": 0,\n units: \"ems\",\n doc: \"Text tracking amount.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-justify\": {\n type: \"enum\",\n values: {\n auto: {\n doc: \"The text is aligned towards the anchor position.\"\n },\n left: {\n doc: \"The text is aligned to the left.\"\n },\n center: {\n doc: \"The text is centered.\"\n },\n right: {\n doc: \"The text is aligned to the right.\"\n }\n },\n \"default\": \"center\",\n doc: \"Text justification options.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n },\n auto: {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-radial-offset\": {\n type: \"number\",\n units: \"ems\",\n \"default\": 0,\n doc: \"Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n },\n \"data-driven styling\": {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n }\n },\n requires: [\"text-field\"],\n \"property-type\": \"data-driven\",\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n }\n },\n \"text-variable-anchor\": {\n type: \"array\",\n value: \"enum\",\n values: {\n center: {\n doc: \"The center of the text is placed closest to the anchor.\"\n },\n left: {\n doc: \"The left side of the text is placed closest to the anchor.\"\n },\n right: {\n doc: \"The right side of the text is placed closest to the anchor.\"\n },\n top: {\n doc: \"The top of the text is placed closest to the anchor.\"\n },\n bottom: {\n doc: \"The bottom of the text is placed closest to the anchor.\"\n },\n \"top-left\": {\n doc: \"The top left corner of the text is placed closest to the anchor.\"\n },\n \"top-right\": {\n doc: \"The top right corner of the text is placed closest to the anchor.\"\n },\n \"bottom-left\": {\n doc: \"The bottom left corner of the text is placed closest to the anchor.\"\n },\n \"bottom-right\": {\n doc: \"The bottom right corner of the text is placed closest to the anchor.\"\n }\n },\n requires: [\"text-field\", {\n \"symbol-placement\": [\"point\"]\n }],\n doc: \"To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-anchor\": {\n type: \"enum\",\n values: {\n center: {\n doc: \"The center of the text is placed closest to the anchor.\"\n },\n left: {\n doc: \"The left side of the text is placed closest to the anchor.\"\n },\n right: {\n doc: \"The right side of the text is placed closest to the anchor.\"\n },\n top: {\n doc: \"The top of the text is placed closest to the anchor.\"\n },\n bottom: {\n doc: \"The bottom of the text is placed closest to the anchor.\"\n },\n \"top-left\": {\n doc: \"The top left corner of the text is placed closest to the anchor.\"\n },\n \"top-right\": {\n doc: \"The top right corner of the text is placed closest to the anchor.\"\n },\n \"bottom-left\": {\n doc: \"The bottom left corner of the text is placed closest to the anchor.\"\n },\n \"bottom-right\": {\n doc: \"The bottom right corner of the text is placed closest to the anchor.\"\n }\n },\n \"default\": \"center\",\n doc: \"Part of the text placed closest to the anchor.\",\n requires: [\"text-field\", {\n \"!\": \"text-variable-anchor\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-max-angle\": {\n type: \"number\",\n \"default\": 45,\n units: \"degrees\",\n doc: \"Maximum angle change between adjacent characters.\",\n requires: [\"text-field\", {\n \"symbol-placement\": [\"line\", \"line-center\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-writing-mode\": {\n type: \"array\",\n value: \"enum\",\n values: {\n horizontal: {\n doc: \"If a text's language supports horizontal writing mode, symbols with point placement would be laid out horizontally.\"\n },\n vertical: {\n doc: \"If a text's language supports vertical writing mode, symbols with point placement would be laid out vertically.\"\n }\n },\n doc: \"The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant.\",\n requires: [\"text-field\", {\n \"symbol-placement\": [\"point\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.3.0\",\n android: \"8.3.0\",\n ios: \"5.3.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-rotate\": {\n type: \"number\",\n \"default\": 0,\n period: 360,\n units: \"degrees\",\n doc: \"Rotates the text clockwise.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-padding\": {\n type: \"number\",\n \"default\": 2,\n minimum: 0,\n units: \"pixels\",\n doc: \"Size of the additional area around the text bounding box used for detecting symbol collisions.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-keep-upright\": {\n type: \"boolean\",\n \"default\": true,\n doc: \"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\",\n requires: [\"text-field\", {\n \"text-rotation-alignment\": \"map\"\n }, {\n \"symbol-placement\": [\"line\", \"line-center\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-transform\": {\n type: \"enum\",\n values: {\n none: {\n doc: \"The text is not altered.\"\n },\n uppercase: {\n doc: \"Forces all letters to be displayed in uppercase.\"\n },\n lowercase: {\n doc: \"Forces all letters to be displayed in lowercase.\"\n }\n },\n \"default\": \"none\",\n doc: \"Specifies how to capitalize text, similar to the CSS `text-transform` property.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-offset\": {\n type: \"array\",\n doc: \"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position.\",\n value: \"number\",\n units: \"ems\",\n length: 2,\n \"default\": [0, 0],\n requires: [\"text-field\", {\n \"!\": \"text-radial-offset\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-allow-overlap\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the text will be visible even if it collides with other previously drawn symbols.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-ignore-placement\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, other symbols can be visible even if they collide with the text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-optional\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.\",\n requires: [\"text-field\", \"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_raster = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_hillshade = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar filter = {\n type: \"array\",\n value: \"*\",\n doc: \"A filter selects specific features from a layer.\"\n};\nvar filter_operator = {\n type: \"enum\",\n values: {\n \"==\": {\n doc: \"`[\\\"==\\\", key, value]` equality: `feature[key] = value`\"\n },\n \"!=\": {\n doc: \"`[\\\"!=\\\", key, value]` inequality: `feature[key] ≠ value`\"\n },\n \">\": {\n doc: \"`[\\\">\\\", key, value]` greater than: `feature[key] > value`\"\n },\n \">=\": {\n doc: \"`[\\\">=\\\", key, value]` greater than or equal: `feature[key] ≥ value`\"\n },\n \"<\": {\n doc: \"`[\\\"<\\\", key, value]` less than: `feature[key] < value`\"\n },\n \"<=\": {\n doc: \"`[\\\"<=\\\", key, value]` less than or equal: `feature[key] ≤ value`\"\n },\n \"in\": {\n doc: \"`[\\\"in\\\", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`\"\n },\n \"!in\": {\n doc: \"`[\\\"!in\\\", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`\"\n },\n all: {\n doc: \"`[\\\"all\\\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`\"\n },\n any: {\n doc: \"`[\\\"any\\\", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`\"\n },\n none: {\n doc: \"`[\\\"none\\\", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`\"\n },\n has: {\n doc: \"`[\\\"has\\\", key]` `feature[key]` exists\"\n },\n \"!has\": {\n doc: \"`[\\\"!has\\\", key]` `feature[key]` does not exist\"\n },\n within: {\n doc: \"`[\\\"within\\\", object]` feature geometry is within object geometry\"\n }\n },\n doc: \"The filter operator.\"\n};\nvar geometry_type = {\n type: \"enum\",\n values: {\n Point: {\n doc: \"Filter to point geometries.\"\n },\n LineString: {\n doc: \"Filter to line geometries.\"\n },\n Polygon: {\n doc: \"Filter to polygon geometries.\"\n }\n },\n doc: \"The geometry type for the filter to select.\"\n};\nvar function_stop = {\n type: \"array\",\n minimum: 0,\n maximum: 24,\n value: [\"number\", \"color\"],\n length: 2,\n doc: \"Zoom level and value pair.\"\n};\nvar expression = {\n type: \"array\",\n value: \"*\",\n minimum: 1,\n doc: \"An expression defines a function that can be used for data-driven style properties or feature filters.\"\n};\nvar expression_name = {\n doc: \"\",\n type: \"enum\",\n values: {\n \"let\": {\n doc: \"Binds expressions to named variables, which can then be referenced in the result expression using [\\\"var\\\", \\\"variable_name\\\"].\",\n group: \"Variable binding\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"var\": {\n doc: \"References variable bound using \\\"let\\\".\",\n group: \"Variable binding\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n literal: {\n doc: \"Provides a literal array or object value.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n array: {\n doc: \"Asserts that the input is an array (optionally with a specific item type and length). If, when the input expression is evaluated, it is not of the asserted type, then this assertion will cause the whole expression to be aborted.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n at: {\n doc: \"Retrieves an item from an array.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"in\": {\n doc: \"Determines whether an item exists in an array or a substring exists in a string.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.6.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n }\n },\n \"index-of\": {\n doc: \"Returns the first position at which an item can be found in an array or a substring can be found in a string, or `-1` if the input cannot be found. Accepts an optional index from where to begin the search.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.10.0\"\n }\n }\n },\n slice: {\n doc: \"Returns an item from an array or a substring from a string from a specified start index, or between a start index and an end index if set. The return value is inclusive of the start index but not of the end index.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.10.0\"\n }\n }\n },\n \"case\": {\n doc: \"Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n match: {\n doc: \"Selects the output for which the label value matches the input value, or the fallback value if no match is found. The input can be any expression (for example, `[\\\"get\\\", \\\"building_type\\\"]`). Each label must be unique, and must be either:\\n - a single literal value; or\\n - an array of literal values, the values of which must be all strings or all numbers (for example `[100, 101]` or `[\\\"c\\\", \\\"b\\\"]`).\\n\\nThe input matches if any of the values in the array matches using strict equality, similar to the `\\\"in\\\"` operator.\\nIf the input type does not match the type of the labels, the result will be the fallback value.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n coalesce: {\n doc: \"Evaluates each expression in turn until the first non-null value is obtained, and returns that value.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n step: {\n doc: \"Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output values (\\\"stops\\\"). The `input` may be any numeric expression (e.g., `[\\\"get\\\", \\\"population\\\"]`). Stop inputs must be numeric literals in strictly ascending order. Returns the output value of the stop just less than the input, or the first output if the input is less than the first stop.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.42.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n interpolate: {\n doc: \"Produces continuous, smooth results by interpolating between pairs of input and output values (\\\"stops\\\"). The `input` may be any numeric expression (e.g., `[\\\"get\\\", \\\"population\\\"]`). Stop inputs must be numeric literals in strictly ascending order. The output type must be `number`, `array`, or `color`.\\n\\nInterpolation types:\\n- `[\\\"linear\\\"]`: Interpolates linearly between the pair of stops just less than and just greater than the input.\\n- `[\\\"exponential\\\", base]`: Interpolates exponentially between the stops just less than and just greater than the input. `base` controls the rate at which the output increases: higher values make the output increase more towards the high end of the range. With values close to 1 the output increases linearly.\\n- `[\\\"cubic-bezier\\\", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given control points.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.42.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"interpolate-hcl\": {\n doc: \"Produces continuous, smooth results by interpolating between pairs of input and output values (\\\"stops\\\"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the Hue-Chroma-Luminance color space.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.49.0\"\n }\n }\n },\n \"interpolate-lab\": {\n doc: \"Produces continuous, smooth results by interpolating between pairs of input and output values (\\\"stops\\\"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the CIELAB color space.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.49.0\"\n }\n }\n },\n ln2: {\n doc: \"Returns mathematical constant ln(2).\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n pi: {\n doc: \"Returns the mathematical constant pi.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n e: {\n doc: \"Returns the mathematical constant e.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"typeof\": {\n doc: \"Returns a string describing the type of the given value.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n string: {\n doc: \"Asserts that the input value is a string. If multiple values are provided, each one is evaluated in order until a string is obtained. If none of the inputs are strings, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n number: {\n doc: \"Asserts that the input value is a number. If multiple values are provided, each one is evaluated in order until a number is obtained. If none of the inputs are numbers, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"boolean\": {\n doc: \"Asserts that the input value is a boolean. If multiple values are provided, each one is evaluated in order until a boolean is obtained. If none of the inputs are booleans, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n object: {\n doc: \"Asserts that the input value is an object. If multiple values are provided, each one is evaluated in order until an object is obtained. If none of the inputs are objects, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n collator: {\n doc: \"Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none is provided, the default locale is used. If the requested locale is not available, the `collator` will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n format: {\n doc: \"Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain a string literal or expression, including an [`'image'`](#types-image) expression. Strings may be followed by a style override object that supports the following properties:\\n- `\\\"text-font\\\"`: Overrides the font stack specified by the root layout property.\\n- `\\\"text-color\\\"`: Overrides the color specified by the root paint property.\\n- `\\\"font-scale\\\"`: Applies a scaling factor on `text-size` as specified by the root layout property.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.48.0\",\n android: \"6.7.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n },\n \"text-font\": {\n js: \"0.48.0\",\n android: \"6.7.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n },\n \"font-scale\": {\n js: \"0.48.0\",\n android: \"6.7.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n },\n \"text-color\": {\n js: \"1.3.0\",\n android: \"7.3.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n },\n image: {\n js: \"1.6.0\",\n android: \"8.6.0\",\n ios: \"5.7.0\",\n macos: \"0.15.0\"\n }\n }\n },\n image: {\n doc: \"Returns an `image` type for use in `icon-image`, `*-pattern` entries and as a section in the `format` expression. If set, the `image` argument will check that the requested image exists in the style and will return either the resolved image name or `null`, depending on whether or not the image is currently in the style. This validation process is synchronous and requires the image to have been added to the style before requesting it in the `image` argument.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.4.0\",\n android: \"8.6.0\",\n ios: \"5.7.0\",\n macos: \"0.15.0\"\n }\n }\n },\n \"number-format\": {\n doc: \"Converts the input number into a string representation using the providing formatting rules. If set, the `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits` and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.54.0\"\n }\n }\n },\n \"to-string\": {\n doc: \"Converts the input value to a string. If the input is `null`, the result is `\\\"\\\"`. If the input is a boolean, the result is `\\\"true\\\"` or `\\\"false\\\"`. If the input is a number, it is converted to a string as specified by the [\\\"NumberToString\\\" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the ECMAScript Language Specification. If the input is a color, it is converted to a string of the form `\\\"rgba(r,g,b,a)\\\"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. Otherwise, the input is converted to a string in the format specified by the [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-number\": {\n doc: \"Converts the input value to a number, if possible. If the input is `null` or `false`, the result is 0. If the input is `true`, the result is 1. If the input is a string, it is converted to a number as specified by the [\\\"ToNumber Applied to the String Type\\\" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-boolean\": {\n doc: \"Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-rgba\": {\n doc: \"Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order.\",\n group: \"Color\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-color\": {\n doc: \"Converts the input value to a color. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n rgb: {\n doc: \"Creates a color value from red, green, and blue components, which must range between 0 and 255, and an alpha component of 1. If any component is out of range, the expression is an error.\",\n group: \"Color\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n rgba: {\n doc: \"Creates a color value from red, green, blue components, which must range between 0 and 255, and an alpha component which must range between 0 and 1. If any component is out of range, the expression is an error.\",\n group: \"Color\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n get: {\n doc: \"Retrieves a property value from the current feature's properties, or from another object if a second argument is provided. Returns null if the requested property is missing.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n has: {\n doc: \"Tests for the presence of an property value in the current feature's properties, or from another object if a second argument is provided.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n length: {\n doc: \"Gets the length of an array or string.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n properties: {\n doc: \"Gets the feature properties object. Note that in some cases, it may be more efficient to use [\\\"get\\\", \\\"property_name\\\"] directly.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"feature-state\": {\n doc: \"Retrieves a property value from the current feature's state. Returns null if the requested property is not present on the feature's state. A feature's state is not part of the GeoJSON or vector tile data, and must be set programmatically on each feature. Features are identified by their `id` attribute, which must be an integer or a string that can be cast to an integer. Note that [\\\"feature-state\\\"] can only be used with paint properties that support data-driven styling.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.46.0\"\n }\n }\n },\n \"geometry-type\": {\n doc: \"Gets the feature's geometry type: `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n id: {\n doc: \"Gets the feature's id, if it has one.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n zoom: {\n doc: \"Gets the current zoom level. Note that in style layout and paint properties, [\\\"zoom\\\"] may only appear as the input to a top-level \\\"step\\\" or \\\"interpolate\\\" expression.\",\n group: \"Zoom\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"heatmap-density\": {\n doc: \"Gets the kernel density estimation of a pixel in a heatmap layer, which is a relative measure of how many data points are crowded around a particular pixel. Can only be used in the `heatmap-color` property.\",\n group: \"Heatmap\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"line-progress\": {\n doc: \"Gets the progress along a gradient line. Can only be used in the `line-gradient` property.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n }\n }\n },\n \"sky-radial-progress\": {\n doc: \"Gets the distance of a point on the sky from the sun position. Returns 0 at sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient` property.\",\n group: \"sky\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n },\n accumulated: {\n doc: \"Gets the value of a cluster property accumulated so far. Can only be used in the `clusterProperties` option of a clustered GeoJSON source.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.53.0\"\n }\n }\n },\n \"+\": {\n doc: \"Returns the sum of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"*\": {\n doc: \"Returns the product of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"-\": {\n doc: \"For two inputs, returns the result of subtracting the second input from the first. For a single input, returns the result of subtracting it from 0.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"/\": {\n doc: \"Returns the result of floating point division of the first input by the second.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"%\": {\n doc: \"Returns the remainder after integer division of the first input by the second.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"^\": {\n doc: \"Returns the result of raising the first input to the power specified by the second.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n sqrt: {\n doc: \"Returns the square root of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.42.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n log10: {\n doc: \"Returns the base-ten logarithm of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n ln: {\n doc: \"Returns the natural logarithm of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n log2: {\n doc: \"Returns the base-two logarithm of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n sin: {\n doc: \"Returns the sine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n cos: {\n doc: \"Returns the cosine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n tan: {\n doc: \"Returns the tangent of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n asin: {\n doc: \"Returns the arcsine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n acos: {\n doc: \"Returns the arccosine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n atan: {\n doc: \"Returns the arctangent of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n min: {\n doc: \"Returns the minimum value of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n max: {\n doc: \"Returns the maximum value of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n round: {\n doc: \"Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example, `[\\\"round\\\", -1.5]` evaluates to -2.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n abs: {\n doc: \"Returns the absolute value of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n ceil: {\n doc: \"Returns the smallest integer that is greater than or equal to the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n floor: {\n doc: \"Returns the largest integer that is less than or equal to the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n distance: {\n doc: \"Returns the shortest distance in meters between the evaluated feature and the input geometry. The input value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries, particularly below zoom level 13.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.2.0\",\n ios: \"5.9.0\",\n macos: \"0.16.0\"\n }\n }\n },\n \"==\": {\n doc: \"Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \"!=\": {\n doc: \"Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \">\": {\n doc: \"Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \"<\": {\n doc: \"Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \">=\": {\n doc: \"Returns `true` if the first input is greater than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \"<=\": {\n doc: \"Returns `true` if the first input is less than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n all: {\n doc: \"Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and no further input expressions are evaluated.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n any: {\n doc: \"Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true` and no further input expressions are evaluated.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"!\": {\n doc: \"Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n within: {\n doc: \"Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry, `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Supported features for evaluation:\\n- `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\\n- `LineString`: Returns `false` if any part of a line falls outside the boundary, the line intersects the boundary, or a line's endpoint is on the boundary.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.9.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n }\n },\n \"is-supported-script\": {\n doc: \"Returns `true` if the input string is expected to render legibly. Returns `false` if the input string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use in Mapbox GL JS).\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.6.0\"\n }\n }\n },\n upcase: {\n doc: \"Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n downcase: {\n doc: \"Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n concat: {\n doc: \"Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a string as if by `to-string`.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"resolved-locale\": {\n doc: \"Returns the IETF language tag of the locale being used by the provided `collator`. This can be used to determine the default system locale, or to determine if a requested locale was successfully loaded.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n }\n }\n};\nvar fog = {\n range: {\n type: \"array\",\n \"default\": [0.5, 10],\n minimum: -20,\n maximum: 20,\n length: 2,\n value: \"number\",\n \"property-type\": \"data-constant\",\n transition: true,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n doc: \"The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away.\",\n example: [0.5, 10],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.3.0\"\n }\n }\n },\n color: {\n type: \"color\",\n \"property-type\": \"data-constant\",\n \"default\": \"#ffffff\",\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"The color of the fog. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.3.0\"\n }\n }\n },\n \"horizon-blend\": {\n type: \"number\",\n \"property-type\": \"data-constant\",\n \"default\": 0.1,\n minimum: 0,\n maximum: 1,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Horizon blend applies a smooth fade from the color of the fog to the color of the sky. A value of zero leaves a sharp transition from fog to sky. Increasing the value blends the color of fog into increasingly high angles of the sky.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.3.0\"\n }\n }\n }\n};\nvar light = {\n anchor: {\n type: \"enum\",\n \"default\": \"viewport\",\n values: {\n map: {\n doc: \"The position of the light source is aligned to the rotation of the map.\"\n },\n viewport: {\n doc: \"The position of the light source is aligned to the rotation of the viewport.\"\n }\n },\n \"property-type\": \"data-constant\",\n transition: false,\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n doc: \"Whether extruded geometries are lit relative to the map or viewport.\",\n example: \"map\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n position: {\n type: \"array\",\n \"default\": [1.15, 210, 30],\n length: 3,\n value: \"number\",\n \"property-type\": \"data-constant\",\n transition: true,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n doc: \"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).\",\n example: [1.5, 90, 80],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n color: {\n type: \"color\",\n \"property-type\": \"data-constant\",\n \"default\": \"#ffffff\",\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Color tint for lighting extruded geometries.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n intensity: {\n type: \"number\",\n \"property-type\": \"data-constant\",\n \"default\": 0.5,\n minimum: 0,\n maximum: 1,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n }\n};\nvar terrain = {\n source: {\n type: \"string\",\n doc: \"Name of a source of `raster_dem` type to be used for terrain elevation.\",\n required: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n },\n exaggeration: {\n type: \"number\",\n \"property-type\": \"data-constant\",\n \"default\": 1,\n minimum: 0,\n maximum: 1000,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n }\n};\nvar paint = [\"paint_fill\", \"paint_line\", \"paint_circle\", \"paint_heatmap\", \"paint_fill-extrusion\", \"paint_symbol\", \"paint_raster\", \"paint_hillshade\", \"paint_background\", \"paint_sky\"];\nvar paint_fill = {\n \"fill-antialias\": {\n type: \"boolean\",\n \"default\": true,\n doc: \"Whether or not the fill should be antialiased.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.21.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.\",\n transition: true,\n requires: [{\n \"!\": \"fill-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.19.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-outline-color\": {\n type: \"color\",\n doc: \"The outline color of the fill. Matches the value of `fill-color` if unspecified.\",\n transition: true,\n requires: [{\n \"!\": \"fill-pattern\"\n }, {\n \"fill-antialias\": true\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.19.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The fill is translated relative to the map.\"\n },\n viewport: {\n doc: \"The fill is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `fill-translate`.\",\n \"default\": \"map\",\n requires: [\"fill-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.49.0\",\n android: \"6.5.0\",\n macos: \"0.11.0\",\n ios: \"4.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n }\n};\nvar paint_line = {\n \"line-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the line will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-color\": {\n type: \"color\",\n doc: \"The color with which the line will be drawn.\",\n \"default\": \"#000000\",\n transition: true,\n requires: [{\n \"!\": \"line-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.23.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The line is translated relative to the map.\"\n },\n viewport: {\n doc: \"The line is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `line-translate`.\",\n \"default\": \"map\",\n requires: [\"line-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-width\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Stroke thickness.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-gap-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n doc: \"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\",\n transition: true,\n units: \"pixels\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-offset\": {\n type: \"number\",\n \"default\": 0,\n doc: \"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.\",\n transition: true,\n units: \"pixels\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.12.1\",\n android: \"3.0.0\",\n ios: \"3.1.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-blur\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Blur applied to the line, in pixels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-dasharray\": {\n type: \"array\",\n value: \"number\",\n doc: \"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n minimum: 0,\n transition: true,\n units: \"line widths\",\n requires: [{\n \"!\": \"line-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"2.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n },\n \"line-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.49.0\",\n android: \"6.5.0\",\n macos: \"0.11.0\",\n ios: \"4.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n },\n \"line-gradient\": {\n type: \"color\",\n doc: \"Defines a gradient with which to color a line feature. Can only be used with GeoJSON sources that specify `\\\"lineMetrics\\\": true`.\",\n transition: false,\n requires: [{\n \"!\": \"line-dasharray\"\n }, {\n \"!\": \"line-pattern\"\n }, {\n source: \"geojson\",\n has: {\n lineMetrics: true\n }\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.4.0\",\n macos: \"0.11.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: true,\n parameters: [\"line-progress\"]\n },\n \"property-type\": \"color-ramp\"\n }\n};\nvar paint_circle = {\n \"circle-radius\": {\n type: \"number\",\n \"default\": 5,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Circle radius.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.18.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The fill color of the circle.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.18.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-blur\": {\n type: \"number\",\n \"default\": 0,\n doc: \"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.20.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the circle will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.20.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The circle is translated relative to the map.\"\n },\n viewport: {\n doc: \"The circle is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `circle-translate`.\",\n \"default\": \"map\",\n requires: [\"circle-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-pitch-scale\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"Circles are scaled according to their apparent distance to the camera.\"\n },\n viewport: {\n doc: \"Circles are not scaled.\"\n }\n },\n \"default\": \"map\",\n doc: \"Controls the scaling behavior of the circle when the map is pitched.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-pitch-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The circle is aligned to the plane of the map.\"\n },\n viewport: {\n doc: \"The circle is aligned to the plane of the viewport.\"\n }\n },\n \"default\": \"viewport\",\n doc: \"Orientation of circle when map is pitched.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-stroke-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-stroke-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The stroke color of the circle.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-stroke-opacity\": {\n type: \"number\",\n doc: \"The opacity of the circle's stroke.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n }\n};\nvar paint_heatmap = {\n \"heatmap-radius\": {\n type: \"number\",\n \"default\": 30,\n minimum: 1,\n transition: true,\n units: \"pixels\",\n doc: \"Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n \"data-driven styling\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"heatmap-weight\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n transition: false,\n doc: \"A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n \"data-driven styling\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"heatmap-intensity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n transition: true,\n doc: \"Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"heatmap-color\": {\n type: \"color\",\n \"default\": [\"interpolate\", [\"linear\"], [\"heatmap-density\"], 0, \"rgba(0, 0, 255, 0)\", 0.1, \"royalblue\", 0.3, \"cyan\", 0.5, \"lime\", 0.7, \"yellow\", 1, \"red\"],\n doc: \"Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\\\"heatmap-density\\\"]` as input.\",\n transition: false,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: true,\n parameters: [\"heatmap-density\"]\n },\n \"property-type\": \"color-ramp\"\n },\n \"heatmap-opacity\": {\n type: \"number\",\n doc: \"The global opacity at which the heatmap layer will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_symbol = {\n \"icon-opacity\": {\n doc: \"The opacity at which the icon will be drawn.\",\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n transition: true,\n doc: \"The color of the icon. This can only be used with sdf icons.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-halo-color\": {\n type: \"color\",\n \"default\": \"rgba(0, 0, 0, 0)\",\n transition: true,\n doc: \"The color of the icon's halo. Icon halos can only be used with SDF icons.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-halo-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Distance of halo to the icon outline.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-halo-blur\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Fade out the halo towards the outside.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"Icons are translated relative to the map.\"\n },\n viewport: {\n doc: \"Icons are translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `icon-translate`.\",\n \"default\": \"map\",\n requires: [\"icon-image\", \"icon-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the text will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-color\": {\n type: \"color\",\n doc: \"The color with which the text will be drawn.\",\n \"default\": \"#000000\",\n transition: true,\n overridable: true,\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-halo-color\": {\n type: \"color\",\n \"default\": \"rgba(0, 0, 0, 0)\",\n transition: true,\n doc: \"The color of the text's halo, which helps it stand out from backgrounds.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-halo-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-halo-blur\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"The halo's fadeout distance towards the outside.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The text is translated relative to the map.\"\n },\n viewport: {\n doc: \"The text is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `text-translate`.\",\n \"default\": \"map\",\n requires: [\"text-field\", \"text-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_raster = {\n \"raster-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the image will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-hue-rotate\": {\n type: \"number\",\n \"default\": 0,\n period: 360,\n transition: true,\n units: \"degrees\",\n doc: \"Rotates hues around the color wheel.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-brightness-min\": {\n type: \"number\",\n doc: \"Increase or reduce the brightness of the image. The value is the minimum brightness.\",\n \"default\": 0,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-brightness-max\": {\n type: \"number\",\n doc: \"Increase or reduce the brightness of the image. The value is the maximum brightness.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-saturation\": {\n type: \"number\",\n doc: \"Increase or reduce the saturation of the image.\",\n \"default\": 0,\n minimum: -1,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-contrast\": {\n type: \"number\",\n doc: \"Increase or reduce the contrast of the image.\",\n \"default\": 0,\n minimum: -1,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-resampling\": {\n type: \"enum\",\n doc: \"The resampling/interpolation method to use for overscaling, also known as texture magnification filter\",\n values: {\n linear: {\n doc: \"(Bi)linear filtering interpolates pixel values using the weighted average of the four closest original source pixels creating a smooth but blurry look when overscaled\"\n },\n nearest: {\n doc: \"Nearest neighbor filtering interpolates pixel values using the nearest original source pixel creating a sharp but pixelated look when overscaled\"\n }\n },\n \"default\": \"linear\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.47.0\",\n android: \"6.3.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-fade-duration\": {\n type: \"number\",\n \"default\": 300,\n minimum: 0,\n transition: false,\n units: \"milliseconds\",\n doc: \"Fade duration when a new tile is added.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_hillshade = {\n \"hillshade-illumination-direction\": {\n type: \"number\",\n \"default\": 335,\n minimum: 0,\n maximum: 359,\n doc: \"The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map`.\",\n transition: false,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-illumination-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The hillshade illumination is relative to the north direction.\"\n },\n viewport: {\n doc: \"The hillshade illumination is relative to the top of the viewport.\"\n }\n },\n \"default\": \"viewport\",\n doc: \"Direction of light source when map is rotated.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-exaggeration\": {\n type: \"number\",\n doc: \"Intensity of the hillshade\",\n \"default\": 0.5,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-shadow-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The shading color of areas that face away from the light source.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-highlight-color\": {\n type: \"color\",\n \"default\": \"#FFFFFF\",\n doc: \"The shading color of areas that faces towards the light source.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-accent-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The shading color used to accentuate rugged terrain like sharp cliffs and gorges.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_background = {\n \"background-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The color with which the background will be drawn.\",\n transition: true,\n requires: [{\n \"!\": \"background-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"background-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"cross-faded\"\n },\n \"background-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity at which the background will be drawn.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_sky = {\n \"sky-type\": {\n type: \"enum\",\n values: {\n gradient: {\n doc: \"Renders the sky with a gradient that can be configured with `sky-gradient-radius` and `sky-gradient`.\"\n },\n atmosphere: {\n doc: \"Renders the sky with a simulated atmospheric scattering algorithm, the sun direction can be attached to the light position or explicitly set through `sky-atmosphere-sun`.\"\n }\n },\n \"default\": \"atmosphere\",\n doc: \"The type of the sky\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-atmosphere-sun\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n units: \"degrees\",\n minimum: [0, 0],\n maximum: [360, 180],\n transition: false,\n doc: \"Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0° is directly above, at zenith, and 90° at the horizon. When this property is ommitted, the sun center is directly inherited from the light position.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-atmosphere-sun-intensity\": {\n type: \"number\",\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n \"default\": 10,\n minimum: 0,\n maximum: 100,\n transition: false,\n doc: \"Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-gradient-center\": {\n type: \"array\",\n requires: [{\n \"sky-type\": \"gradient\"\n }],\n value: \"number\",\n \"default\": [0, 0],\n length: 2,\n units: \"degrees\",\n minimum: [0, 0],\n maximum: [360, 180],\n transition: false,\n doc: \"Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0° is directly above, at zenith, and 90° at the horizon.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-gradient-radius\": {\n type: \"number\",\n requires: [{\n \"sky-type\": \"gradient\"\n }],\n \"default\": 90,\n minimum: 0,\n maximum: 180,\n transition: false,\n doc: \"The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-gradient\": {\n type: \"color\",\n \"default\": [\"interpolate\", [\"linear\"], [\"sky-radial-progress\"], 0.8, \"#87ceeb\", 1, \"white\"],\n doc: \"Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`.\",\n transition: false,\n requires: [{\n \"sky-type\": \"gradient\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: true,\n parameters: [\"sky-radial-progress\"]\n },\n \"property-type\": \"color-ramp\"\n },\n \"sky-atmosphere-halo-color\": {\n type: \"color\",\n \"default\": \"white\",\n doc: \"A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer.\",\n transition: false,\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-atmosphere-color\": {\n type: \"color\",\n \"default\": \"white\",\n doc: \"A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density.\",\n transition: false,\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity of the entire sky layer.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar transition = {\n duration: {\n type: \"number\",\n \"default\": 300,\n minimum: 0,\n units: \"milliseconds\",\n doc: \"Time allotted for transitions to complete.\"\n },\n delay: {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n units: \"milliseconds\",\n doc: \"Length of time before a transition begins.\"\n }\n};\nvar promoteId = {\n \"*\": {\n type: \"string\",\n doc: \"A name of a feature property to use as ID for feature state.\"\n }\n};\nvar v8 = {\n $version: $version,\n $root: $root,\n sources: sources,\n source: source,\n source_vector: source_vector,\n source_raster: source_raster,\n source_raster_dem: source_raster_dem,\n source_geojson: source_geojson,\n source_video: source_video,\n source_image: source_image,\n layer: layer,\n layout: layout,\n layout_background: layout_background,\n layout_sky: layout_sky,\n layout_fill: layout_fill,\n layout_circle: layout_circle,\n layout_heatmap: layout_heatmap,\n \"layout_fill-extrusion\": {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n },\n layout_line: layout_line,\n layout_symbol: layout_symbol,\n layout_raster: layout_raster,\n layout_hillshade: layout_hillshade,\n filter: filter,\n filter_operator: filter_operator,\n geometry_type: geometry_type,\n \"function\": {\n expression: {\n type: \"expression\",\n doc: \"An expression.\"\n },\n stops: {\n type: \"array\",\n doc: \"An array of stops.\",\n value: \"function_stop\"\n },\n base: {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n doc: \"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\"\n },\n property: {\n type: \"string\",\n doc: \"The name of a feature property to use as the function input.\",\n \"default\": \"$zoom\"\n },\n type: {\n type: \"enum\",\n values: {\n identity: {\n doc: \"Return the input value as the output value.\"\n },\n exponential: {\n doc: \"Generate an output by interpolating between stops just less than and just greater than the function input.\"\n },\n interval: {\n doc: \"Return the output value of the stop just less than the function input.\"\n },\n categorical: {\n doc: \"Return the output value of the stop equal to the function input.\"\n }\n },\n doc: \"The interpolation strategy to use in function evaluation.\",\n \"default\": \"exponential\"\n },\n colorSpace: {\n type: \"enum\",\n values: {\n rgb: {\n doc: \"Use the RGB color space to interpolate color values\"\n },\n lab: {\n doc: \"Use the LAB color space to interpolate color values.\"\n },\n hcl: {\n doc: \"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually.\"\n }\n },\n doc: \"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.\",\n \"default\": \"rgb\"\n },\n \"default\": {\n type: \"*\",\n required: false,\n doc: \"A value to serve as a fallback function result when a value isn't otherwise available. It is used in the following circumstances:\\n* In categorical functions, when the feature value does not match any of the stop domain values.\\n* In property and zoom-and-property functions, when a feature does not contain a value for the specified property.\\n* In identity functions, when the feature value is not valid for the style property (for example, if the function is being used for a `circle-color` property but the feature property value is not a string or not a valid color).\\n* In interval or exponential property and zoom-and-property functions, when the feature value is not numeric.\\nIf no default is provided, the style property's default is used in these circumstances.\"\n }\n },\n function_stop: function_stop,\n expression: expression,\n expression_name: expression_name,\n fog: fog,\n light: light,\n terrain: terrain,\n paint: paint,\n paint_fill: paint_fill,\n \"paint_fill-extrusion\": {\n \"fill-extrusion-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-extrusion-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.\",\n transition: true,\n requires: [{\n \"!\": \"fill-extrusion-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-extrusion-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-extrusion-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The fill extrusion is translated relative to the map.\"\n },\n viewport: {\n doc: \"The fill extrusion is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `fill-extrusion-translate`.\",\n \"default\": \"map\",\n requires: [\"fill-extrusion-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-extrusion-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.49.0\",\n android: \"6.5.0\",\n macos: \"0.11.0\",\n ios: \"4.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n },\n \"fill-extrusion-height\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n units: \"meters\",\n doc: \"The height with which to extrude this layer.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-extrusion-base\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n units: \"meters\",\n doc: \"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.\",\n transition: true,\n requires: [\"fill-extrusion-height\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-extrusion-vertical-gradient\": {\n type: \"boolean\",\n \"default\": true,\n doc: \"Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down.\",\n transition: false,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.50.0\",\n ios: \"4.7.0\",\n macos: \"0.13.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n },\n paint_line: paint_line,\n paint_circle: paint_circle,\n paint_heatmap: paint_heatmap,\n paint_symbol: paint_symbol,\n paint_raster: paint_raster,\n paint_hillshade: paint_hillshade,\n paint_background: paint_background,\n paint_sky: paint_sky,\n transition: transition,\n \"property-type\": {\n \"data-driven\": {\n type: \"property-type\",\n doc: \"Property is interpolable and can be represented using a property expression.\"\n },\n \"cross-faded\": {\n type: \"property-type\",\n doc: \"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms.\"\n },\n \"cross-faded-data-driven\": {\n type: \"property-type\",\n doc: \"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms. It can be represented using a property expression.\"\n },\n \"color-ramp\": {\n type: \"property-type\",\n doc: \"Property should be specified using a color ramp from which the output color can be sampled based on a property calculation.\"\n },\n \"data-constant\": {\n type: \"property-type\",\n doc: \"Property is interpolable but cannot be represented using a property expression.\"\n },\n constant: {\n type: \"property-type\",\n doc: \"Property is constant across all zoom levels and property values.\"\n }\n },\n promoteId: promoteId\n};\n\n// Note: This regex matches even invalid JSON strings, but since we’re\n// working on the output of `JSON.stringify` we know that only valid strings\n// are present (unless the user supplied a weird `options.indent` but in\n// that case we don’t care since the output would be invalid anyway).\nvar stringOrChar = /(\"(?:[^\\\\\"]|\\\\.)*\")|[:,]/g;\nvar jsonStringifyPrettyCompact = function stringify(passedObj, options) {\n var indent, maxLength, replacer;\n options = options || {};\n indent = JSON.stringify([1], undefined, options.indent === undefined ? 2 : options.indent).slice(2, -3);\n maxLength = indent === \"\" ? Infinity : options.maxLength === undefined ? 80 : options.maxLength;\n replacer = options.replacer;\n return function _stringify(obj, currentIndent, reserved) {\n // prettier-ignore\n var end, index, items, key, keyPart, keys, length, nextIndent, prettified, start, string, value;\n if (obj && typeof obj.toJSON === \"function\") {\n obj = obj.toJSON();\n }\n string = JSON.stringify(obj, replacer);\n if (string === undefined) {\n return string;\n }\n length = maxLength - currentIndent.length - reserved;\n if (string.length <= length) {\n prettified = string.replace(stringOrChar, function (match, stringLiteral) {\n return stringLiteral || match + \" \";\n });\n if (prettified.length <= length) {\n return prettified;\n }\n }\n if (replacer != null) {\n obj = JSON.parse(string);\n replacer = undefined;\n }\n if (_typeof(obj) === \"object\" && obj !== null) {\n nextIndent = currentIndent + indent;\n items = [];\n index = 0;\n if (Array.isArray(obj)) {\n start = \"[\";\n end = \"]\";\n length = obj.length;\n for (; index < length; index++) {\n items.push(_stringify(obj[index], nextIndent, index === length - 1 ? 0 : 1) || \"null\");\n }\n } else {\n start = \"{\";\n end = \"}\";\n keys = Object.keys(obj);\n length = keys.length;\n for (; index < length; index++) {\n key = keys[index];\n keyPart = JSON.stringify(key) + \": \";\n value = _stringify(obj[key], nextIndent, keyPart.length + (index === length - 1 ? 0 : 1));\n if (value !== undefined) {\n items.push(keyPart + value);\n }\n }\n }\n if (items.length > 0) {\n return [start, indent + items.join(\",\\n\" + nextIndent), end].join(\"\\n\" + currentIndent);\n }\n }\n return string;\n }(passedObj, \"\", 0);\n};\nfunction sortKeysBy(obj, reference) {\n var result = {};\n for (var key in reference) {\n if (obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n for (var _key in obj) {\n if (result[_key] === undefined) {\n result[_key] = obj[_key];\n }\n }\n return result;\n}\nfunction format(style) {\n var space = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n style = sortKeysBy(style, v8.$root);\n if (style.layers) {\n style.layers = style.layers.map(function (layer) {\n return sortKeysBy(layer, v8.layer);\n });\n }\n return jsonStringifyPrettyCompact(style, {\n indent: space\n });\n}\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nfunction createCommonjsModule(fn) {\n var module = {\n exports: {}\n };\n return fn(module, module.exports), module.exports;\n}\nfunction commonjsRequire(target) {\n throw new Error('Could not dynamically require \"' + target + '\". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.');\n}\n\n/*! https://mths.be/punycode v1.3.2 by @mathias */\n\nvar punycode = createCommonjsModule(function (module, exports) {\n (function (root) {\n /** Detect free variables */\n var freeExports = exports && !exports.nodeType && exports;\n var freeModule = module && !module.nodeType && module;\n var freeGlobal = _typeof(commonjsGlobal) == 'object' && commonjsGlobal;\n if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) {\n root = freeGlobal;\n }\n\n /**\n * The `punycode` object.\n * @name punycode\n * @type Object\n */\n var punycode,\n /** Highest positive signed 32-bit float value */\n maxInt = 2147483647,\n // aka. 0x7FFFFFFF or 2^31-1\n\n /** Bootstring parameters */\n base = 36,\n tMin = 1,\n tMax = 26,\n skew = 38,\n damp = 700,\n initialBias = 72,\n initialN = 128,\n // 0x80\n delimiter = '-',\n // '\\x2D'\n\n /** Regular expressions */\n regexPunycode = /^xn--/,\n regexNonASCII = /[^\\x20-\\x7E]/,\n // unprintable ASCII chars + non-ASCII chars\n regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g,\n // RFC 3490 separators\n\n /** Error messages */\n errors = {\n 'overflow': 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n },\n /** Convenience shortcuts */\n baseMinusTMin = base - tMin,\n floor = Math.floor,\n stringFromCharCode = String.fromCharCode,\n /** Temporary variable */\n key;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\n function error(type) {\n throw RangeError(errors[type]);\n }\n\n /**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\n function map(array, fn) {\n var length = array.length;\n var result = [];\n while (length--) {\n result[length] = fn(array[length]);\n }\n return result;\n }\n\n /**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\n function mapDomain(string, fn) {\n var parts = string.split('@');\n var result = '';\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n string = parts[1];\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n string = string.replace(regexSeparators, '\\x2E');\n var labels = string.split('.');\n var encoded = map(labels, fn).join('.');\n return result + encoded;\n }\n\n /**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\n function ucs2decode(string) {\n var output = [],\n counter = 0,\n length = string.length,\n value,\n extra;\n while (counter < length) {\n value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // high surrogate, and there is a next character\n extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) {\n // low surrogate\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // unmatched surrogate; only append this code unit, in case the next\n // code unit is the high surrogate of a surrogate pair\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n }\n\n /**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\n function ucs2encode(array) {\n return map(array, function (value) {\n var output = '';\n if (value > 0xFFFF) {\n value -= 0x10000;\n output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n value = 0xDC00 | value & 0x3FF;\n }\n output += stringFromCharCode(value);\n return output;\n }).join('');\n }\n\n /**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\n function basicToDigit(codePoint) {\n if (codePoint - 48 < 10) {\n return codePoint - 22;\n }\n if (codePoint - 65 < 26) {\n return codePoint - 65;\n }\n if (codePoint - 97 < 26) {\n return codePoint - 97;\n }\n return base;\n }\n\n /**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\n function digitToBasic(digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n }\n\n /**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * http://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\n function adapt(delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for /* no initialization */\n (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n }\n\n /**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\n function decode(input) {\n // Don't use UCS-2\n var output = [],\n inputLength = input.length,\n out,\n i = 0,\n n = initialN,\n bias = initialBias,\n basic,\n j,\n index,\n oldi,\n w,\n k,\n digit,\n t,\n /** Cached calculation results */\n baseMinusT;\n\n // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) {\n basic = 0;\n }\n for (j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n for /* no final expression */\n (index = basic > 0 ? basic + 1 : 0; index < inputLength;) {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n for /* no condition */\n (oldi = i, w = 1, k = base;; k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n digit = basicToDigit(input.charCodeAt(index++));\n if (digit >= base || digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n i += digit * w;\n t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (digit < t) {\n break;\n }\n baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n w *= baseMinusT;\n }\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0);\n\n // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n n += floor(i / out);\n i %= out;\n\n // Insert `n` at position `i` of the output\n output.splice(i++, 0, n);\n }\n return ucs2encode(output);\n }\n\n /**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\n function encode(input) {\n var n,\n delta,\n handledCPCount,\n basicLength,\n bias,\n j,\n m,\n q,\n k,\n t,\n currentValue,\n output = [],\n /** `inputLength` will hold the number of code points in `input`. */\n inputLength,\n /** Cached calculation results */\n handledCPCountPlusOne,\n baseMinusT,\n qMinusT;\n\n // Convert the input in UCS-2 to Unicode\n input = ucs2decode(input);\n\n // Cache the length\n inputLength = input.length;\n\n // Initialize the state\n n = initialN;\n delta = 0;\n bias = initialBias;\n\n // Handle the basic code points\n for (j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n handledCPCount = basicLength = output.length;\n\n // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n\n // Finish the basic string - if it is not empty - with a delimiter\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n for (m = maxInt, j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to ,\n // but guard against overflow\n handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n for (j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer\n for /* no condition */\n (q = delta, k = base;; k += base) {\n t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) {\n break;\n }\n qMinusT = q - t;\n baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));\n q = floor(qMinusT / baseMinusT);\n }\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n ++delta;\n ++n;\n }\n return output.join('');\n }\n\n /**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\n function toUnicode(input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n }\n\n /**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\n function toASCII(input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n }\n\n /*--------------------------------------------------------------------------*/\n\n /** Define the public API */\n punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n 'version': '1.3.2',\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see \n * @memberOf punycode\n * @type Object\n */\n 'ucs2': {\n 'decode': ucs2decode,\n 'encode': ucs2encode\n },\n 'decode': decode,\n 'encode': encode,\n 'toASCII': toASCII,\n 'toUnicode': toUnicode\n };\n\n /** Expose `punycode` */\n // Some AMD build optimizers, like r.js, check for specific condition patterns\n // like the following:\n if (freeExports && freeModule) {\n if (module.exports == freeExports) {\n // in Node.js or RingoJS v0.8.0+\n freeModule.exports = punycode;\n } else {\n // in Narwhal or RingoJS v0.7.0-\n for (key in punycode) {\n punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n }\n }\n } else {\n // in Rhino or a web browser\n root.punycode = punycode;\n }\n })(commonjsGlobal);\n});\nvar util = {\n isString: function isString(arg) {\n return typeof arg === 'string';\n },\n isObject: function isObject(arg) {\n return _typeof(arg) === 'object' && arg !== null;\n },\n isNull: function isNull(arg) {\n return arg === null;\n },\n isNullOrUndefined: function isNullOrUndefined(arg) {\n return arg == null;\n }\n};\n\n// Copyright Joyent, Inc. and other Node contributors.\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nvar decode = function decode(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n var regexp = /\\+/g;\n qs = qs.split(sep);\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr,\n vstr,\n k,\n v;\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (Array.isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n return obj;\n};\n\n// Copyright Joyent, Inc. and other Node contributors.\n\nvar stringifyPrimitive = function stringifyPrimitive(v) {\n switch (_typeof(v)) {\n case 'string':\n return v;\n case 'boolean':\n return v ? 'true' : 'false';\n case 'number':\n return isFinite(v) ? v : '';\n default:\n return '';\n }\n};\nvar encode = function encode(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n if (_typeof(obj) === 'object') {\n return Object.keys(obj).map(function (k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (Array.isArray(obj[k])) {\n return obj[k].map(function (v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n }\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));\n};\nvar querystring = createCommonjsModule(function (module, exports) {\n exports.decode = exports.parse = decode;\n exports.encode = exports.stringify = encode;\n});\nvar parse = urlParse;\nvar resolve = urlResolve;\nvar resolveObject = urlResolveObject;\nvar format$1 = urlFormat;\nvar Url_1 = Url;\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n var u = new Url();\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\nUrl.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + _typeof(url));\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) hostEnd = rest.length;\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1) continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\nUrl.prototype.format = function () {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n var search = this.search || query && '?' + query || '';\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n pathname = pathname.replace(/[?#]/g, function (match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n return protocol + host + pathname + search + hash;\n};\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\nUrl.prototype.resolve = function (relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\nUrl.prototype.resolveObject = function (relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol') result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n result.href = result.format();\n return result;\n }\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/',\n isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/',\n mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname,\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n if (isRelAbs) {\n // it's absolute.\n result.host = relative.host || relative.host === '' ? relative.host : result.host;\n result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === '';\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {\n srcPath.push('');\n }\n var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/';\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n mustEndAbs = mustEndAbs || result.host && srcPath.length;\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\nUrl.prototype.parseHost = function () {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\nvar url = {\n parse: parse,\n resolve: resolve,\n resolveObject: resolveObject,\n format: format$1,\n Url: Url_1\n};\nfunction getPropertyReference(propertyName) {\n for (var i = 0; i < v8.layout.length; i++) {\n for (var key in v8[v8.layout[i]]) {\n if (key === propertyName) return v8[v8.layout[i]][key];\n }\n }\n for (var _i = 0; _i < v8.paint.length; _i++) {\n for (var _key2 in v8[v8.paint[_i]]) {\n if (_key2 === propertyName) return v8[v8.paint[_i]][_key2];\n }\n }\n return null;\n}\nfunction eachSource(style, callback) {\n for (var k in style.sources) {\n callback(style.sources[k]);\n }\n}\nfunction eachLayer(style, callback) {\n var _iterator = _createForOfIteratorHelper(style.layers),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _layer = _step.value;\n callback(_layer);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n}\nfunction eachProperty(style, options, callback) {\n function inner(layer, propertyType) {\n var properties = layer[propertyType];\n if (!properties) return;\n Object.keys(properties).forEach(function (key) {\n callback({\n path: [layer.id, propertyType, key],\n key: key,\n value: properties[key],\n reference: getPropertyReference(key),\n set: function set(x) {\n properties[key] = x;\n }\n });\n });\n }\n eachLayer(style, function (layer) {\n if (options.paint) {\n inner(layer, 'paint');\n }\n if (options.layout) {\n inner(layer, 'layout');\n }\n });\n}\nfunction eachLayout(layer, callback) {\n for (var k in layer) {\n if (k.indexOf('layout') === 0) {\n callback(layer[k], k);\n }\n }\n}\nfunction eachPaint(layer, callback) {\n for (var k in layer) {\n if (k.indexOf('paint') === 0) {\n callback(layer[k], k);\n }\n }\n}\nfunction resolveConstant(style, value) {\n if (typeof value === 'string' && value[0] === '@') {\n return resolveConstant(style, style.constants[value]);\n } else {\n return value;\n }\n}\nfunction isFunction(value) {\n return Array.isArray(value.stops);\n}\nfunction renameProperty(obj, from, to) {\n obj[to] = obj[from];\n delete obj[from];\n}\nfunction migrateToV8(style) {\n style.version = 8;\n eachSource(style, function (source) {\n if (source.type === 'video' && source.url !== undefined) {\n renameProperty(source, 'url', 'urls');\n }\n if (source.type === 'video') {\n source.coordinates.forEach(function (coord) {\n return coord.reverse();\n });\n }\n });\n eachLayer(style, function (layer) {\n eachLayout(layer, function (layout) {\n if (layout['symbol-min-distance'] !== undefined) {\n renameProperty(layout, 'symbol-min-distance', 'symbol-spacing');\n }\n });\n eachPaint(layer, function (paint) {\n if (paint['background-image'] !== undefined) {\n renameProperty(paint, 'background-image', 'background-pattern');\n }\n if (paint['line-image'] !== undefined) {\n renameProperty(paint, 'line-image', 'line-pattern');\n }\n if (paint['fill-image'] !== undefined) {\n renameProperty(paint, 'fill-image', 'fill-pattern');\n }\n });\n });\n eachProperty(style, {\n paint: true,\n layout: true\n }, function (property) {\n var value = resolveConstant(style, property.value);\n if (isFunction(value)) {\n value.stops.forEach(function (stop) {\n stop[1] = resolveConstant(style, stop[1]);\n });\n }\n property.set(value);\n });\n delete style.constants;\n eachLayer(style, function (layer) {\n eachLayout(layer, function (layout) {\n delete layout['text-max-size'];\n delete layout['icon-max-size'];\n });\n eachPaint(layer, function (paint) {\n if (paint['text-size']) {\n if (!layer.layout) layer.layout = {};\n layer.layout['text-size'] = paint['text-size'];\n delete paint['text-size'];\n }\n if (paint['icon-size']) {\n if (!layer.layout) layer.layout = {};\n layer.layout['icon-size'] = paint['icon-size'];\n delete paint['icon-size'];\n }\n });\n });\n function migrateFontstackURL(input) {\n var inputParsed = url.parse(input);\n var inputPathnameParts = inputParsed.pathname.split('/');\n if (inputParsed.protocol !== 'mapbox:') {\n return input;\n } else if (inputParsed.hostname === 'fontstack') {\n return 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf';\n } else if (inputParsed.hostname === 'fonts') {\n return \"mapbox://fonts/\".concat(inputPathnameParts[2], \"/{fontstack}/{range}.pbf\");\n } else ;\n }\n if (style.glyphs) {\n style.glyphs = migrateFontstackURL(style.glyphs);\n }\n function migrateFontStack(font) {\n function splitAndTrim(string) {\n return string.split(',').map(function (s) {\n return s.trim();\n });\n }\n if (Array.isArray(font)) {\n return font;\n } else if (typeof font === 'string') {\n return splitAndTrim(font);\n } else if (_typeof(font) === 'object') {\n font.stops.forEach(function (stop) {\n stop[1] = splitAndTrim(stop[1]);\n });\n return font;\n } else {\n throw new Error('unexpected font value');\n }\n }\n eachLayer(style, function (layer) {\n eachLayout(layer, function (layout) {\n if (layout['text-font']) {\n layout['text-font'] = migrateFontStack(layout['text-font']);\n }\n });\n });\n var firstSymbolLayer = 0;\n for (var i = style.layers.length - 1; i >= 0; i--) {\n var _layer2 = style.layers[i];\n if (_layer2.type !== 'symbol') {\n firstSymbolLayer = i + 1;\n break;\n }\n }\n var symbolLayers = style.layers.splice(firstSymbolLayer);\n symbolLayers.reverse();\n style.layers = style.layers.concat(symbolLayers);\n return style;\n}\nfunction extend(output) {\n for (var _len = arguments.length, inputs = new Array(_len > 1 ? _len - 1 : 0), _key3 = 1; _key3 < _len; _key3++) {\n inputs[_key3 - 1] = arguments[_key3];\n }\n for (var _i2 = 0, _inputs = inputs; _i2 < _inputs.length; _i2++) {\n var input = _inputs[_i2];\n for (var k in input) {\n output[k] = input[k];\n }\n }\n return output;\n}\nvar ParsingError = /*#__PURE__*/function (_Error) {\n function ParsingError(key, message) {\n var _this;\n _classCallCheck(this, ParsingError);\n _this = _callSuper(this, ParsingError, [message]);\n _this.message = message;\n _this.key = key;\n return _this;\n }\n _inherits(ParsingError, _Error);\n return _createClass(ParsingError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nvar Scope = /*#__PURE__*/function () {\n function Scope(parent) {\n var bindings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n _classCallCheck(this, Scope);\n this.parent = parent;\n this.bindings = {};\n var _iterator2 = _createForOfIteratorHelper(bindings),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _step2$value = _slicedToArray(_step2.value, 2),\n name = _step2$value[0],\n _expression = _step2$value[1];\n this.bindings[name] = _expression;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n return _createClass(Scope, [{\n key: \"concat\",\n value: function concat(bindings) {\n return new Scope(this, bindings);\n }\n }, {\n key: \"get\",\n value: function get(name) {\n if (this.bindings[name]) {\n return this.bindings[name];\n }\n if (this.parent) {\n return this.parent.get(name);\n }\n throw new Error(\"\".concat(name, \" not found in scope.\"));\n }\n }, {\n key: \"has\",\n value: function has(name) {\n if (this.bindings[name]) return true;\n return this.parent ? this.parent.has(name) : false;\n }\n }]);\n}();\nvar NullType = {\n kind: 'null'\n};\nvar NumberType = {\n kind: 'number'\n};\nvar StringType = {\n kind: 'string'\n};\nvar BooleanType = {\n kind: 'boolean'\n};\nvar ColorType = {\n kind: 'color'\n};\nvar ObjectType = {\n kind: 'object'\n};\nvar ValueType = {\n kind: 'value'\n};\nvar ErrorType = {\n kind: 'error'\n};\nvar CollatorType = {\n kind: 'collator'\n};\nvar FormattedType = {\n kind: 'formatted'\n};\nvar ResolvedImageType = {\n kind: 'resolvedImage'\n};\nfunction array(itemType, N) {\n return {\n kind: 'array',\n itemType: itemType,\n N: N\n };\n}\nfunction toString(type) {\n if (type.kind === 'array') {\n var itemType = toString(type.itemType);\n return typeof type.N === 'number' ? \"array<\".concat(itemType, \", \").concat(type.N, \">\") : type.itemType.kind === 'value' ? 'array' : \"array<\".concat(itemType, \">\");\n } else {\n return type.kind;\n }\n}\nvar valueMemberTypes = [NullType, NumberType, StringType, BooleanType, ColorType, FormattedType, ObjectType, array(ValueType), ResolvedImageType];\nfunction _checkSubtype(expected, t) {\n if (t.kind === 'error') {\n return null;\n } else if (expected.kind === 'array') {\n if (t.kind === 'array' && (t.N === 0 && t.itemType.kind === 'value' || !_checkSubtype(expected.itemType, t.itemType)) && (typeof expected.N !== 'number' || expected.N === t.N)) {\n return null;\n }\n } else if (expected.kind === t.kind) {\n return null;\n } else if (expected.kind === 'value') {\n for (var _i3 = 0, _valueMemberTypes = valueMemberTypes; _i3 < _valueMemberTypes.length; _i3++) {\n var memberType = _valueMemberTypes[_i3];\n if (!_checkSubtype(memberType, t)) {\n return null;\n }\n }\n }\n return \"Expected \".concat(toString(expected), \" but found \").concat(toString(t), \" instead.\");\n}\nfunction isValidType(provided, allowedTypes) {\n return allowedTypes.some(function (t) {\n return t.kind === provided.kind;\n });\n}\nfunction isValidNativeType(provided, allowedTypes) {\n return allowedTypes.some(function (t) {\n if (t === 'null') {\n return provided === null;\n } else if (t === 'array') {\n return Array.isArray(provided);\n } else if (t === 'object') {\n return provided && !Array.isArray(provided) && _typeof(provided) === 'object';\n } else {\n return t === _typeof(provided);\n }\n });\n}\nvar csscolorparser = createCommonjsModule(function (module, exports) {\n // (c) Dean McNamee , 2012.\n //\n // https://github.com/deanm/css-color-parser-js\n //\n // Permission is hereby granted, free of charge, to any person obtaining a copy\n // of this software and associated documentation files (the \"Software\"), to\n // deal in the Software without restriction, including without limitation the\n // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n // sell copies of the Software, and to permit persons to whom the Software is\n // furnished to do so, subject to the following conditions:\n //\n // The above copyright notice and this permission notice shall be included in\n // all copies or substantial portions of the Software.\n //\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n // IN THE SOFTWARE.\n\n // http://www.w3.org/TR/css3-color/\n var kCSSColorTable = {\n \"transparent\": [0, 0, 0, 0],\n \"aliceblue\": [240, 248, 255, 1],\n \"antiquewhite\": [250, 235, 215, 1],\n \"aqua\": [0, 255, 255, 1],\n \"aquamarine\": [127, 255, 212, 1],\n \"azure\": [240, 255, 255, 1],\n \"beige\": [245, 245, 220, 1],\n \"bisque\": [255, 228, 196, 1],\n \"black\": [0, 0, 0, 1],\n \"blanchedalmond\": [255, 235, 205, 1],\n \"blue\": [0, 0, 255, 1],\n \"blueviolet\": [138, 43, 226, 1],\n \"brown\": [165, 42, 42, 1],\n \"burlywood\": [222, 184, 135, 1],\n \"cadetblue\": [95, 158, 160, 1],\n \"chartreuse\": [127, 255, 0, 1],\n \"chocolate\": [210, 105, 30, 1],\n \"coral\": [255, 127, 80, 1],\n \"cornflowerblue\": [100, 149, 237, 1],\n \"cornsilk\": [255, 248, 220, 1],\n \"crimson\": [220, 20, 60, 1],\n \"cyan\": [0, 255, 255, 1],\n \"darkblue\": [0, 0, 139, 1],\n \"darkcyan\": [0, 139, 139, 1],\n \"darkgoldenrod\": [184, 134, 11, 1],\n \"darkgray\": [169, 169, 169, 1],\n \"darkgreen\": [0, 100, 0, 1],\n \"darkgrey\": [169, 169, 169, 1],\n \"darkkhaki\": [189, 183, 107, 1],\n \"darkmagenta\": [139, 0, 139, 1],\n \"darkolivegreen\": [85, 107, 47, 1],\n \"darkorange\": [255, 140, 0, 1],\n \"darkorchid\": [153, 50, 204, 1],\n \"darkred\": [139, 0, 0, 1],\n \"darksalmon\": [233, 150, 122, 1],\n \"darkseagreen\": [143, 188, 143, 1],\n \"darkslateblue\": [72, 61, 139, 1],\n \"darkslategray\": [47, 79, 79, 1],\n \"darkslategrey\": [47, 79, 79, 1],\n \"darkturquoise\": [0, 206, 209, 1],\n \"darkviolet\": [148, 0, 211, 1],\n \"deeppink\": [255, 20, 147, 1],\n \"deepskyblue\": [0, 191, 255, 1],\n \"dimgray\": [105, 105, 105, 1],\n \"dimgrey\": [105, 105, 105, 1],\n \"dodgerblue\": [30, 144, 255, 1],\n \"firebrick\": [178, 34, 34, 1],\n \"floralwhite\": [255, 250, 240, 1],\n \"forestgreen\": [34, 139, 34, 1],\n \"fuchsia\": [255, 0, 255, 1],\n \"gainsboro\": [220, 220, 220, 1],\n \"ghostwhite\": [248, 248, 255, 1],\n \"gold\": [255, 215, 0, 1],\n \"goldenrod\": [218, 165, 32, 1],\n \"gray\": [128, 128, 128, 1],\n \"green\": [0, 128, 0, 1],\n \"greenyellow\": [173, 255, 47, 1],\n \"grey\": [128, 128, 128, 1],\n \"honeydew\": [240, 255, 240, 1],\n \"hotpink\": [255, 105, 180, 1],\n \"indianred\": [205, 92, 92, 1],\n \"indigo\": [75, 0, 130, 1],\n \"ivory\": [255, 255, 240, 1],\n \"khaki\": [240, 230, 140, 1],\n \"lavender\": [230, 230, 250, 1],\n \"lavenderblush\": [255, 240, 245, 1],\n \"lawngreen\": [124, 252, 0, 1],\n \"lemonchiffon\": [255, 250, 205, 1],\n \"lightblue\": [173, 216, 230, 1],\n \"lightcoral\": [240, 128, 128, 1],\n \"lightcyan\": [224, 255, 255, 1],\n \"lightgoldenrodyellow\": [250, 250, 210, 1],\n \"lightgray\": [211, 211, 211, 1],\n \"lightgreen\": [144, 238, 144, 1],\n \"lightgrey\": [211, 211, 211, 1],\n \"lightpink\": [255, 182, 193, 1],\n \"lightsalmon\": [255, 160, 122, 1],\n \"lightseagreen\": [32, 178, 170, 1],\n \"lightskyblue\": [135, 206, 250, 1],\n \"lightslategray\": [119, 136, 153, 1],\n \"lightslategrey\": [119, 136, 153, 1],\n \"lightsteelblue\": [176, 196, 222, 1],\n \"lightyellow\": [255, 255, 224, 1],\n \"lime\": [0, 255, 0, 1],\n \"limegreen\": [50, 205, 50, 1],\n \"linen\": [250, 240, 230, 1],\n \"magenta\": [255, 0, 255, 1],\n \"maroon\": [128, 0, 0, 1],\n \"mediumaquamarine\": [102, 205, 170, 1],\n \"mediumblue\": [0, 0, 205, 1],\n \"mediumorchid\": [186, 85, 211, 1],\n \"mediumpurple\": [147, 112, 219, 1],\n \"mediumseagreen\": [60, 179, 113, 1],\n \"mediumslateblue\": [123, 104, 238, 1],\n \"mediumspringgreen\": [0, 250, 154, 1],\n \"mediumturquoise\": [72, 209, 204, 1],\n \"mediumvioletred\": [199, 21, 133, 1],\n \"midnightblue\": [25, 25, 112, 1],\n \"mintcream\": [245, 255, 250, 1],\n \"mistyrose\": [255, 228, 225, 1],\n \"moccasin\": [255, 228, 181, 1],\n \"navajowhite\": [255, 222, 173, 1],\n \"navy\": [0, 0, 128, 1],\n \"oldlace\": [253, 245, 230, 1],\n \"olive\": [128, 128, 0, 1],\n \"olivedrab\": [107, 142, 35, 1],\n \"orange\": [255, 165, 0, 1],\n \"orangered\": [255, 69, 0, 1],\n \"orchid\": [218, 112, 214, 1],\n \"palegoldenrod\": [238, 232, 170, 1],\n \"palegreen\": [152, 251, 152, 1],\n \"paleturquoise\": [175, 238, 238, 1],\n \"palevioletred\": [219, 112, 147, 1],\n \"papayawhip\": [255, 239, 213, 1],\n \"peachpuff\": [255, 218, 185, 1],\n \"peru\": [205, 133, 63, 1],\n \"pink\": [255, 192, 203, 1],\n \"plum\": [221, 160, 221, 1],\n \"powderblue\": [176, 224, 230, 1],\n \"purple\": [128, 0, 128, 1],\n \"rebeccapurple\": [102, 51, 153, 1],\n \"red\": [255, 0, 0, 1],\n \"rosybrown\": [188, 143, 143, 1],\n \"royalblue\": [65, 105, 225, 1],\n \"saddlebrown\": [139, 69, 19, 1],\n \"salmon\": [250, 128, 114, 1],\n \"sandybrown\": [244, 164, 96, 1],\n \"seagreen\": [46, 139, 87, 1],\n \"seashell\": [255, 245, 238, 1],\n \"sienna\": [160, 82, 45, 1],\n \"silver\": [192, 192, 192, 1],\n \"skyblue\": [135, 206, 235, 1],\n \"slateblue\": [106, 90, 205, 1],\n \"slategray\": [112, 128, 144, 1],\n \"slategrey\": [112, 128, 144, 1],\n \"snow\": [255, 250, 250, 1],\n \"springgreen\": [0, 255, 127, 1],\n \"steelblue\": [70, 130, 180, 1],\n \"tan\": [210, 180, 140, 1],\n \"teal\": [0, 128, 128, 1],\n \"thistle\": [216, 191, 216, 1],\n \"tomato\": [255, 99, 71, 1],\n \"turquoise\": [64, 224, 208, 1],\n \"violet\": [238, 130, 238, 1],\n \"wheat\": [245, 222, 179, 1],\n \"white\": [255, 255, 255, 1],\n \"whitesmoke\": [245, 245, 245, 1],\n \"yellow\": [255, 255, 0, 1],\n \"yellowgreen\": [154, 205, 50, 1]\n };\n function clamp_css_byte(i) {\n // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n }\n function clamp_css_float(f) {\n // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n }\n function parse_css_int(str) {\n // int or percentage.\n if (str[str.length - 1] === '%') return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n }\n function parse_css_float(str) {\n // float or percentage.\n if (str[str.length - 1] === '%') return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n }\n function css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;else if (h > 1) h -= 1;\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n return m1;\n }\n function parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [(iv & 0xf00) >> 4 | (iv & 0xf00) >> 8, iv & 0xf0 | (iv & 0xf0) >> 4, iv & 0xf | (iv & 0xf) << 4, 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1];\n }\n return null;\n }\n var op = str.indexOf('('),\n ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op + 1, ep - (op + 1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]), parse_css_int(params[1]), parse_css_int(params[2]), alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (parseFloat(params[0]) % 360 + 360) % 360 / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h + 1 / 3) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h - 1 / 3) * 255), alpha];\n default:\n return null;\n }\n }\n return null;\n }\n try {\n exports.parseCSSColor = parseCSSColor;\n } catch (e) {}\n});\nvar Color = /*#__PURE__*/function () {\n function Color(r, g, b) {\n var a = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n _classCallCheck(this, Color);\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n }\n return _createClass(Color, [{\n key: \"toString\",\n value: function toString() {\n var _this$toArray = this.toArray(),\n _this$toArray2 = _slicedToArray(_this$toArray, 4),\n r = _this$toArray2[0],\n g = _this$toArray2[1],\n b = _this$toArray2[2],\n a = _this$toArray2[3];\n return \"rgba(\".concat(Math.round(r), \",\").concat(Math.round(g), \",\").concat(Math.round(b), \",\").concat(a, \")\");\n }\n }, {\n key: \"toArray\",\n value: function toArray() {\n var r = this.r,\n g = this.g,\n b = this.b,\n a = this.a;\n return a === 0 ? [0, 0, 0, 0] : [r * 255 / a, g * 255 / a, b * 255 / a, a];\n }\n }], [{\n key: \"parse\",\n value: function parse(input) {\n if (!input) {\n return undefined;\n }\n if (input instanceof Color) {\n return input;\n }\n if (typeof input !== 'string') {\n return undefined;\n }\n var rgba = csscolorparser.parseCSSColor(input);\n if (!rgba) {\n return undefined;\n }\n return new Color(rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3]);\n }\n }]);\n}();\nColor.black = new Color(0, 0, 0, 1);\nColor.white = new Color(1, 1, 1, 1);\nColor.transparent = new Color(0, 0, 0, 0);\nColor.red = new Color(1, 0, 0, 1);\nColor.blue = new Color(0, 0, 1, 1);\nvar Collator = /*#__PURE__*/function () {\n function Collator(caseSensitive, diacriticSensitive, locale) {\n _classCallCheck(this, Collator);\n if (caseSensitive) this.sensitivity = diacriticSensitive ? 'variant' : 'case';else this.sensitivity = diacriticSensitive ? 'accent' : 'base';\n this.locale = locale;\n this.collator = new Intl.Collator(this.locale ? this.locale : [], {\n sensitivity: this.sensitivity,\n usage: 'search'\n });\n }\n return _createClass(Collator, [{\n key: \"compare\",\n value: function compare(lhs, rhs) {\n return this.collator.compare(lhs, rhs);\n }\n }, {\n key: \"resolvedLocale\",\n value: function resolvedLocale() {\n return new Intl.Collator(this.locale ? this.locale : []).resolvedOptions().locale;\n }\n }]);\n}();\nvar FormattedSection = /*#__PURE__*/_createClass(function FormattedSection(text, image, scale, fontStack, textColor) {\n _classCallCheck(this, FormattedSection);\n this.text = text;\n this.image = image;\n this.scale = scale;\n this.fontStack = fontStack;\n this.textColor = textColor;\n});\nvar Formatted = /*#__PURE__*/function () {\n function Formatted(sections) {\n _classCallCheck(this, Formatted);\n this.sections = sections;\n }\n return _createClass(Formatted, [{\n key: \"isEmpty\",\n value: function isEmpty() {\n if (this.sections.length === 0) return true;\n return !this.sections.some(function (section) {\n return section.text.length !== 0 || section.image && section.image.name.length !== 0;\n });\n }\n }, {\n key: \"toString\",\n value: function toString() {\n if (this.sections.length === 0) return '';\n return this.sections.map(function (section) {\n return section.text;\n }).join('');\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['format'];\n var _iterator3 = _createForOfIteratorHelper(this.sections),\n _step3;\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var section = _step3.value;\n if (section.image) {\n serialized.push(['image', section.image.name]);\n continue;\n }\n serialized.push(section.text);\n var options = {};\n if (section.fontStack) {\n options['text-font'] = ['literal', section.fontStack.split(',')];\n }\n if (section.scale) {\n options['font-scale'] = section.scale;\n }\n if (section.textColor) {\n options['text-color'] = ['rgba'].concat(section.textColor.toArray());\n }\n serialized.push(options);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n return serialized;\n }\n }], [{\n key: \"fromString\",\n value: function fromString(unformatted) {\n return new Formatted([new FormattedSection(unformatted, null, null, null, null)]);\n }\n }, {\n key: \"factory\",\n value: function factory(text) {\n if (text instanceof Formatted) {\n return text;\n } else {\n return Formatted.fromString(text);\n }\n }\n }]);\n}();\nvar ResolvedImage = /*#__PURE__*/function () {\n function ResolvedImage(options) {\n _classCallCheck(this, ResolvedImage);\n this.name = options.name;\n this.available = options.available;\n }\n return _createClass(ResolvedImage, [{\n key: \"toString\",\n value: function toString() {\n return this.name;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['image', this.name];\n }\n }], [{\n key: \"fromString\",\n value: function fromString(name) {\n if (!name) return null;\n return new ResolvedImage({\n name: name,\n available: false\n });\n }\n }]);\n}();\nfunction validateRGBA(r, g, b, a) {\n if (!(typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255)) {\n var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b];\n return \"Invalid rgba value [\".concat(value.join(', '), \"]: 'r', 'g', and 'b' must be between 0 and 255.\");\n }\n if (!(typeof a === 'undefined' || typeof a === 'number' && a >= 0 && a <= 1)) {\n return \"Invalid rgba value [\".concat([r, g, b, a].join(', '), \"]: 'a' must be between 0 and 1.\");\n }\n return null;\n}\nfunction isValue(mixed) {\n if (mixed === null) {\n return true;\n } else if (typeof mixed === 'string') {\n return true;\n } else if (typeof mixed === 'boolean') {\n return true;\n } else if (typeof mixed === 'number') {\n return true;\n } else if (mixed instanceof Color) {\n return true;\n } else if (mixed instanceof Collator) {\n return true;\n } else if (mixed instanceof Formatted) {\n return true;\n } else if (mixed instanceof ResolvedImage) {\n return true;\n } else if (Array.isArray(mixed)) {\n var _iterator4 = _createForOfIteratorHelper(mixed),\n _step4;\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var item = _step4.value;\n if (!isValue(item)) {\n return false;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n return true;\n } else if (_typeof(mixed) === 'object') {\n for (var key in mixed) {\n if (!isValue(mixed[key])) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n}\nfunction typeOf(value) {\n if (value === null) {\n return NullType;\n } else if (typeof value === 'string') {\n return StringType;\n } else if (typeof value === 'boolean') {\n return BooleanType;\n } else if (typeof value === 'number') {\n return NumberType;\n } else if (value instanceof Color) {\n return ColorType;\n } else if (value instanceof Collator) {\n return CollatorType;\n } else if (value instanceof Formatted) {\n return FormattedType;\n } else if (value instanceof ResolvedImage) {\n return ResolvedImageType;\n } else if (Array.isArray(value)) {\n var length = value.length;\n var itemType;\n var _iterator5 = _createForOfIteratorHelper(value),\n _step5;\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var item = _step5.value;\n var t = typeOf(item);\n if (!itemType) {\n itemType = t;\n } else if (itemType === t) {\n continue;\n } else {\n itemType = ValueType;\n break;\n }\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n return array(itemType || ValueType, length);\n } else {\n return ObjectType;\n }\n}\nfunction toString$1(value) {\n var type = _typeof(value);\n if (value === null) {\n return '';\n } else if (type === 'string' || type === 'number' || type === 'boolean') {\n return String(value);\n } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) {\n return value.toString();\n } else {\n return JSON.stringify(value);\n }\n}\nvar Literal = /*#__PURE__*/function () {\n function Literal(type, value) {\n _classCallCheck(this, Literal);\n this.type = type;\n this.value = value;\n }\n return _createClass(Literal, [{\n key: \"evaluate\",\n value: function evaluate() {\n return this.value;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild() {}\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.type.kind === 'array' || this.type.kind === 'object') {\n return ['literal', this.value];\n } else if (this.value instanceof Color) {\n return ['rgba'].concat(this.value.toArray());\n } else if (this.value instanceof Formatted) {\n return this.value.serialize();\n } else {\n return this.value;\n }\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"'literal' expression requires exactly one argument, but found \".concat(args.length - 1, \" instead.\"));\n if (!isValue(args[1])) return context.error(\"invalid value\");\n var value = args[1];\n var type = typeOf(value);\n var expected = context.expectedType;\n if (type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0)) {\n type = expected;\n }\n return new Literal(type, value);\n }\n }]);\n}();\nvar RuntimeError = /*#__PURE__*/function () {\n function RuntimeError(message) {\n _classCallCheck(this, RuntimeError);\n this.name = 'ExpressionEvaluationError';\n this.message = message;\n }\n return _createClass(RuntimeError, [{\n key: \"toJSON\",\n value: function toJSON() {\n return this.message;\n }\n }]);\n}();\nvar types = {\n string: StringType,\n number: NumberType,\n \"boolean\": BooleanType,\n object: ObjectType\n};\nvar Assertion = /*#__PURE__*/function () {\n function Assertion(type, args) {\n _classCallCheck(this, Assertion);\n this.type = type;\n this.args = args;\n }\n return _createClass(Assertion, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n for (var i = 0; i < this.args.length; i++) {\n var value = this.args[i].evaluate(ctx);\n var _error = _checkSubtype(this.type, typeOf(value));\n if (!_error) {\n return value;\n } else if (i === this.args.length - 1) {\n throw new RuntimeError(\"Expected value to be of type \".concat(toString(this.type), \", but found \").concat(toString(typeOf(value)), \" instead.\"));\n }\n }\n return null;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.args.every(function (arg) {\n return arg.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var type = this.type;\n var serialized = [type.kind];\n if (type.kind === 'array') {\n var itemType = type.itemType;\n if (itemType.kind === 'string' || itemType.kind === 'number' || itemType.kind === 'boolean') {\n serialized.push(itemType.kind);\n var N = type.N;\n if (typeof N === 'number' || this.args.length > 1) {\n serialized.push(N);\n }\n }\n }\n return serialized.concat(this.args.map(function (arg) {\n return arg.serialize();\n }));\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) return context.error(\"Expected at least one argument.\");\n var i = 1;\n var type;\n var name = args[0];\n if (name === 'array') {\n var itemType;\n if (args.length > 2) {\n var _type = args[1];\n if (typeof _type !== 'string' || !(_type in types) || _type === 'object') return context.error('The item type argument of \"array\" must be one of string, number, boolean', 1);\n itemType = types[_type];\n i++;\n } else {\n itemType = ValueType;\n }\n var N;\n if (args.length > 3) {\n if (args[2] !== null && (typeof args[2] !== 'number' || args[2] < 0 || args[2] !== Math.floor(args[2]))) {\n return context.error('The length argument to \"array\" must be a positive integer literal', 2);\n }\n N = args[2];\n i++;\n }\n type = array(itemType, N);\n } else {\n type = types[name];\n }\n var parsed = [];\n for (; i < args.length; i++) {\n var input = context.parse(args[i], i, ValueType);\n if (!input) return null;\n parsed.push(input);\n }\n return new Assertion(type, parsed);\n }\n }]);\n}();\nvar FormatExpression = /*#__PURE__*/function () {\n function FormatExpression(sections) {\n _classCallCheck(this, FormatExpression);\n this.type = FormattedType;\n this.sections = sections;\n }\n return _createClass(FormatExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var evaluateSection = function evaluateSection(section) {\n var evaluatedContent = section.content.evaluate(ctx);\n if (typeOf(evaluatedContent) === ResolvedImageType) {\n return new FormattedSection('', evaluatedContent, null, null, null);\n }\n return new FormattedSection(toString$1(evaluatedContent), null, section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null);\n };\n return new Formatted(this.sections.map(evaluateSection));\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n var _iterator6 = _createForOfIteratorHelper(this.sections),\n _step6;\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var section = _step6.value;\n fn(section.content);\n if (section.scale) {\n fn(section.scale);\n }\n if (section.font) {\n fn(section.font);\n }\n if (section.textColor) {\n fn(section.textColor);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['format'];\n var _iterator7 = _createForOfIteratorHelper(this.sections),\n _step7;\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var section = _step7.value;\n serialized.push(section.content.serialize());\n var options = {};\n if (section.scale) {\n options['font-scale'] = section.scale.serialize();\n }\n if (section.font) {\n options['text-font'] = section.font.serialize();\n }\n if (section.textColor) {\n options['text-color'] = section.textColor.serialize();\n }\n serialized.push(options);\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) {\n return context.error(\"Expected at least one argument.\");\n }\n var firstArg = args[1];\n if (!Array.isArray(firstArg) && _typeof(firstArg) === 'object') {\n return context.error(\"First argument must be an image or text section.\");\n }\n var sections = [];\n var nextTokenMayBeObject = false;\n for (var i = 1; i <= args.length - 1; ++i) {\n var arg = args[i];\n if (nextTokenMayBeObject && _typeof(arg) === 'object' && !Array.isArray(arg)) {\n nextTokenMayBeObject = false;\n var scale = null;\n if (arg['font-scale']) {\n scale = context.parse(arg['font-scale'], 1, NumberType);\n if (!scale) return null;\n }\n var font = null;\n if (arg['text-font']) {\n font = context.parse(arg['text-font'], 1, array(StringType));\n if (!font) return null;\n }\n var textColor = null;\n if (arg['text-color']) {\n textColor = context.parse(arg['text-color'], 1, ColorType);\n if (!textColor) return null;\n }\n var lastExpression = sections[sections.length - 1];\n lastExpression.scale = scale;\n lastExpression.font = font;\n lastExpression.textColor = textColor;\n } else {\n var content = context.parse(args[i], 1, ValueType);\n if (!content) return null;\n var kind = content.type.kind;\n if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') return context.error(\"Formatted text type must be 'string', 'value', 'image' or 'null'.\");\n nextTokenMayBeObject = true;\n sections.push({\n content: content,\n scale: null,\n font: null,\n textColor: null\n });\n }\n }\n return new FormatExpression(sections);\n }\n }]);\n}();\nvar ImageExpression = /*#__PURE__*/function () {\n function ImageExpression(input) {\n _classCallCheck(this, ImageExpression);\n this.type = ResolvedImageType;\n this.input = input;\n }\n return _createClass(ImageExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var evaluatedImageName = this.input.evaluate(ctx);\n var value = ResolvedImage.fromString(evaluatedImageName);\n if (value && ctx.availableImages) value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1;\n return value;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['image', this.input.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) {\n return context.error(\"Expected two arguments.\");\n }\n var name = context.parse(args[1], 1, StringType);\n if (!name) return context.error(\"No image name provided.\");\n return new ImageExpression(name);\n }\n }]);\n}();\nvar types$1 = {\n 'to-boolean': BooleanType,\n 'to-color': ColorType,\n 'to-number': NumberType,\n 'to-string': StringType\n};\nvar Coercion = /*#__PURE__*/function () {\n function Coercion(type, args) {\n _classCallCheck(this, Coercion);\n this.type = type;\n this.args = args;\n }\n return _createClass(Coercion, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n if (this.type.kind === 'boolean') {\n return Boolean(this.args[0].evaluate(ctx));\n } else if (this.type.kind === 'color') {\n var input;\n var _error2;\n var _iterator8 = _createForOfIteratorHelper(this.args),\n _step8;\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n var arg = _step8.value;\n input = arg.evaluate(ctx);\n _error2 = null;\n if (input instanceof Color) {\n return input;\n } else if (typeof input === 'string') {\n var c = ctx.parseColor(input);\n if (c) return c;\n } else if (Array.isArray(input)) {\n if (input.length < 3 || input.length > 4) {\n _error2 = \"Invalid rbga value \".concat(JSON.stringify(input), \": expected an array containing either three or four numeric values.\");\n } else {\n _error2 = validateRGBA(input[0], input[1], input[2], input[3]);\n }\n if (!_error2) {\n return new Color(input[0] / 255, input[1] / 255, input[2] / 255, input[3]);\n }\n }\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n throw new RuntimeError(_error2 || \"Could not parse color from value '\".concat(typeof input === 'string' ? input : String(JSON.stringify(input)), \"'\"));\n } else if (this.type.kind === 'number') {\n var value = null;\n var _iterator9 = _createForOfIteratorHelper(this.args),\n _step9;\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n var _arg = _step9.value;\n value = _arg.evaluate(ctx);\n if (value === null) return 0;\n var num = Number(value);\n if (isNaN(num)) continue;\n return num;\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n throw new RuntimeError(\"Could not convert \".concat(JSON.stringify(value), \" to number.\"));\n } else if (this.type.kind === 'formatted') {\n return Formatted.fromString(toString$1(this.args[0].evaluate(ctx)));\n } else if (this.type.kind === 'resolvedImage') {\n return ResolvedImage.fromString(toString$1(this.args[0].evaluate(ctx)));\n } else {\n return toString$1(this.args[0].evaluate(ctx));\n }\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.args.every(function (arg) {\n return arg.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.type.kind === 'formatted') {\n return new FormatExpression([{\n content: this.args[0],\n scale: null,\n font: null,\n textColor: null\n }]).serialize();\n }\n if (this.type.kind === 'resolvedImage') {\n return new ImageExpression(this.args[0]).serialize();\n }\n var serialized = [\"to-\".concat(this.type.kind)];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) return context.error(\"Expected at least one argument.\");\n var name = args[0];\n if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) return context.error(\"Expected one argument.\");\n var type = types$1[name];\n var parsed = [];\n for (var i = 1; i < args.length; i++) {\n var input = context.parse(args[i], i, ValueType);\n if (!input) return null;\n parsed.push(input);\n }\n return new Coercion(type, parsed);\n }\n }]);\n}();\nvar geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];\nvar EvaluationContext = /*#__PURE__*/function () {\n function EvaluationContext() {\n _classCallCheck(this, EvaluationContext);\n this.globals = null;\n this.feature = null;\n this.featureState = null;\n this.formattedSection = null;\n this._parseColorCache = {};\n this.availableImages = null;\n this.canonical = null;\n }\n return _createClass(EvaluationContext, [{\n key: \"id\",\n value: function id() {\n return this.feature && 'id' in this.feature ? this.feature.id : null;\n }\n }, {\n key: \"geometryType\",\n value: function geometryType() {\n return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null;\n }\n }, {\n key: \"geometry\",\n value: function geometry() {\n return this.feature && 'geometry' in this.feature ? this.feature.geometry : null;\n }\n }, {\n key: \"canonicalID\",\n value: function canonicalID() {\n return this.canonical;\n }\n }, {\n key: \"properties\",\n value: function properties() {\n return this.feature && this.feature.properties || {};\n }\n }, {\n key: \"parseColor\",\n value: function parseColor(input) {\n var cached = this._parseColorCache[input];\n if (!cached) {\n cached = this._parseColorCache[input] = Color.parse(input);\n }\n return cached;\n }\n }]);\n}();\nvar CompoundExpression = /*#__PURE__*/function () {\n function CompoundExpression(name, type, evaluate, args) {\n _classCallCheck(this, CompoundExpression);\n this.name = name;\n this.type = type;\n this._evaluate = evaluate;\n this.args = args;\n }\n return _createClass(CompoundExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return this._evaluate(ctx, this.args);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return [this.name].concat(this.args.map(function (arg) {\n return arg.serialize();\n }));\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n var op = args[0];\n var definition = CompoundExpression.definitions[op];\n if (!definition) {\n return context.error(\"Unknown expression \\\"\".concat(op, \"\\\". If you wanted a literal array, use [\\\"literal\\\", [...]].\"), 0);\n }\n var type = Array.isArray(definition) ? definition[0] : definition.type;\n var availableOverloads = Array.isArray(definition) ? [[definition[1], definition[2]]] : definition.overloads;\n var overloads = availableOverloads.filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 1),\n signature = _ref2[0];\n return !Array.isArray(signature) || signature.length === args.length - 1;\n });\n var signatureContext = null;\n var _iterator10 = _createForOfIteratorHelper(overloads),\n _step10;\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n var _step10$value = _slicedToArray(_step10.value, 2),\n params = _step10$value[0],\n evaluate = _step10$value[1];\n signatureContext = new ParsingContext(context.registry, context.path, null, context.scope);\n var parsedArgs = [];\n var argParseFailed = false;\n for (var _i4 = 1; _i4 < args.length; _i4++) {\n var arg = args[_i4];\n var expectedType = Array.isArray(params) ? params[_i4 - 1] : params.type;\n var _parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType);\n if (!_parsed) {\n argParseFailed = true;\n break;\n }\n parsedArgs.push(_parsed);\n }\n if (argParseFailed) {\n continue;\n }\n if (Array.isArray(params)) {\n if (params.length !== parsedArgs.length) {\n signatureContext.error(\"Expected \".concat(params.length, \" arguments, but found \").concat(parsedArgs.length, \" instead.\"));\n continue;\n }\n }\n for (var _i5 = 0; _i5 < parsedArgs.length; _i5++) {\n var _expected = Array.isArray(params) ? params[_i5] : params.type;\n var _arg2 = parsedArgs[_i5];\n signatureContext.concat(_i5 + 1).checkSubtype(_expected, _arg2.type);\n }\n if (signatureContext.errors.length === 0) {\n return new CompoundExpression(op, type, evaluate, parsedArgs);\n }\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n if (overloads.length === 1) {\n var _context$errors;\n (_context$errors = context.errors).push.apply(_context$errors, _toConsumableArray(signatureContext.errors));\n } else {\n var expected = overloads.length ? overloads : availableOverloads;\n var signatures = expected.map(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 1),\n params = _ref4[0];\n return stringifySignature(params);\n }).join(' | ');\n var actualTypes = [];\n for (var i = 1; i < args.length; i++) {\n var parsed = context.parse(args[i], 1 + actualTypes.length);\n if (!parsed) return null;\n actualTypes.push(toString(parsed.type));\n }\n context.error(\"Expected arguments of type \".concat(signatures, \", but found (\").concat(actualTypes.join(', '), \") instead.\"));\n }\n return null;\n }\n }, {\n key: \"register\",\n value: function register(registry, definitions) {\n CompoundExpression.definitions = definitions;\n for (var name in definitions) {\n registry[name] = CompoundExpression;\n }\n }\n }]);\n}();\nfunction stringifySignature(signature) {\n if (Array.isArray(signature)) {\n return \"(\".concat(signature.map(toString).join(', '), \")\");\n } else {\n return \"(\".concat(toString(signature.type), \"...)\");\n }\n}\nvar CollatorExpression = /*#__PURE__*/function () {\n function CollatorExpression(caseSensitive, diacriticSensitive, locale) {\n _classCallCheck(this, CollatorExpression);\n this.type = CollatorType;\n this.locale = locale;\n this.caseSensitive = caseSensitive;\n this.diacriticSensitive = diacriticSensitive;\n }\n return _createClass(CollatorExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.caseSensitive);\n fn(this.diacriticSensitive);\n if (this.locale) {\n fn(this.locale);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var options = {};\n options['case-sensitive'] = this.caseSensitive.serialize();\n options['diacritic-sensitive'] = this.diacriticSensitive.serialize();\n if (this.locale) {\n options['locale'] = this.locale.serialize();\n }\n return ['collator', options];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"Expected one argument.\");\n var options = args[1];\n if (_typeof(options) !== 'object' || Array.isArray(options)) return context.error(\"Collator options argument must be an object.\");\n var caseSensitive = context.parse(options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType);\n if (!caseSensitive) return null;\n var diacriticSensitive = context.parse(options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType);\n if (!diacriticSensitive) return null;\n var locale = null;\n if (options['locale']) {\n locale = context.parse(options['locale'], 1, StringType);\n if (!locale) return null;\n }\n return new CollatorExpression(caseSensitive, diacriticSensitive, locale);\n }\n }]);\n}();\nvar EXTENT = 8192;\nfunction updateBBox(bbox, coord) {\n bbox[0] = Math.min(bbox[0], coord[0]);\n bbox[1] = Math.min(bbox[1], coord[1]);\n bbox[2] = Math.max(bbox[2], coord[0]);\n bbox[3] = Math.max(bbox[3], coord[1]);\n}\nfunction mercatorXfromLng(lng) {\n return (180 + lng) / 360;\n}\nfunction mercatorYfromLat(lat) {\n return (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))) / 360;\n}\nfunction boxWithinBox(bbox1, bbox2) {\n if (bbox1[0] <= bbox2[0]) return false;\n if (bbox1[2] >= bbox2[2]) return false;\n if (bbox1[1] <= bbox2[1]) return false;\n if (bbox1[3] >= bbox2[3]) return false;\n return true;\n}\nfunction getTileCoordinates(p, canonical) {\n var x = mercatorXfromLng(p[0]);\n var y = mercatorYfromLat(p[1]);\n var tilesAtZoom = Math.pow(2, canonical.z);\n return [Math.round(x * tilesAtZoom * EXTENT), Math.round(y * tilesAtZoom * EXTENT)];\n}\nfunction onBoundary(p, p1, p2) {\n var x1 = p[0] - p1[0];\n var y1 = p[1] - p1[1];\n var x2 = p[0] - p2[0];\n var y2 = p[1] - p2[1];\n return x1 * y2 - x2 * y1 === 0 && x1 * x2 <= 0 && y1 * y2 <= 0;\n}\nfunction rayIntersect(p, p1, p2) {\n return p1[1] > p[1] !== p2[1] > p[1] && p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0];\n}\nfunction pointWithinPolygon(point, rings) {\n var inside = false;\n for (var i = 0, len = rings.length; i < len; i++) {\n var ring = rings[i];\n for (var j = 0, len2 = ring.length; j < len2 - 1; j++) {\n if (onBoundary(point, ring[j], ring[j + 1])) return false;\n if (rayIntersect(point, ring[j], ring[j + 1])) inside = !inside;\n }\n }\n return inside;\n}\nfunction pointWithinPolygons(point, polygons) {\n for (var i = 0; i < polygons.length; i++) {\n if (pointWithinPolygon(point, polygons[i])) return true;\n }\n return false;\n}\nfunction perp(v1, v2) {\n return v1[0] * v2[1] - v1[1] * v2[0];\n}\nfunction twoSided(p1, p2, q1, q2) {\n var x1 = p1[0] - q1[0];\n var y1 = p1[1] - q1[1];\n var x2 = p2[0] - q1[0];\n var y2 = p2[1] - q1[1];\n var x3 = q2[0] - q1[0];\n var y3 = q2[1] - q1[1];\n var det1 = x1 * y3 - x3 * y1;\n var det2 = x2 * y3 - x3 * y2;\n if (det1 > 0 && det2 < 0 || det1 < 0 && det2 > 0) return true;\n return false;\n}\nfunction lineIntersectLine(a, b, c, d) {\n var vectorP = [b[0] - a[0], b[1] - a[1]];\n var vectorQ = [d[0] - c[0], d[1] - c[1]];\n if (perp(vectorQ, vectorP) === 0) return false;\n if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) return true;\n return false;\n}\nfunction lineIntersectPolygon(p1, p2, polygon) {\n var _iterator11 = _createForOfIteratorHelper(polygon),\n _step11;\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n var ring = _step11.value;\n for (var j = 0; j < ring.length - 1; ++j) {\n if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) {\n return true;\n }\n }\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n return false;\n}\nfunction lineStringWithinPolygon(line, polygon) {\n for (var i = 0; i < line.length; ++i) {\n if (!pointWithinPolygon(line[i], polygon)) {\n return false;\n }\n }\n for (var _i6 = 0; _i6 < line.length - 1; ++_i6) {\n if (lineIntersectPolygon(line[_i6], line[_i6 + 1], polygon)) {\n return false;\n }\n }\n return true;\n}\nfunction lineStringWithinPolygons(line, polygons) {\n for (var i = 0; i < polygons.length; i++) {\n if (lineStringWithinPolygon(line, polygons[i])) return true;\n }\n return false;\n}\nfunction getTilePolygon(coordinates, bbox, canonical) {\n var polygon = [];\n for (var i = 0; i < coordinates.length; i++) {\n var ring = [];\n for (var j = 0; j < coordinates[i].length; j++) {\n var coord = getTileCoordinates(coordinates[i][j], canonical);\n updateBBox(bbox, coord);\n ring.push(coord);\n }\n polygon.push(ring);\n }\n return polygon;\n}\nfunction getTilePolygons(coordinates, bbox, canonical) {\n var polygons = [];\n for (var i = 0; i < coordinates.length; i++) {\n var polygon = getTilePolygon(coordinates[i], bbox, canonical);\n polygons.push(polygon);\n }\n return polygons;\n}\nfunction updatePoint(p, bbox, polyBBox, worldSize) {\n if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) {\n var halfWorldSize = worldSize * 0.5;\n var shift = p[0] - polyBBox[0] > halfWorldSize ? -worldSize : polyBBox[0] - p[0] > halfWorldSize ? worldSize : 0;\n if (shift === 0) {\n shift = p[0] - polyBBox[2] > halfWorldSize ? -worldSize : polyBBox[2] - p[0] > halfWorldSize ? worldSize : 0;\n }\n p[0] += shift;\n }\n updateBBox(bbox, p);\n}\nfunction resetBBox(bbox) {\n bbox[0] = bbox[1] = Infinity;\n bbox[2] = bbox[3] = -Infinity;\n}\nfunction getTilePoints(geometry, pointBBox, polyBBox, canonical) {\n var worldSize = Math.pow(2, canonical.z) * EXTENT;\n var shifts = [canonical.x * EXTENT, canonical.y * EXTENT];\n var tilePoints = [];\n var _iterator12 = _createForOfIteratorHelper(geometry),\n _step12;\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n var points = _step12.value;\n var _iterator13 = _createForOfIteratorHelper(points),\n _step13;\n try {\n for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {\n var point = _step13.value;\n var p = [point.x + shifts[0], point.y + shifts[1]];\n updatePoint(p, pointBBox, polyBBox, worldSize);\n tilePoints.push(p);\n }\n } catch (err) {\n _iterator13.e(err);\n } finally {\n _iterator13.f();\n }\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n return tilePoints;\n}\nfunction getTileLines(geometry, lineBBox, polyBBox, canonical) {\n var worldSize = Math.pow(2, canonical.z) * EXTENT;\n var shifts = [canonical.x * EXTENT, canonical.y * EXTENT];\n var tileLines = [];\n var _iterator14 = _createForOfIteratorHelper(geometry),\n _step14;\n try {\n for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {\n var _line = _step14.value;\n var tileLine = [];\n var _iterator17 = _createForOfIteratorHelper(_line),\n _step17;\n try {\n for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {\n var point = _step17.value;\n var _p = [point.x + shifts[0], point.y + shifts[1]];\n updateBBox(lineBBox, _p);\n tileLine.push(_p);\n }\n } catch (err) {\n _iterator17.e(err);\n } finally {\n _iterator17.f();\n }\n tileLines.push(tileLine);\n }\n } catch (err) {\n _iterator14.e(err);\n } finally {\n _iterator14.f();\n }\n if (lineBBox[2] - lineBBox[0] <= worldSize / 2) {\n resetBBox(lineBBox);\n var _iterator15 = _createForOfIteratorHelper(tileLines),\n _step15;\n try {\n for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {\n var line = _step15.value;\n var _iterator16 = _createForOfIteratorHelper(line),\n _step16;\n try {\n for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {\n var p = _step16.value;\n updatePoint(p, lineBBox, polyBBox, worldSize);\n }\n } catch (err) {\n _iterator16.e(err);\n } finally {\n _iterator16.f();\n }\n }\n } catch (err) {\n _iterator15.e(err);\n } finally {\n _iterator15.f();\n }\n }\n return tileLines;\n}\nfunction pointsWithinPolygons(ctx, polygonGeometry) {\n var pointBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var polyBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var canonical = ctx.canonicalID();\n if (polygonGeometry.type === 'Polygon') {\n var tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);\n var tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);\n if (!boxWithinBox(pointBBox, polyBBox)) return false;\n var _iterator18 = _createForOfIteratorHelper(tilePoints),\n _step18;\n try {\n for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {\n var point = _step18.value;\n if (!pointWithinPolygon(point, tilePolygon)) return false;\n }\n } catch (err) {\n _iterator18.e(err);\n } finally {\n _iterator18.f();\n }\n }\n if (polygonGeometry.type === 'MultiPolygon') {\n var tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);\n var _tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);\n if (!boxWithinBox(pointBBox, polyBBox)) return false;\n var _iterator19 = _createForOfIteratorHelper(_tilePoints),\n _step19;\n try {\n for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {\n var _point = _step19.value;\n if (!pointWithinPolygons(_point, tilePolygons)) return false;\n }\n } catch (err) {\n _iterator19.e(err);\n } finally {\n _iterator19.f();\n }\n }\n return true;\n}\nfunction linesWithinPolygons(ctx, polygonGeometry) {\n var lineBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var polyBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var canonical = ctx.canonicalID();\n if (polygonGeometry.type === 'Polygon') {\n var tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);\n var tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);\n if (!boxWithinBox(lineBBox, polyBBox)) return false;\n var _iterator20 = _createForOfIteratorHelper(tileLines),\n _step20;\n try {\n for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {\n var line = _step20.value;\n if (!lineStringWithinPolygon(line, tilePolygon)) return false;\n }\n } catch (err) {\n _iterator20.e(err);\n } finally {\n _iterator20.f();\n }\n }\n if (polygonGeometry.type === 'MultiPolygon') {\n var tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);\n var _tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);\n if (!boxWithinBox(lineBBox, polyBBox)) return false;\n var _iterator21 = _createForOfIteratorHelper(_tileLines),\n _step21;\n try {\n for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {\n var _line2 = _step21.value;\n if (!lineStringWithinPolygons(_line2, tilePolygons)) return false;\n }\n } catch (err) {\n _iterator21.e(err);\n } finally {\n _iterator21.f();\n }\n }\n return true;\n}\nvar Within = /*#__PURE__*/function () {\n function Within(geojson, geometries) {\n _classCallCheck(this, Within);\n this.type = BooleanType;\n this.geojson = geojson;\n this.geometries = geometries;\n }\n return _createClass(Within, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n if (ctx.geometry() != null && ctx.canonicalID() != null) {\n if (ctx.geometryType() === 'Point') {\n return pointsWithinPolygons(ctx, this.geometries);\n } else if (ctx.geometryType() === 'LineString') {\n return linesWithinPolygons(ctx, this.geometries);\n }\n }\n return false;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild() {}\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['within', this.geojson];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"'within' expression requires exactly one argument, but found \".concat(args.length - 1, \" instead.\"));\n if (isValue(args[1])) {\n var geojson = args[1];\n if (geojson.type === 'FeatureCollection') {\n for (var i = 0; i < geojson.features.length; ++i) {\n var type = geojson.features[i].geometry.type;\n if (type === 'Polygon' || type === 'MultiPolygon') {\n return new Within(geojson, geojson.features[i].geometry);\n }\n }\n } else if (geojson.type === 'Feature') {\n var _type2 = geojson.geometry.type;\n if (_type2 === 'Polygon' || _type2 === 'MultiPolygon') {\n return new Within(geojson, geojson.geometry);\n }\n } else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') {\n return new Within(geojson, geojson);\n }\n }\n return context.error(\"'within' expression requires valid geojson object that contains polygon geometry type.\");\n }\n }]);\n}();\nfunction isFeatureConstant(e) {\n if (e instanceof CompoundExpression) {\n if (e.name === 'get' && e.args.length === 1) {\n return false;\n } else if (e.name === 'feature-state') {\n return false;\n } else if (e.name === 'has' && e.args.length === 1) {\n return false;\n } else if (e.name === 'properties' || e.name === 'geometry-type' || e.name === 'id') {\n return false;\n } else if (/^filter-/.test(e.name)) {\n return false;\n }\n }\n if (e instanceof Within) {\n return false;\n }\n var result = true;\n e.eachChild(function (arg) {\n if (result && !isFeatureConstant(arg)) {\n result = false;\n }\n });\n return result;\n}\nfunction isStateConstant(e) {\n if (e instanceof CompoundExpression) {\n if (e.name === 'feature-state') {\n return false;\n }\n }\n var result = true;\n e.eachChild(function (arg) {\n if (result && !isStateConstant(arg)) {\n result = false;\n }\n });\n return result;\n}\nfunction isGlobalPropertyConstant(e, properties) {\n if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) {\n return false;\n }\n var result = true;\n e.eachChild(function (arg) {\n if (result && !isGlobalPropertyConstant(arg, properties)) {\n result = false;\n }\n });\n return result;\n}\nvar Var = /*#__PURE__*/function () {\n function Var(name, boundExpression) {\n _classCallCheck(this, Var);\n this.type = boundExpression.type;\n this.name = name;\n this.boundExpression = boundExpression;\n }\n return _createClass(Var, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return this.boundExpression.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild() {}\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['var', this.name];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2 || typeof args[1] !== 'string') return context.error(\"'var' expression requires exactly one string literal argument.\");\n var name = args[1];\n if (!context.scope.has(name)) {\n return context.error(\"Unknown variable \\\"\".concat(name, \"\\\". Make sure \\\"\").concat(name, \"\\\" has been bound in an enclosing \\\"let\\\" expression before using it.\"), 1);\n }\n return new Var(name, context.scope.get(name));\n }\n }]);\n}();\nvar ParsingContext = /*#__PURE__*/function () {\n function ParsingContext(registry) {\n var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var expectedType = arguments.length > 2 ? arguments[2] : undefined;\n var scope = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Scope();\n var errors = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n _classCallCheck(this, ParsingContext);\n this.registry = registry;\n this.path = path;\n this.key = path.map(function (part) {\n return \"[\".concat(part, \"]\");\n }).join('');\n this.scope = scope;\n this.errors = errors;\n this.expectedType = expectedType;\n }\n return _createClass(ParsingContext, [{\n key: \"parse\",\n value: function parse(expr, index, expectedType, bindings) {\n var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n if (index) {\n return this.concat(index, expectedType, bindings)._parse(expr, options);\n }\n return this._parse(expr, options);\n }\n }, {\n key: \"_parse\",\n value: function _parse(expr, options) {\n if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {\n expr = ['literal', expr];\n }\n function annotate(parsed, type, typeAnnotation) {\n if (typeAnnotation === 'assert') {\n return new Assertion(type, [parsed]);\n } else if (typeAnnotation === 'coerce') {\n return new Coercion(type, [parsed]);\n } else {\n return parsed;\n }\n }\n if (Array.isArray(expr)) {\n if (expr.length === 0) {\n return this.error(\"Expected an array with at least one element. If you wanted a literal array, use [\\\"literal\\\", []].\");\n }\n var op = expr[0];\n if (typeof op !== 'string') {\n this.error(\"Expression name must be a string, but found \".concat(_typeof(op), \" instead. If you wanted a literal array, use [\\\"literal\\\", [...]].\"), 0);\n return null;\n }\n var Expr = this.registry[op];\n if (Expr) {\n var parsed = Expr.parse(expr, this);\n if (!parsed) return null;\n if (this.expectedType) {\n var expected = this.expectedType;\n var actual = parsed.type;\n if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {\n parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');\n } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {\n parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');\n } else if (this.checkSubtype(expected, actual)) {\n return null;\n }\n }\n if (!(parsed instanceof Literal) && parsed.type.kind !== 'resolvedImage' && isConstant(parsed)) {\n var ec = new EvaluationContext();\n try {\n parsed = new Literal(parsed.type, parsed.evaluate(ec));\n } catch (e) {\n this.error(e.message);\n return null;\n }\n }\n return parsed;\n }\n return this.error(\"Unknown expression \\\"\".concat(op, \"\\\". If you wanted a literal array, use [\\\"literal\\\", [...]].\"), 0);\n } else if (typeof expr === 'undefined') {\n return this.error(\"'undefined' value invalid. Use null instead.\");\n } else if (_typeof(expr) === 'object') {\n return this.error(\"Bare objects invalid. Use [\\\"literal\\\", {...}] instead.\");\n } else {\n return this.error(\"Expected an array, but found \".concat(_typeof(expr), \" instead.\"));\n }\n }\n }, {\n key: \"concat\",\n value: function concat(index, expectedType, bindings) {\n var path = typeof index === 'number' ? this.path.concat(index) : this.path;\n var scope = bindings ? this.scope.concat(bindings) : this.scope;\n return new ParsingContext(this.registry, path, expectedType || null, scope, this.errors);\n }\n }, {\n key: \"error\",\n value: function error(_error3) {\n for (var _len2 = arguments.length, keys = new Array(_len2 > 1 ? _len2 - 1 : 0), _key4 = 1; _key4 < _len2; _key4++) {\n keys[_key4 - 1] = arguments[_key4];\n }\n var key = \"\".concat(this.key).concat(keys.map(function (k) {\n return \"[\".concat(k, \"]\");\n }).join(''));\n this.errors.push(new ParsingError(key, _error3));\n }\n }, {\n key: \"checkSubtype\",\n value: function checkSubtype(expected, t) {\n var error = _checkSubtype(expected, t);\n if (error) this.error(error);\n return error;\n }\n }]);\n}();\nfunction isConstant(expression) {\n if (expression instanceof Var) {\n return isConstant(expression.boundExpression);\n } else if (expression instanceof CompoundExpression && expression.name === 'error') {\n return false;\n } else if (expression instanceof CollatorExpression) {\n return false;\n } else if (expression instanceof Within) {\n return false;\n }\n var isTypeAnnotation = expression instanceof Coercion || expression instanceof Assertion;\n var childrenConstant = true;\n expression.eachChild(function (child) {\n if (isTypeAnnotation) {\n childrenConstant = childrenConstant && isConstant(child);\n } else {\n childrenConstant = childrenConstant && child instanceof Literal;\n }\n });\n if (!childrenConstant) {\n return false;\n }\n return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'sky-radial-progress', 'accumulated', 'is-supported-script']);\n}\nfunction findStopLessThanOrEqualTo(stops, input) {\n var lastIndex = stops.length - 1;\n var lowerIndex = 0;\n var upperIndex = lastIndex;\n var currentIndex = 0;\n var currentValue, nextValue;\n while (lowerIndex <= upperIndex) {\n currentIndex = Math.floor((lowerIndex + upperIndex) / 2);\n currentValue = stops[currentIndex];\n nextValue = stops[currentIndex + 1];\n if (currentValue <= input) {\n if (currentIndex === lastIndex || input < nextValue) {\n return currentIndex;\n }\n lowerIndex = currentIndex + 1;\n } else if (currentValue > input) {\n upperIndex = currentIndex - 1;\n } else {\n throw new RuntimeError('Input is not a number.');\n }\n }\n return 0;\n}\nvar Step = /*#__PURE__*/function () {\n function Step(type, input, stops) {\n _classCallCheck(this, Step);\n this.type = type;\n this.input = input;\n this.labels = [];\n this.outputs = [];\n var _iterator22 = _createForOfIteratorHelper(stops),\n _step22;\n try {\n for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {\n var _step22$value = _slicedToArray(_step22.value, 2),\n label = _step22$value[0],\n _expression2 = _step22$value[1];\n this.labels.push(label);\n this.outputs.push(_expression2);\n }\n } catch (err) {\n _iterator22.e(err);\n } finally {\n _iterator22.f();\n }\n }\n return _createClass(Step, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var labels = this.labels;\n var outputs = this.outputs;\n if (labels.length === 1) {\n return outputs[0].evaluate(ctx);\n }\n var value = this.input.evaluate(ctx);\n if (value <= labels[0]) {\n return outputs[0].evaluate(ctx);\n }\n var stopCount = labels.length;\n if (value >= labels[stopCount - 1]) {\n return outputs[stopCount - 1].evaluate(ctx);\n }\n var index = findStopLessThanOrEqualTo(labels, value);\n return outputs[index].evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n var _iterator23 = _createForOfIteratorHelper(this.outputs),\n _step23;\n try {\n for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {\n var _expression3 = _step23.value;\n fn(_expression3);\n }\n } catch (err) {\n _iterator23.e(err);\n } finally {\n _iterator23.f();\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.outputs.every(function (out) {\n return out.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['step', this.input.serialize()];\n for (var i = 0; i < this.labels.length; i++) {\n if (i > 0) {\n serialized.push(this.labels[i]);\n }\n serialized.push(this.outputs[i].serialize());\n }\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length - 1 < 4) {\n return context.error(\"Expected at least 4 arguments, but found only \".concat(args.length - 1, \".\"));\n }\n if ((args.length - 1) % 2 !== 0) {\n return context.error(\"Expected an even number of arguments.\");\n }\n var input = context.parse(args[1], 1, NumberType);\n if (!input) return null;\n var stops = [];\n var outputType = null;\n if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n for (var i = 1; i < args.length; i += 2) {\n var label = i === 1 ? -Infinity : args[i];\n var value = args[i + 1];\n var labelKey = i;\n var valueKey = i + 1;\n if (typeof label !== 'number') {\n return context.error('Input/output pairs for \"step\" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);\n }\n if (stops.length && stops[stops.length - 1][0] >= label) {\n return context.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.', labelKey);\n }\n var parsed = context.parse(value, valueKey, outputType);\n if (!parsed) return null;\n outputType = outputType || parsed.type;\n stops.push([label, parsed]);\n }\n return new Step(outputType, input, stops);\n }\n }]);\n}();\n/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Ported from Webkit\n * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h\n */\nvar unitbezier = UnitBezier;\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n this.cx = 3.0 * p1x;\n this.bx = 3.0 * (p2x - p1x) - this.cx;\n this.ax = 1.0 - this.cx - this.bx;\n this.cy = 3.0 * p1y;\n this.by = 3.0 * (p2y - p1y) - this.cy;\n this.ay = 1.0 - this.cy - this.by;\n this.p1x = p1x;\n this.p1y = p2y;\n this.p2x = p2x;\n this.p2y = p2y;\n}\nUnitBezier.prototype.sampleCurveX = function (t) {\n // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n return ((this.ax * t + this.bx) * t + this.cx) * t;\n};\nUnitBezier.prototype.sampleCurveY = function (t) {\n return ((this.ay * t + this.by) * t + this.cy) * t;\n};\nUnitBezier.prototype.sampleCurveDerivativeX = function (t) {\n return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n};\nUnitBezier.prototype.solveCurveX = function (x, epsilon) {\n if (typeof epsilon === 'undefined') epsilon = 1e-6;\n var t0, t1, t2, x2, i;\n\n // First try a few iterations of Newton's method -- normally very fast.\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = this.sampleCurveX(t2) - x;\n if (Math.abs(x2) < epsilon) return t2;\n var d2 = this.sampleCurveDerivativeX(t2);\n if (Math.abs(d2) < 1e-6) break;\n t2 = t2 - x2 / d2;\n }\n\n // Fall back to the bisection method for reliability.\n t0 = 0.0;\n t1 = 1.0;\n t2 = x;\n if (t2 < t0) return t0;\n if (t2 > t1) return t1;\n while (t0 < t1) {\n x2 = this.sampleCurveX(t2);\n if (Math.abs(x2 - x) < epsilon) return t2;\n if (x > x2) {\n t0 = t2;\n } else {\n t1 = t2;\n }\n t2 = (t1 - t0) * 0.5 + t0;\n }\n\n // Failure.\n return t2;\n};\nUnitBezier.prototype.solve = function (x, epsilon) {\n return this.sampleCurveY(this.solveCurveX(x, epsilon));\n};\nfunction number(a, b, t) {\n return a * (1 - t) + b * t;\n}\nfunction color(from, to, t) {\n return new Color(number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t));\n}\nfunction array$1(from, to, t) {\n return from.map(function (d, i) {\n return number(d, to[i], t);\n });\n}\nvar interpolate = /*#__PURE__*/Object.freeze({\n __proto__: null,\n number: number,\n color: color,\n array: array$1\n});\nvar Xn = 0.95047,\n Yn = 1,\n Zn = 1.08883,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1,\n deg2rad = Math.PI / 180,\n rad2deg = 180 / Math.PI;\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\nfunction xyz2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\nfunction rgb2xyz(x) {\n x /= 255;\n return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\nfunction rgbToLab(rgbColor) {\n var b = rgb2xyz(rgbColor.r),\n a = rgb2xyz(rgbColor.g),\n l = rgb2xyz(rgbColor.b),\n x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),\n y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.072175 * l) / Yn),\n z = xyz2lab((0.0193339 * b + 0.119192 * a + 0.9503041 * l) / Zn);\n return {\n l: 116 * y - 16,\n a: 500 * (x - y),\n b: 200 * (y - z),\n alpha: rgbColor.a\n };\n}\nfunction labToRgb(labColor) {\n var y = (labColor.l + 16) / 116,\n x = isNaN(labColor.a) ? y : y + labColor.a / 500,\n z = isNaN(labColor.b) ? y : y - labColor.b / 200;\n y = Yn * lab2xyz(y);\n x = Xn * lab2xyz(x);\n z = Zn * lab2xyz(z);\n return new Color(xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), xyz2rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha);\n}\nfunction interpolateLab(from, to, t) {\n return {\n l: number(from.l, to.l, t),\n a: number(from.a, to.a, t),\n b: number(from.b, to.b, t),\n alpha: number(from.alpha, to.alpha, t)\n };\n}\nfunction rgbToHcl(rgbColor) {\n var _rgbToLab = rgbToLab(rgbColor),\n l = _rgbToLab.l,\n a = _rgbToLab.a,\n b = _rgbToLab.b;\n var h = Math.atan2(b, a) * rad2deg;\n return {\n h: h < 0 ? h + 360 : h,\n c: Math.sqrt(a * a + b * b),\n l: l,\n alpha: rgbColor.a\n };\n}\nfunction hclToRgb(hclColor) {\n var h = hclColor.h * deg2rad,\n c = hclColor.c,\n l = hclColor.l;\n return labToRgb({\n l: l,\n a: Math.cos(h) * c,\n b: Math.sin(h) * c,\n alpha: hclColor.alpha\n });\n}\nfunction interpolateHue(a, b, t) {\n var d = b - a;\n return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d);\n}\nfunction interpolateHcl(from, to, t) {\n return {\n h: interpolateHue(from.h, to.h, t),\n c: number(from.c, to.c, t),\n l: number(from.l, to.l, t),\n alpha: number(from.alpha, to.alpha, t)\n };\n}\nvar lab = {\n forward: rgbToLab,\n reverse: labToRgb,\n interpolate: interpolateLab\n};\nvar hcl = {\n forward: rgbToHcl,\n reverse: hclToRgb,\n interpolate: interpolateHcl\n};\nvar colorSpaces = /*#__PURE__*/Object.freeze({\n __proto__: null,\n lab: lab,\n hcl: hcl\n});\nvar Interpolate = /*#__PURE__*/function () {\n function Interpolate(type, operator, interpolation, input, stops) {\n _classCallCheck(this, Interpolate);\n this.type = type;\n this.operator = operator;\n this.interpolation = interpolation;\n this.input = input;\n this.labels = [];\n this.outputs = [];\n var _iterator24 = _createForOfIteratorHelper(stops),\n _step24;\n try {\n for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {\n var _step24$value = _slicedToArray(_step24.value, 2),\n label = _step24$value[0],\n _expression4 = _step24$value[1];\n this.labels.push(label);\n this.outputs.push(_expression4);\n }\n } catch (err) {\n _iterator24.e(err);\n } finally {\n _iterator24.f();\n }\n }\n return _createClass(Interpolate, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var labels = this.labels;\n var outputs = this.outputs;\n if (labels.length === 1) {\n return outputs[0].evaluate(ctx);\n }\n var value = this.input.evaluate(ctx);\n if (value <= labels[0]) {\n return outputs[0].evaluate(ctx);\n }\n var stopCount = labels.length;\n if (value >= labels[stopCount - 1]) {\n return outputs[stopCount - 1].evaluate(ctx);\n }\n var index = findStopLessThanOrEqualTo(labels, value);\n var lower = labels[index];\n var upper = labels[index + 1];\n var t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper);\n var outputLower = outputs[index].evaluate(ctx);\n var outputUpper = outputs[index + 1].evaluate(ctx);\n if (this.operator === 'interpolate') {\n return interpolate[this.type.kind.toLowerCase()](outputLower, outputUpper, t);\n } else if (this.operator === 'interpolate-hcl') {\n return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t));\n } else {\n return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t));\n }\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n var _iterator25 = _createForOfIteratorHelper(this.outputs),\n _step25;\n try {\n for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {\n var _expression5 = _step25.value;\n fn(_expression5);\n }\n } catch (err) {\n _iterator25.e(err);\n } finally {\n _iterator25.f();\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.outputs.every(function (out) {\n return out.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var interpolation;\n if (this.interpolation.name === 'linear') {\n interpolation = ['linear'];\n } else if (this.interpolation.name === 'exponential') {\n if (this.interpolation.base === 1) {\n interpolation = ['linear'];\n } else {\n interpolation = ['exponential', this.interpolation.base];\n }\n } else {\n interpolation = ['cubic-bezier'].concat(this.interpolation.controlPoints);\n }\n var serialized = [this.operator, interpolation, this.input.serialize()];\n for (var i = 0; i < this.labels.length; i++) {\n serialized.push(this.labels[i], this.outputs[i].serialize());\n }\n return serialized;\n }\n }], [{\n key: \"interpolationFactor\",\n value: function interpolationFactor(interpolation, input, lower, upper) {\n var t = 0;\n if (interpolation.name === 'exponential') {\n t = exponentialInterpolation(input, interpolation.base, lower, upper);\n } else if (interpolation.name === 'linear') {\n t = exponentialInterpolation(input, 1, lower, upper);\n } else if (interpolation.name === 'cubic-bezier') {\n var c = interpolation.controlPoints;\n var ub = new unitbezier(c[0], c[1], c[2], c[3]);\n t = ub.solve(exponentialInterpolation(input, 1, lower, upper));\n }\n return t;\n }\n }, {\n key: \"parse\",\n value: function parse(args, context) {\n var _args = _toArray(args),\n operator = _args[0],\n interpolation = _args[1],\n input = _args[2],\n rest = _args.slice(3);\n if (!Array.isArray(interpolation) || interpolation.length === 0) {\n return context.error(\"Expected an interpolation type expression.\", 1);\n }\n if (interpolation[0] === 'linear') {\n interpolation = {\n name: 'linear'\n };\n } else if (interpolation[0] === 'exponential') {\n var base = interpolation[1];\n if (typeof base !== 'number') return context.error(\"Exponential interpolation requires a numeric base.\", 1, 1);\n interpolation = {\n name: 'exponential',\n base: base\n };\n } else if (interpolation[0] === 'cubic-bezier') {\n var controlPoints = interpolation.slice(1);\n if (controlPoints.length !== 4 || controlPoints.some(function (t) {\n return typeof t !== 'number' || t < 0 || t > 1;\n })) {\n return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1);\n }\n interpolation = {\n name: 'cubic-bezier',\n controlPoints: controlPoints\n };\n } else {\n return context.error(\"Unknown interpolation type \".concat(String(interpolation[0])), 1, 0);\n }\n if (args.length - 1 < 4) {\n return context.error(\"Expected at least 4 arguments, but found only \".concat(args.length - 1, \".\"));\n }\n if ((args.length - 1) % 2 !== 0) {\n return context.error(\"Expected an even number of arguments.\");\n }\n input = context.parse(input, 2, NumberType);\n if (!input) return null;\n var stops = [];\n var outputType = null;\n if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') {\n outputType = ColorType;\n } else if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n for (var i = 0; i < rest.length; i += 2) {\n var label = rest[i];\n var value = rest[i + 1];\n var labelKey = i + 3;\n var valueKey = i + 4;\n if (typeof label !== 'number') {\n return context.error('Input/output pairs for \"interpolate\" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);\n }\n if (stops.length && stops[stops.length - 1][0] >= label) {\n return context.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.', labelKey);\n }\n var parsed = context.parse(value, valueKey, outputType);\n if (!parsed) return null;\n outputType = outputType || parsed.type;\n stops.push([label, parsed]);\n }\n if (outputType.kind !== 'number' && outputType.kind !== 'color' && !(outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number')) {\n return context.error(\"Type \".concat(toString(outputType), \" is not interpolatable.\"));\n }\n return new Interpolate(outputType, operator, interpolation, input, stops);\n }\n }]);\n}();\nfunction exponentialInterpolation(input, base, lowerValue, upperValue) {\n var difference = upperValue - lowerValue;\n var progress = input - lowerValue;\n if (difference === 0) {\n return 0;\n } else if (base === 1) {\n return progress / difference;\n } else {\n return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n }\n}\nvar Coalesce = /*#__PURE__*/function () {\n function Coalesce(type, args) {\n _classCallCheck(this, Coalesce);\n this.type = type;\n this.args = args;\n }\n return _createClass(Coalesce, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var result = null;\n var argCount = 0;\n var requestedImageName;\n var _iterator26 = _createForOfIteratorHelper(this.args),\n _step26;\n try {\n for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {\n var arg = _step26.value;\n argCount++;\n result = arg.evaluate(ctx);\n if (result && result instanceof ResolvedImage && !result.available) {\n if (!requestedImageName) {\n requestedImageName = result.name;\n }\n result = null;\n if (argCount === this.args.length) {\n result = requestedImageName;\n }\n }\n if (result !== null) break;\n }\n } catch (err) {\n _iterator26.e(err);\n } finally {\n _iterator26.f();\n }\n return result;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.args.every(function (arg) {\n return arg.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['coalesce'];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) {\n return context.error('Expectected at least one argument.');\n }\n var outputType = null;\n var expectedType = context.expectedType;\n if (expectedType && expectedType.kind !== 'value') {\n outputType = expectedType;\n }\n var parsedArgs = [];\n var _iterator27 = _createForOfIteratorHelper(args.slice(1)),\n _step27;\n try {\n for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {\n var arg = _step27.value;\n var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {\n typeAnnotation: 'omit'\n });\n if (!parsed) return null;\n outputType = outputType || parsed.type;\n parsedArgs.push(parsed);\n }\n } catch (err) {\n _iterator27.e(err);\n } finally {\n _iterator27.f();\n }\n var needsAnnotation = expectedType && parsedArgs.some(function (arg) {\n return _checkSubtype(expectedType, arg.type);\n });\n return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce(outputType, parsedArgs);\n }\n }]);\n}();\nvar Let = /*#__PURE__*/function () {\n function Let(bindings, result) {\n _classCallCheck(this, Let);\n this.type = result.type;\n this.bindings = [].concat(bindings);\n this.result = result;\n }\n return _createClass(Let, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return this.result.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n var _iterator28 = _createForOfIteratorHelper(this.bindings),\n _step28;\n try {\n for (_iterator28.s(); !(_step28 = _iterator28.n()).done;) {\n var binding = _step28.value;\n fn(binding[1]);\n }\n } catch (err) {\n _iterator28.e(err);\n } finally {\n _iterator28.f();\n }\n fn(this.result);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.result.outputDefined();\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['let'];\n var _iterator29 = _createForOfIteratorHelper(this.bindings),\n _step29;\n try {\n for (_iterator29.s(); !(_step29 = _iterator29.n()).done;) {\n var _step29$value = _slicedToArray(_step29.value, 2),\n name = _step29$value[0],\n expr = _step29$value[1];\n serialized.push(name, expr.serialize());\n }\n } catch (err) {\n _iterator29.e(err);\n } finally {\n _iterator29.f();\n }\n serialized.push(this.result.serialize());\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 4) return context.error(\"Expected at least 3 arguments, but found \".concat(args.length - 1, \" instead.\"));\n var bindings = [];\n for (var i = 1; i < args.length - 1; i += 2) {\n var name = args[i];\n if (typeof name !== 'string') {\n return context.error(\"Expected string, but found \".concat(_typeof(name), \" instead.\"), i);\n }\n if (/[^a-zA-Z0-9_]/.test(name)) {\n return context.error(\"Variable names must contain only alphanumeric characters or '_'.\", i);\n }\n var value = context.parse(args[i + 1], i + 1);\n if (!value) return null;\n bindings.push([name, value]);\n }\n var result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings);\n if (!result) return null;\n return new Let(bindings, result);\n }\n }]);\n}();\nvar At = /*#__PURE__*/function () {\n function At(type, index, input) {\n _classCallCheck(this, At);\n this.type = type;\n this.index = index;\n this.input = input;\n }\n return _createClass(At, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var index = this.index.evaluate(ctx);\n var array = this.input.evaluate(ctx);\n if (index < 0) {\n throw new RuntimeError(\"Array index out of bounds: \".concat(index, \" < 0.\"));\n }\n if (index >= array.length) {\n throw new RuntimeError(\"Array index out of bounds: \".concat(index, \" > \").concat(array.length - 1, \".\"));\n }\n if (index !== Math.floor(index)) {\n throw new RuntimeError(\"Array index must be an integer, but found \".concat(index, \" instead.\"));\n }\n return array[index];\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.index);\n fn(this.input);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['at', this.index.serialize(), this.input.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3) return context.error(\"Expected 2 arguments, but found \".concat(args.length - 1, \" instead.\"));\n var index = context.parse(args[1], 1, NumberType);\n var input = context.parse(args[2], 2, array(context.expectedType || ValueType));\n if (!index || !input) return null;\n var t = input.type;\n return new At(t.itemType, index, input);\n }\n }]);\n}();\nvar In = /*#__PURE__*/function () {\n function In(needle, haystack) {\n _classCallCheck(this, In);\n this.type = BooleanType;\n this.needle = needle;\n this.haystack = haystack;\n }\n return _createClass(In, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var needle = this.needle.evaluate(ctx);\n var haystack = this.haystack.evaluate(ctx);\n if (!haystack) return false;\n if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {\n throw new RuntimeError(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(typeOf(needle)), \" instead.\"));\n }\n if (!isValidNativeType(haystack, ['string', 'array'])) {\n throw new RuntimeError(\"Expected second argument to be of type array or string, but found \".concat(toString(typeOf(haystack)), \" instead.\"));\n }\n return haystack.indexOf(needle) >= 0;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.needle);\n fn(this.haystack);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['in', this.needle.serialize(), this.haystack.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3) {\n return context.error(\"Expected 2 arguments, but found \".concat(args.length - 1, \" instead.\"));\n }\n var needle = context.parse(args[1], 1, ValueType);\n var haystack = context.parse(args[2], 2, ValueType);\n if (!needle || !haystack) return null;\n if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {\n return context.error(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(needle.type), \" instead\"));\n }\n return new In(needle, haystack);\n }\n }]);\n}();\nvar IndexOf = /*#__PURE__*/function () {\n function IndexOf(needle, haystack, fromIndex) {\n _classCallCheck(this, IndexOf);\n this.type = NumberType;\n this.needle = needle;\n this.haystack = haystack;\n this.fromIndex = fromIndex;\n }\n return _createClass(IndexOf, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var needle = this.needle.evaluate(ctx);\n var haystack = this.haystack.evaluate(ctx);\n if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {\n throw new RuntimeError(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(typeOf(needle)), \" instead.\"));\n }\n if (!isValidNativeType(haystack, ['string', 'array'])) {\n throw new RuntimeError(\"Expected second argument to be of type array or string, but found \".concat(toString(typeOf(haystack)), \" instead.\"));\n }\n if (this.fromIndex) {\n var fromIndex = this.fromIndex.evaluate(ctx);\n return haystack.indexOf(needle, fromIndex);\n }\n return haystack.indexOf(needle);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.needle);\n fn(this.haystack);\n if (this.fromIndex) {\n fn(this.fromIndex);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.fromIndex != null && this.fromIndex !== undefined) {\n var fromIndex = this.fromIndex.serialize();\n return ['index-of', this.needle.serialize(), this.haystack.serialize(), fromIndex];\n }\n return ['index-of', this.needle.serialize(), this.haystack.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length <= 2 || args.length >= 5) {\n return context.error(\"Expected 3 or 4 arguments, but found \".concat(args.length - 1, \" instead.\"));\n }\n var needle = context.parse(args[1], 1, ValueType);\n var haystack = context.parse(args[2], 2, ValueType);\n if (!needle || !haystack) return null;\n if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {\n return context.error(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(needle.type), \" instead\"));\n }\n if (args.length === 4) {\n var fromIndex = context.parse(args[3], 3, NumberType);\n if (!fromIndex) return null;\n return new IndexOf(needle, haystack, fromIndex);\n } else {\n return new IndexOf(needle, haystack);\n }\n }\n }]);\n}();\nvar Match = /*#__PURE__*/function () {\n function Match(inputType, outputType, input, cases, outputs, otherwise) {\n _classCallCheck(this, Match);\n this.inputType = inputType;\n this.type = outputType;\n this.input = input;\n this.cases = cases;\n this.outputs = outputs;\n this.otherwise = otherwise;\n }\n return _createClass(Match, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var input = this.input.evaluate(ctx);\n var output = typeOf(input) === this.inputType && this.outputs[this.cases[input]] || this.otherwise;\n return output.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n this.outputs.forEach(fn);\n fn(this.otherwise);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.outputs.every(function (out) {\n return out.outputDefined();\n }) && this.otherwise.outputDefined();\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var _this2 = this;\n var serialized = ['match', this.input.serialize()];\n var sortedLabels = Object.keys(this.cases).sort();\n var groupedByOutput = [];\n var outputLookup = {};\n var _iterator30 = _createForOfIteratorHelper(sortedLabels),\n _step30;\n try {\n for (_iterator30.s(); !(_step30 = _iterator30.n()).done;) {\n var label = _step30.value;\n var _outputIndex = outputLookup[this.cases[label]];\n if (_outputIndex === undefined) {\n outputLookup[this.cases[label]] = groupedByOutput.length;\n groupedByOutput.push([this.cases[label], [label]]);\n } else {\n groupedByOutput[_outputIndex][1].push(label);\n }\n }\n } catch (err) {\n _iterator30.e(err);\n } finally {\n _iterator30.f();\n }\n var coerceLabel = function coerceLabel(label) {\n return _this2.inputType.kind === 'number' ? Number(label) : label;\n };\n for (var _i7 = 0, _groupedByOutput = groupedByOutput; _i7 < _groupedByOutput.length; _i7++) {\n var _groupedByOutput$_i = _slicedToArray(_groupedByOutput[_i7], 2),\n outputIndex = _groupedByOutput$_i[0],\n labels = _groupedByOutput$_i[1];\n if (labels.length === 1) {\n serialized.push(coerceLabel(labels[0]));\n } else {\n serialized.push(labels.map(coerceLabel));\n }\n serialized.push(this.outputs[outputIndex].serialize());\n }\n serialized.push(this.otherwise.serialize());\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 5) return context.error(\"Expected at least 4 arguments, but found only \".concat(args.length - 1, \".\"));\n if (args.length % 2 !== 1) return context.error(\"Expected an even number of arguments.\");\n var inputType;\n var outputType;\n if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n var cases = {};\n var outputs = [];\n for (var i = 2; i < args.length - 1; i += 2) {\n var labels = args[i];\n var value = args[i + 1];\n if (!Array.isArray(labels)) {\n labels = [labels];\n }\n var labelContext = context.concat(i);\n if (labels.length === 0) {\n return labelContext.error('Expected at least one branch label.');\n }\n var _iterator31 = _createForOfIteratorHelper(labels),\n _step31;\n try {\n for (_iterator31.s(); !(_step31 = _iterator31.n()).done;) {\n var label = _step31.value;\n if (typeof label !== 'number' && typeof label !== 'string') {\n return labelContext.error(\"Branch labels must be numbers or strings.\");\n } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) {\n return labelContext.error(\"Branch labels must be integers no larger than \".concat(Number.MAX_SAFE_INTEGER, \".\"));\n } else if (typeof label === 'number' && Math.floor(label) !== label) {\n return labelContext.error(\"Numeric branch labels must be integer values.\");\n } else if (!inputType) {\n inputType = typeOf(label);\n } else if (labelContext.checkSubtype(inputType, typeOf(label))) {\n return null;\n }\n if (typeof cases[String(label)] !== 'undefined') {\n return labelContext.error('Branch labels must be unique.');\n }\n cases[String(label)] = outputs.length;\n }\n } catch (err) {\n _iterator31.e(err);\n } finally {\n _iterator31.f();\n }\n var result = context.parse(value, i, outputType);\n if (!result) return null;\n outputType = outputType || result.type;\n outputs.push(result);\n }\n var input = context.parse(args[1], 1, ValueType);\n if (!input) return null;\n var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);\n if (!otherwise) return null;\n if (input.type.kind !== 'value' && context.concat(1).checkSubtype(inputType, input.type)) {\n return null;\n }\n return new Match(inputType, outputType, input, cases, outputs, otherwise);\n }\n }]);\n}();\nvar Case = /*#__PURE__*/function () {\n function Case(type, branches, otherwise) {\n _classCallCheck(this, Case);\n this.type = type;\n this.branches = branches;\n this.otherwise = otherwise;\n }\n return _createClass(Case, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var _iterator32 = _createForOfIteratorHelper(this.branches),\n _step32;\n try {\n for (_iterator32.s(); !(_step32 = _iterator32.n()).done;) {\n var _step32$value = _slicedToArray(_step32.value, 2),\n test = _step32$value[0],\n _expression6 = _step32$value[1];\n if (test.evaluate(ctx)) {\n return _expression6.evaluate(ctx);\n }\n }\n } catch (err) {\n _iterator32.e(err);\n } finally {\n _iterator32.f();\n }\n return this.otherwise.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n var _iterator33 = _createForOfIteratorHelper(this.branches),\n _step33;\n try {\n for (_iterator33.s(); !(_step33 = _iterator33.n()).done;) {\n var _step33$value = _slicedToArray(_step33.value, 2),\n test = _step33$value[0],\n _expression7 = _step33$value[1];\n fn(test);\n fn(_expression7);\n }\n } catch (err) {\n _iterator33.e(err);\n } finally {\n _iterator33.f();\n }\n fn(this.otherwise);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.branches.every(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n _ = _ref6[0],\n out = _ref6[1];\n return out.outputDefined();\n }) && this.otherwise.outputDefined();\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['case'];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 4) return context.error(\"Expected at least 3 arguments, but found only \".concat(args.length - 1, \".\"));\n if (args.length % 2 !== 0) return context.error(\"Expected an odd number of arguments.\");\n var outputType;\n if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n var branches = [];\n for (var i = 1; i < args.length - 1; i += 2) {\n var test = context.parse(args[i], i, BooleanType);\n if (!test) return null;\n var result = context.parse(args[i + 1], i + 1, outputType);\n if (!result) return null;\n branches.push([test, result]);\n outputType = outputType || result.type;\n }\n var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);\n if (!otherwise) return null;\n return new Case(outputType, branches, otherwise);\n }\n }]);\n}();\nvar Slice = /*#__PURE__*/function () {\n function Slice(type, input, beginIndex, endIndex) {\n _classCallCheck(this, Slice);\n this.type = type;\n this.input = input;\n this.beginIndex = beginIndex;\n this.endIndex = endIndex;\n }\n return _createClass(Slice, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var input = this.input.evaluate(ctx);\n var beginIndex = this.beginIndex.evaluate(ctx);\n if (!isValidNativeType(input, ['string', 'array'])) {\n throw new RuntimeError(\"Expected first argument to be of type array or string, but found \".concat(toString(typeOf(input)), \" instead.\"));\n }\n if (this.endIndex) {\n var endIndex = this.endIndex.evaluate(ctx);\n return input.slice(beginIndex, endIndex);\n }\n return input.slice(beginIndex);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n fn(this.beginIndex);\n if (this.endIndex) {\n fn(this.endIndex);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.endIndex != null && this.endIndex !== undefined) {\n var endIndex = this.endIndex.serialize();\n return ['slice', this.input.serialize(), this.beginIndex.serialize(), endIndex];\n }\n return ['slice', this.input.serialize(), this.beginIndex.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length <= 2 || args.length >= 5) {\n return context.error(\"Expected 3 or 4 arguments, but found \".concat(args.length - 1, \" instead.\"));\n }\n var input = context.parse(args[1], 1, ValueType);\n var beginIndex = context.parse(args[2], 2, NumberType);\n if (!input || !beginIndex) return null;\n if (!isValidType(input.type, [array(ValueType), StringType, ValueType])) {\n return context.error(\"Expected first argument to be of type array or string, but found \".concat(toString(input.type), \" instead\"));\n }\n if (args.length === 4) {\n var endIndex = context.parse(args[3], 3, NumberType);\n if (!endIndex) return null;\n return new Slice(input.type, input, beginIndex, endIndex);\n } else {\n return new Slice(input.type, input, beginIndex);\n }\n }\n }]);\n}();\nfunction isComparableType(op, type) {\n if (op === '==' || op === '!=') {\n return type.kind === 'boolean' || type.kind === 'string' || type.kind === 'number' || type.kind === 'null' || type.kind === 'value';\n } else {\n return type.kind === 'string' || type.kind === 'number' || type.kind === 'value';\n }\n}\nfunction eq(ctx, a, b) {\n return a === b;\n}\nfunction neq(ctx, a, b) {\n return a !== b;\n}\nfunction lt(ctx, a, b) {\n return a < b;\n}\nfunction gt(ctx, a, b) {\n return a > b;\n}\nfunction lteq(ctx, a, b) {\n return a <= b;\n}\nfunction gteq(ctx, a, b) {\n return a >= b;\n}\nfunction eqCollate(ctx, a, b, c) {\n return c.compare(a, b) === 0;\n}\nfunction neqCollate(ctx, a, b, c) {\n return !eqCollate(ctx, a, b, c);\n}\nfunction ltCollate(ctx, a, b, c) {\n return c.compare(a, b) < 0;\n}\nfunction gtCollate(ctx, a, b, c) {\n return c.compare(a, b) > 0;\n}\nfunction lteqCollate(ctx, a, b, c) {\n return c.compare(a, b) <= 0;\n}\nfunction gteqCollate(ctx, a, b, c) {\n return c.compare(a, b) >= 0;\n}\nfunction makeComparison(op, compareBasic, compareWithCollator) {\n var isOrderComparison = op !== '==' && op !== '!=';\n return /*#__PURE__*/function () {\n function Comparison(lhs, rhs, collator) {\n _classCallCheck(this, Comparison);\n this.type = BooleanType;\n this.lhs = lhs;\n this.rhs = rhs;\n this.collator = collator;\n this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value';\n }\n return _createClass(Comparison, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var lhs = this.lhs.evaluate(ctx);\n var rhs = this.rhs.evaluate(ctx);\n if (isOrderComparison && this.hasUntypedArgument) {\n var _lt = typeOf(lhs);\n var rt = typeOf(rhs);\n if (_lt.kind !== rt.kind || !(_lt.kind === 'string' || _lt.kind === 'number')) {\n throw new RuntimeError(\"Expected arguments for \\\"\".concat(op, \"\\\" to be (string, string) or (number, number), but found (\").concat(_lt.kind, \", \").concat(rt.kind, \") instead.\"));\n }\n }\n if (this.collator && !isOrderComparison && this.hasUntypedArgument) {\n var _lt2 = typeOf(lhs);\n var _rt = typeOf(rhs);\n if (_lt2.kind !== 'string' || _rt.kind !== 'string') {\n return compareBasic(ctx, lhs, rhs);\n }\n }\n return this.collator ? compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : compareBasic(ctx, lhs, rhs);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.lhs);\n fn(this.rhs);\n if (this.collator) {\n fn(this.collator);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = [op];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3 && args.length !== 4) return context.error(\"Expected two or three arguments.\");\n var op = args[0];\n var lhs = context.parse(args[1], 1, ValueType);\n if (!lhs) return null;\n if (!isComparableType(op, lhs.type)) {\n return context.concat(1).error(\"\\\"\".concat(op, \"\\\" comparisons are not supported for type '\").concat(toString(lhs.type), \"'.\"));\n }\n var rhs = context.parse(args[2], 2, ValueType);\n if (!rhs) return null;\n if (!isComparableType(op, rhs.type)) {\n return context.concat(2).error(\"\\\"\".concat(op, \"\\\" comparisons are not supported for type '\").concat(toString(rhs.type), \"'.\"));\n }\n if (lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') {\n return context.error(\"Cannot compare types '\".concat(toString(lhs.type), \"' and '\").concat(toString(rhs.type), \"'.\"));\n }\n if (isOrderComparison) {\n if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') {\n lhs = new Assertion(rhs.type, [lhs]);\n } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') {\n rhs = new Assertion(lhs.type, [rhs]);\n }\n }\n var collator = null;\n if (args.length === 4) {\n if (lhs.type.kind !== 'string' && rhs.type.kind !== 'string' && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') {\n return context.error(\"Cannot use collator to compare non-string types.\");\n }\n collator = context.parse(args[3], 3, CollatorType);\n if (!collator) return null;\n }\n return new Comparison(lhs, rhs, collator);\n }\n }]);\n }();\n}\nvar Equals = makeComparison('==', eq, eqCollate);\nvar NotEquals = makeComparison('!=', neq, neqCollate);\nvar LessThan = makeComparison('<', lt, ltCollate);\nvar GreaterThan = makeComparison('>', gt, gtCollate);\nvar LessThanOrEqual = makeComparison('<=', lteq, lteqCollate);\nvar GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate);\nvar NumberFormat = /*#__PURE__*/function () {\n function NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits) {\n _classCallCheck(this, NumberFormat);\n this.type = StringType;\n this.number = number;\n this.locale = locale;\n this.currency = currency;\n this.minFractionDigits = minFractionDigits;\n this.maxFractionDigits = maxFractionDigits;\n }\n return _createClass(NumberFormat, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], {\n style: this.currency ? 'currency' : 'decimal',\n currency: this.currency ? this.currency.evaluate(ctx) : undefined,\n minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined,\n maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined\n }).format(this.number.evaluate(ctx));\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.number);\n if (this.locale) {\n fn(this.locale);\n }\n if (this.currency) {\n fn(this.currency);\n }\n if (this.minFractionDigits) {\n fn(this.minFractionDigits);\n }\n if (this.maxFractionDigits) {\n fn(this.maxFractionDigits);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var options = {};\n if (this.locale) {\n options['locale'] = this.locale.serialize();\n }\n if (this.currency) {\n options['currency'] = this.currency.serialize();\n }\n if (this.minFractionDigits) {\n options['min-fraction-digits'] = this.minFractionDigits.serialize();\n }\n if (this.maxFractionDigits) {\n options['max-fraction-digits'] = this.maxFractionDigits.serialize();\n }\n return ['number-format', this.number.serialize(), options];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3) return context.error(\"Expected two arguments.\");\n var number = context.parse(args[1], 1, NumberType);\n if (!number) return null;\n var options = args[2];\n if (_typeof(options) !== 'object' || Array.isArray(options)) return context.error(\"NumberFormat options argument must be an object.\");\n var locale = null;\n if (options['locale']) {\n locale = context.parse(options['locale'], 1, StringType);\n if (!locale) return null;\n }\n var currency = null;\n if (options['currency']) {\n currency = context.parse(options['currency'], 1, StringType);\n if (!currency) return null;\n }\n var minFractionDigits = null;\n if (options['min-fraction-digits']) {\n minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType);\n if (!minFractionDigits) return null;\n }\n var maxFractionDigits = null;\n if (options['max-fraction-digits']) {\n maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType);\n if (!maxFractionDigits) return null;\n }\n return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits);\n }\n }]);\n}();\nvar Length = /*#__PURE__*/function () {\n function Length(input) {\n _classCallCheck(this, Length);\n this.type = NumberType;\n this.input = input;\n }\n return _createClass(Length, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var input = this.input.evaluate(ctx);\n if (typeof input === 'string') {\n return input.length;\n } else if (Array.isArray(input)) {\n return input.length;\n } else {\n throw new RuntimeError(\"Expected value to be of type string or array, but found \".concat(toString(typeOf(input)), \" instead.\"));\n }\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['length'];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"Expected 1 argument, but found \".concat(args.length - 1, \" instead.\"));\n var input = context.parse(args[1], 1);\n if (!input) return null;\n if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') return context.error(\"Expected argument of type string or array, but found \".concat(toString(input.type), \" instead.\"));\n return new Length(input);\n }\n }]);\n}();\nvar expressions = {\n '==': Equals,\n '!=': NotEquals,\n '>': GreaterThan,\n '<': LessThan,\n '>=': GreaterThanOrEqual,\n '<=': LessThanOrEqual,\n 'array': Assertion,\n 'at': At,\n 'boolean': Assertion,\n 'case': Case,\n 'coalesce': Coalesce,\n 'collator': CollatorExpression,\n 'format': FormatExpression,\n 'image': ImageExpression,\n 'in': In,\n 'index-of': IndexOf,\n 'interpolate': Interpolate,\n 'interpolate-hcl': Interpolate,\n 'interpolate-lab': Interpolate,\n 'length': Length,\n 'let': Let,\n 'literal': Literal,\n 'match': Match,\n 'number': Assertion,\n 'number-format': NumberFormat,\n 'object': Assertion,\n 'slice': Slice,\n 'step': Step,\n 'string': Assertion,\n 'to-boolean': Coercion,\n 'to-color': Coercion,\n 'to-number': Coercion,\n 'to-string': Coercion,\n 'var': Var,\n 'within': Within\n};\nfunction rgba(ctx, _ref7) {\n var _ref8 = _slicedToArray(_ref7, 4),\n r = _ref8[0],\n g = _ref8[1],\n b = _ref8[2],\n a = _ref8[3];\n r = r.evaluate(ctx);\n g = g.evaluate(ctx);\n b = b.evaluate(ctx);\n var alpha = a ? a.evaluate(ctx) : 1;\n var error = validateRGBA(r, g, b, alpha);\n if (error) throw new RuntimeError(error);\n return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha);\n}\nfunction has(key, obj) {\n return key in obj;\n}\nfunction get(key, obj) {\n var v = obj[key];\n return typeof v === 'undefined' ? null : v;\n}\nfunction binarySearch(v, a, i, j) {\n while (i <= j) {\n var m = i + j >> 1;\n if (a[m] === v) return true;\n if (a[m] > v) j = m - 1;else i = m + 1;\n }\n return false;\n}\nfunction varargs(type) {\n return {\n type: type\n };\n}\nCompoundExpression.register(expressions, {\n 'error': [ErrorType, [StringType], function (ctx, _ref9) {\n var _ref10 = _slicedToArray(_ref9, 1),\n v = _ref10[0];\n throw new RuntimeError(v.evaluate(ctx));\n }],\n 'typeof': [StringType, [ValueType], function (ctx, _ref11) {\n var _ref12 = _slicedToArray(_ref11, 1),\n v = _ref12[0];\n return toString(typeOf(v.evaluate(ctx)));\n }],\n 'to-rgba': [array(NumberType, 4), [ColorType], function (ctx, _ref13) {\n var _ref14 = _slicedToArray(_ref13, 1),\n v = _ref14[0];\n return v.evaluate(ctx).toArray();\n }],\n 'rgb': [ColorType, [NumberType, NumberType, NumberType], rgba],\n 'rgba': [ColorType, [NumberType, NumberType, NumberType, NumberType], rgba],\n 'has': {\n type: BooleanType,\n overloads: [[[StringType], function (ctx, _ref15) {\n var _ref16 = _slicedToArray(_ref15, 1),\n key = _ref16[0];\n return has(key.evaluate(ctx), ctx.properties());\n }], [[StringType, ObjectType], function (ctx, _ref17) {\n var _ref18 = _slicedToArray(_ref17, 2),\n key = _ref18[0],\n obj = _ref18[1];\n return has(key.evaluate(ctx), obj.evaluate(ctx));\n }]]\n },\n 'get': {\n type: ValueType,\n overloads: [[[StringType], function (ctx, _ref19) {\n var _ref20 = _slicedToArray(_ref19, 1),\n key = _ref20[0];\n return get(key.evaluate(ctx), ctx.properties());\n }], [[StringType, ObjectType], function (ctx, _ref21) {\n var _ref22 = _slicedToArray(_ref21, 2),\n key = _ref22[0],\n obj = _ref22[1];\n return get(key.evaluate(ctx), obj.evaluate(ctx));\n }]]\n },\n 'feature-state': [ValueType, [StringType], function (ctx, _ref23) {\n var _ref24 = _slicedToArray(_ref23, 1),\n key = _ref24[0];\n return get(key.evaluate(ctx), ctx.featureState || {});\n }],\n 'properties': [ObjectType, [], function (ctx) {\n return ctx.properties();\n }],\n 'geometry-type': [StringType, [], function (ctx) {\n return ctx.geometryType();\n }],\n 'id': [ValueType, [], function (ctx) {\n return ctx.id();\n }],\n 'zoom': [NumberType, [], function (ctx) {\n return ctx.globals.zoom;\n }],\n 'heatmap-density': [NumberType, [], function (ctx) {\n return ctx.globals.heatmapDensity || 0;\n }],\n 'line-progress': [NumberType, [], function (ctx) {\n return ctx.globals.lineProgress || 0;\n }],\n 'sky-radial-progress': [NumberType, [], function (ctx) {\n return ctx.globals.skyRadialProgress || 0;\n }],\n 'accumulated': [ValueType, [], function (ctx) {\n return ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated;\n }],\n '+': [NumberType, varargs(NumberType), function (ctx, args) {\n var result = 0;\n var _iterator34 = _createForOfIteratorHelper(args),\n _step34;\n try {\n for (_iterator34.s(); !(_step34 = _iterator34.n()).done;) {\n var arg = _step34.value;\n result += arg.evaluate(ctx);\n }\n } catch (err) {\n _iterator34.e(err);\n } finally {\n _iterator34.f();\n }\n return result;\n }],\n '*': [NumberType, varargs(NumberType), function (ctx, args) {\n var result = 1;\n var _iterator35 = _createForOfIteratorHelper(args),\n _step35;\n try {\n for (_iterator35.s(); !(_step35 = _iterator35.n()).done;) {\n var arg = _step35.value;\n result *= arg.evaluate(ctx);\n }\n } catch (err) {\n _iterator35.e(err);\n } finally {\n _iterator35.f();\n }\n return result;\n }],\n '-': {\n type: NumberType,\n overloads: [[[NumberType, NumberType], function (ctx, _ref25) {\n var _ref26 = _slicedToArray(_ref25, 2),\n a = _ref26[0],\n b = _ref26[1];\n return a.evaluate(ctx) - b.evaluate(ctx);\n }], [[NumberType], function (ctx, _ref27) {\n var _ref28 = _slicedToArray(_ref27, 1),\n a = _ref28[0];\n return -a.evaluate(ctx);\n }]]\n },\n '/': [NumberType, [NumberType, NumberType], function (ctx, _ref29) {\n var _ref30 = _slicedToArray(_ref29, 2),\n a = _ref30[0],\n b = _ref30[1];\n return a.evaluate(ctx) / b.evaluate(ctx);\n }],\n '%': [NumberType, [NumberType, NumberType], function (ctx, _ref31) {\n var _ref32 = _slicedToArray(_ref31, 2),\n a = _ref32[0],\n b = _ref32[1];\n return a.evaluate(ctx) % b.evaluate(ctx);\n }],\n 'ln2': [NumberType, [], function () {\n return Math.LN2;\n }],\n 'pi': [NumberType, [], function () {\n return Math.PI;\n }],\n 'e': [NumberType, [], function () {\n return Math.E;\n }],\n '^': [NumberType, [NumberType, NumberType], function (ctx, _ref33) {\n var _ref34 = _slicedToArray(_ref33, 2),\n b = _ref34[0],\n e = _ref34[1];\n return Math.pow(b.evaluate(ctx), e.evaluate(ctx));\n }],\n 'sqrt': [NumberType, [NumberType], function (ctx, _ref35) {\n var _ref36 = _slicedToArray(_ref35, 1),\n x = _ref36[0];\n return Math.sqrt(x.evaluate(ctx));\n }],\n 'log10': [NumberType, [NumberType], function (ctx, _ref37) {\n var _ref38 = _slicedToArray(_ref37, 1),\n n = _ref38[0];\n return Math.log(n.evaluate(ctx)) / Math.LN10;\n }],\n 'ln': [NumberType, [NumberType], function (ctx, _ref39) {\n var _ref40 = _slicedToArray(_ref39, 1),\n n = _ref40[0];\n return Math.log(n.evaluate(ctx));\n }],\n 'log2': [NumberType, [NumberType], function (ctx, _ref41) {\n var _ref42 = _slicedToArray(_ref41, 1),\n n = _ref42[0];\n return Math.log(n.evaluate(ctx)) / Math.LN2;\n }],\n 'sin': [NumberType, [NumberType], function (ctx, _ref43) {\n var _ref44 = _slicedToArray(_ref43, 1),\n n = _ref44[0];\n return Math.sin(n.evaluate(ctx));\n }],\n 'cos': [NumberType, [NumberType], function (ctx, _ref45) {\n var _ref46 = _slicedToArray(_ref45, 1),\n n = _ref46[0];\n return Math.cos(n.evaluate(ctx));\n }],\n 'tan': [NumberType, [NumberType], function (ctx, _ref47) {\n var _ref48 = _slicedToArray(_ref47, 1),\n n = _ref48[0];\n return Math.tan(n.evaluate(ctx));\n }],\n 'asin': [NumberType, [NumberType], function (ctx, _ref49) {\n var _ref50 = _slicedToArray(_ref49, 1),\n n = _ref50[0];\n return Math.asin(n.evaluate(ctx));\n }],\n 'acos': [NumberType, [NumberType], function (ctx, _ref51) {\n var _ref52 = _slicedToArray(_ref51, 1),\n n = _ref52[0];\n return Math.acos(n.evaluate(ctx));\n }],\n 'atan': [NumberType, [NumberType], function (ctx, _ref53) {\n var _ref54 = _slicedToArray(_ref53, 1),\n n = _ref54[0];\n return Math.atan(n.evaluate(ctx));\n }],\n 'min': [NumberType, varargs(NumberType), function (ctx, args) {\n return Math.min.apply(Math, _toConsumableArray(args.map(function (arg) {\n return arg.evaluate(ctx);\n })));\n }],\n 'max': [NumberType, varargs(NumberType), function (ctx, args) {\n return Math.max.apply(Math, _toConsumableArray(args.map(function (arg) {\n return arg.evaluate(ctx);\n })));\n }],\n 'abs': [NumberType, [NumberType], function (ctx, _ref55) {\n var _ref56 = _slicedToArray(_ref55, 1),\n n = _ref56[0];\n return Math.abs(n.evaluate(ctx));\n }],\n 'round': [NumberType, [NumberType], function (ctx, _ref57) {\n var _ref58 = _slicedToArray(_ref57, 1),\n n = _ref58[0];\n var v = n.evaluate(ctx);\n return v < 0 ? -Math.round(-v) : Math.round(v);\n }],\n 'floor': [NumberType, [NumberType], function (ctx, _ref59) {\n var _ref60 = _slicedToArray(_ref59, 1),\n n = _ref60[0];\n return Math.floor(n.evaluate(ctx));\n }],\n 'ceil': [NumberType, [NumberType], function (ctx, _ref61) {\n var _ref62 = _slicedToArray(_ref61, 1),\n n = _ref62[0];\n return Math.ceil(n.evaluate(ctx));\n }],\n 'filter-==': [BooleanType, [StringType, ValueType], function (ctx, _ref63) {\n var _ref64 = _slicedToArray(_ref63, 2),\n k = _ref64[0],\n v = _ref64[1];\n return ctx.properties()[k.value] === v.value;\n }],\n 'filter-id-==': [BooleanType, [ValueType], function (ctx, _ref65) {\n var _ref66 = _slicedToArray(_ref65, 1),\n v = _ref66[0];\n return ctx.id() === v.value;\n }],\n 'filter-type-==': [BooleanType, [StringType], function (ctx, _ref67) {\n var _ref68 = _slicedToArray(_ref67, 1),\n v = _ref68[0];\n return ctx.geometryType() === v.value;\n }],\n 'filter-<': [BooleanType, [StringType, ValueType], function (ctx, _ref69) {\n var _ref70 = _slicedToArray(_ref69, 2),\n k = _ref70[0],\n v = _ref70[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a < b;\n }],\n 'filter-id-<': [BooleanType, [ValueType], function (ctx, _ref71) {\n var _ref72 = _slicedToArray(_ref71, 1),\n v = _ref72[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a < b;\n }],\n 'filter->': [BooleanType, [StringType, ValueType], function (ctx, _ref73) {\n var _ref74 = _slicedToArray(_ref73, 2),\n k = _ref74[0],\n v = _ref74[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a > b;\n }],\n 'filter-id->': [BooleanType, [ValueType], function (ctx, _ref75) {\n var _ref76 = _slicedToArray(_ref75, 1),\n v = _ref76[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a > b;\n }],\n 'filter-<=': [BooleanType, [StringType, ValueType], function (ctx, _ref77) {\n var _ref78 = _slicedToArray(_ref77, 2),\n k = _ref78[0],\n v = _ref78[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a <= b;\n }],\n 'filter-id-<=': [BooleanType, [ValueType], function (ctx, _ref79) {\n var _ref80 = _slicedToArray(_ref79, 1),\n v = _ref80[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a <= b;\n }],\n 'filter->=': [BooleanType, [StringType, ValueType], function (ctx, _ref81) {\n var _ref82 = _slicedToArray(_ref81, 2),\n k = _ref82[0],\n v = _ref82[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a >= b;\n }],\n 'filter-id->=': [BooleanType, [ValueType], function (ctx, _ref83) {\n var _ref84 = _slicedToArray(_ref83, 1),\n v = _ref84[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a >= b;\n }],\n 'filter-has': [BooleanType, [ValueType], function (ctx, _ref85) {\n var _ref86 = _slicedToArray(_ref85, 1),\n k = _ref86[0];\n return k.value in ctx.properties();\n }],\n 'filter-has-id': [BooleanType, [], function (ctx) {\n return ctx.id() !== null && ctx.id() !== undefined;\n }],\n 'filter-type-in': [BooleanType, [array(StringType)], function (ctx, _ref87) {\n var _ref88 = _slicedToArray(_ref87, 1),\n v = _ref88[0];\n return v.value.indexOf(ctx.geometryType()) >= 0;\n }],\n 'filter-id-in': [BooleanType, [array(ValueType)], function (ctx, _ref89) {\n var _ref90 = _slicedToArray(_ref89, 1),\n v = _ref90[0];\n return v.value.indexOf(ctx.id()) >= 0;\n }],\n 'filter-in-small': [BooleanType, [StringType, array(ValueType)], function (ctx, _ref91) {\n var _ref92 = _slicedToArray(_ref91, 2),\n k = _ref92[0],\n v = _ref92[1];\n return v.value.indexOf(ctx.properties()[k.value]) >= 0;\n }],\n 'filter-in-large': [BooleanType, [StringType, array(ValueType)], function (ctx, _ref93) {\n var _ref94 = _slicedToArray(_ref93, 2),\n k = _ref94[0],\n v = _ref94[1];\n return binarySearch(ctx.properties()[k.value], v.value, 0, v.value.length - 1);\n }],\n 'all': {\n type: BooleanType,\n overloads: [[[BooleanType, BooleanType], function (ctx, _ref95) {\n var _ref96 = _slicedToArray(_ref95, 2),\n a = _ref96[0],\n b = _ref96[1];\n return a.evaluate(ctx) && b.evaluate(ctx);\n }], [varargs(BooleanType), function (ctx, args) {\n var _iterator36 = _createForOfIteratorHelper(args),\n _step36;\n try {\n for (_iterator36.s(); !(_step36 = _iterator36.n()).done;) {\n var arg = _step36.value;\n if (!arg.evaluate(ctx)) return false;\n }\n } catch (err) {\n _iterator36.e(err);\n } finally {\n _iterator36.f();\n }\n return true;\n }]]\n },\n 'any': {\n type: BooleanType,\n overloads: [[[BooleanType, BooleanType], function (ctx, _ref97) {\n var _ref98 = _slicedToArray(_ref97, 2),\n a = _ref98[0],\n b = _ref98[1];\n return a.evaluate(ctx) || b.evaluate(ctx);\n }], [varargs(BooleanType), function (ctx, args) {\n var _iterator37 = _createForOfIteratorHelper(args),\n _step37;\n try {\n for (_iterator37.s(); !(_step37 = _iterator37.n()).done;) {\n var arg = _step37.value;\n if (arg.evaluate(ctx)) return true;\n }\n } catch (err) {\n _iterator37.e(err);\n } finally {\n _iterator37.f();\n }\n return false;\n }]]\n },\n '!': [BooleanType, [BooleanType], function (ctx, _ref99) {\n var _ref100 = _slicedToArray(_ref99, 1),\n b = _ref100[0];\n return !b.evaluate(ctx);\n }],\n 'is-supported-script': [BooleanType, [StringType], function (ctx, _ref101) {\n var _ref102 = _slicedToArray(_ref101, 1),\n s = _ref102[0];\n var isSupportedScript = ctx.globals && ctx.globals.isSupportedScript;\n if (isSupportedScript) {\n return isSupportedScript(s.evaluate(ctx));\n }\n return true;\n }],\n 'upcase': [StringType, [StringType], function (ctx, _ref103) {\n var _ref104 = _slicedToArray(_ref103, 1),\n s = _ref104[0];\n return s.evaluate(ctx).toUpperCase();\n }],\n 'downcase': [StringType, [StringType], function (ctx, _ref105) {\n var _ref106 = _slicedToArray(_ref105, 1),\n s = _ref106[0];\n return s.evaluate(ctx).toLowerCase();\n }],\n 'concat': [StringType, varargs(ValueType), function (ctx, args) {\n return args.map(function (arg) {\n return toString$1(arg.evaluate(ctx));\n }).join('');\n }],\n 'resolved-locale': [StringType, [CollatorType], function (ctx, _ref107) {\n var _ref108 = _slicedToArray(_ref107, 1),\n collator = _ref108[0];\n return collator.evaluate(ctx).resolvedLocale();\n }]\n});\nfunction success(value) {\n return {\n result: 'success',\n value: value\n };\n}\nfunction error(value) {\n return {\n result: 'error',\n value: value\n };\n}\nfunction supportsPropertyExpression(spec) {\n return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven';\n}\nfunction supportsZoomExpression(spec) {\n return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1;\n}\nfunction supportsInterpolation(spec) {\n return !!spec.expression && spec.expression.interpolated;\n}\nfunction getType(val) {\n if (val instanceof Number) {\n return 'number';\n } else if (val instanceof String) {\n return 'string';\n } else if (val instanceof Boolean) {\n return 'boolean';\n } else if (Array.isArray(val)) {\n return 'array';\n } else if (val === null) {\n return 'null';\n } else {\n return _typeof(val);\n }\n}\nfunction isFunction$1(value) {\n return _typeof(value) === 'object' && value !== null && !Array.isArray(value);\n}\nfunction identityFunction(x) {\n return x;\n}\nfunction createFunction(parameters, propertySpec) {\n var isColor = propertySpec.type === 'color';\n var zoomAndFeatureDependent = parameters.stops && _typeof(parameters.stops[0][0]) === 'object';\n var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n var zoomDependent = zoomAndFeatureDependent || !featureDependent;\n var type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');\n if (isColor) {\n parameters = extend({}, parameters);\n if (parameters.stops) {\n parameters.stops = parameters.stops.map(function (stop) {\n return [stop[0], Color.parse(stop[1])];\n });\n }\n if (parameters[\"default\"]) {\n parameters[\"default\"] = Color.parse(parameters[\"default\"]);\n } else {\n parameters[\"default\"] = Color.parse(propertySpec[\"default\"]);\n }\n }\n if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) {\n throw new Error(\"Unknown color space: \".concat(parameters.colorSpace));\n }\n var innerFun;\n var hashedStops;\n var categoricalKeyType;\n if (type === 'exponential') {\n innerFun = evaluateExponentialFunction;\n } else if (type === 'interval') {\n innerFun = evaluateIntervalFunction;\n } else if (type === 'categorical') {\n innerFun = evaluateCategoricalFunction;\n hashedStops = Object.create(null);\n var _iterator38 = _createForOfIteratorHelper(parameters.stops),\n _step38;\n try {\n for (_iterator38.s(); !(_step38 = _iterator38.n()).done;) {\n var stop = _step38.value;\n hashedStops[stop[0]] = stop[1];\n }\n } catch (err) {\n _iterator38.e(err);\n } finally {\n _iterator38.f();\n }\n categoricalKeyType = _typeof(parameters.stops[0][0]);\n } else if (type === 'identity') {\n innerFun = evaluateIdentityFunction;\n } else {\n throw new Error(\"Unknown function type \\\"\".concat(type, \"\\\"\"));\n }\n if (zoomAndFeatureDependent) {\n var featureFunctions = {};\n var zoomStops = [];\n for (var s = 0; s < parameters.stops.length; s++) {\n var _stop = parameters.stops[s];\n var zoom = _stop[0].zoom;\n if (featureFunctions[zoom] === undefined) {\n featureFunctions[zoom] = {\n zoom: zoom,\n type: parameters.type,\n property: parameters.property,\n \"default\": parameters[\"default\"],\n stops: []\n };\n zoomStops.push(zoom);\n }\n featureFunctions[zoom].stops.push([_stop[0].value, _stop[1]]);\n }\n var featureFunctionStops = [];\n for (var _i8 = 0, _zoomStops = zoomStops; _i8 < _zoomStops.length; _i8++) {\n var z = _zoomStops[_i8];\n featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);\n }\n var interpolationType = {\n name: 'linear'\n };\n return {\n kind: 'composite',\n interpolationType: interpolationType,\n interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),\n zoomStops: featureFunctionStops.map(function (s) {\n return s[0];\n }),\n evaluate: function evaluate(_ref109, properties) {\n var zoom = _ref109.zoom;\n return evaluateExponentialFunction({\n stops: featureFunctionStops,\n base: parameters.base\n }, propertySpec, zoom).evaluate(zoom, properties);\n }\n };\n } else if (zoomDependent) {\n var _interpolationType = type === 'exponential' ? {\n name: 'exponential',\n base: parameters.base !== undefined ? parameters.base : 1\n } : null;\n return {\n kind: 'camera',\n interpolationType: _interpolationType,\n interpolationFactor: Interpolate.interpolationFactor.bind(undefined, _interpolationType),\n zoomStops: parameters.stops.map(function (s) {\n return s[0];\n }),\n evaluate: function evaluate(_ref110) {\n var zoom = _ref110.zoom;\n return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType);\n }\n };\n } else {\n return {\n kind: 'source',\n evaluate: function evaluate(_, feature) {\n var value = feature && feature.properties ? feature.properties[parameters.property] : undefined;\n if (value === undefined) {\n return coalesce(parameters[\"default\"], propertySpec[\"default\"]);\n }\n return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);\n }\n };\n }\n}\nfunction coalesce(a, b, c) {\n if (a !== undefined) return a;\n if (b !== undefined) return b;\n if (c !== undefined) return c;\n}\nfunction evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {\n var evaluated = _typeof(input) === keyType ? hashedStops[input] : undefined;\n return coalesce(evaluated, parameters[\"default\"], propertySpec[\"default\"]);\n}\nfunction evaluateIntervalFunction(parameters, propertySpec, input) {\n if (getType(input) !== 'number') return coalesce(parameters[\"default\"], propertySpec[\"default\"]);\n var n = parameters.stops.length;\n if (n === 1) return parameters.stops[0][1];\n if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) {\n return stop[0];\n }), input);\n return parameters.stops[index][1];\n}\nfunction evaluateExponentialFunction(parameters, propertySpec, input) {\n var base = parameters.base !== undefined ? parameters.base : 1;\n if (getType(input) !== 'number') return coalesce(parameters[\"default\"], propertySpec[\"default\"]);\n var n = parameters.stops.length;\n if (n === 1) return parameters.stops[0][1];\n if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) {\n return stop[0];\n }), input);\n var t = interpolationFactor(input, base, parameters.stops[index][0], parameters.stops[index + 1][0]);\n var outputLower = parameters.stops[index][1];\n var outputUpper = parameters.stops[index + 1][1];\n var interp = interpolate[propertySpec.type] || identityFunction;\n if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {\n var colorspace = colorSpaces[parameters.colorSpace];\n interp = function interp(a, b) {\n return colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t));\n };\n }\n if (typeof outputLower.evaluate === 'function') {\n return {\n evaluate: function evaluate() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key5 = 0; _key5 < _len3; _key5++) {\n args[_key5] = arguments[_key5];\n }\n var evaluatedLower = outputLower.evaluate.apply(undefined, args);\n var evaluatedUpper = outputUpper.evaluate.apply(undefined, args);\n if (evaluatedLower === undefined || evaluatedUpper === undefined) {\n return undefined;\n }\n return interp(evaluatedLower, evaluatedUpper, t);\n }\n };\n }\n return interp(outputLower, outputUpper, t);\n}\nfunction evaluateIdentityFunction(parameters, propertySpec, input) {\n if (propertySpec.type === 'color') {\n input = Color.parse(input);\n } else if (propertySpec.type === 'formatted') {\n input = Formatted.fromString(input.toString());\n } else if (propertySpec.type === 'resolvedImage') {\n input = ResolvedImage.fromString(input.toString());\n } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) {\n input = undefined;\n }\n return coalesce(input, parameters[\"default\"], propertySpec[\"default\"]);\n}\nfunction interpolationFactor(input, base, lowerValue, upperValue) {\n var difference = upperValue - lowerValue;\n var progress = input - lowerValue;\n if (difference === 0) {\n return 0;\n } else if (base === 1) {\n return progress / difference;\n } else {\n return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n }\n}\nvar StyleExpression = /*#__PURE__*/function () {\n function StyleExpression(expression, propertySpec) {\n _classCallCheck(this, StyleExpression);\n this.expression = expression;\n this._warningHistory = {};\n this._evaluator = new EvaluationContext();\n this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;\n this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;\n }\n return _createClass(StyleExpression, [{\n key: \"evaluateWithoutErrorHandling\",\n value: function evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {\n this._evaluator.globals = globals;\n this._evaluator.feature = feature;\n this._evaluator.featureState = featureState;\n this._evaluator.canonical = canonical;\n this._evaluator.availableImages = availableImages || null;\n this._evaluator.formattedSection = formattedSection;\n return this.expression.evaluate(this._evaluator);\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {\n this._evaluator.globals = globals;\n this._evaluator.feature = feature || null;\n this._evaluator.featureState = featureState || null;\n this._evaluator.canonical = canonical;\n this._evaluator.availableImages = availableImages || null;\n this._evaluator.formattedSection = formattedSection || null;\n try {\n var val = this.expression.evaluate(this._evaluator);\n if (val === null || val === undefined || typeof val === 'number' && val !== val) {\n return this._defaultValue;\n }\n if (this._enumValues && !(val in this._enumValues)) {\n throw new RuntimeError(\"Expected value to be one of \".concat(Object.keys(this._enumValues).map(function (v) {\n return JSON.stringify(v);\n }).join(', '), \", but found \").concat(JSON.stringify(val), \" instead.\"));\n }\n return val;\n } catch (e) {\n if (!this._warningHistory[e.message]) {\n this._warningHistory[e.message] = true;\n if (typeof console !== 'undefined') {\n console.warn(e.message);\n }\n }\n return this._defaultValue;\n }\n }\n }]);\n}();\nfunction isExpression(expression) {\n return Array.isArray(expression) && expression.length > 0 && typeof expression[0] === 'string' && expression[0] in expressions;\n}\nfunction createExpression(expression, propertySpec) {\n var parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined);\n var parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? {\n typeAnnotation: 'coerce'\n } : undefined);\n if (!parsed) {\n return error(parser.errors);\n }\n return success(new StyleExpression(parsed, propertySpec));\n}\nvar ZoomConstantExpression = /*#__PURE__*/function () {\n function ZoomConstantExpression(kind, expression) {\n _classCallCheck(this, ZoomConstantExpression);\n this.kind = kind;\n this._styleExpression = expression;\n this.isStateDependent = kind !== 'constant' && !isStateConstant(expression.expression);\n }\n return _createClass(ZoomConstantExpression, [{\n key: \"evaluateWithoutErrorHandling\",\n value: function evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }]);\n}();\nvar ZoomDependentExpression = /*#__PURE__*/function () {\n function ZoomDependentExpression(kind, expression, zoomStops, interpolationType) {\n _classCallCheck(this, ZoomDependentExpression);\n this.kind = kind;\n this.zoomStops = zoomStops;\n this._styleExpression = expression;\n this.isStateDependent = kind !== 'camera' && !isStateConstant(expression.expression);\n this.interpolationType = interpolationType;\n }\n return _createClass(ZoomDependentExpression, [{\n key: \"evaluateWithoutErrorHandling\",\n value: function evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }, {\n key: \"interpolationFactor\",\n value: function interpolationFactor(input, lower, upper) {\n if (this.interpolationType) {\n return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper);\n } else {\n return 0;\n }\n }\n }]);\n}();\nfunction createPropertyExpression(expression, propertySpec) {\n expression = createExpression(expression, propertySpec);\n if (expression.result === 'error') {\n return expression;\n }\n var parsed = expression.value.expression;\n var isFeatureConstant$1 = isFeatureConstant(parsed);\n if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) {\n return error([new ParsingError('', 'data expressions not supported')]);\n }\n var isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']);\n if (!isZoomConstant && !supportsZoomExpression(propertySpec)) {\n return error([new ParsingError('', 'zoom expressions not supported')]);\n }\n var zoomCurve = findZoomCurve(parsed);\n if (!zoomCurve && !isZoomConstant) {\n return error([new ParsingError('', '\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.')]);\n } else if (zoomCurve instanceof ParsingError) {\n return error([zoomCurve]);\n } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) {\n return error([new ParsingError('', '\"interpolate\" expressions cannot be used with this property')]);\n }\n if (!zoomCurve) {\n return success(isFeatureConstant$1 ? new ZoomConstantExpression('constant', expression.value) : new ZoomConstantExpression('source', expression.value));\n }\n var interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined;\n return success(isFeatureConstant$1 ? new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) : new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType));\n}\nvar StylePropertyFunction = /*#__PURE__*/function () {\n function StylePropertyFunction(parameters, specification) {\n _classCallCheck(this, StylePropertyFunction);\n this._parameters = parameters;\n this._specification = specification;\n extend(this, createFunction(this._parameters, this._specification));\n }\n return _createClass(StylePropertyFunction, null, [{\n key: \"deserialize\",\n value: function deserialize(serialized) {\n return new StylePropertyFunction(serialized._parameters, serialized._specification);\n }\n }, {\n key: \"serialize\",\n value: function serialize(input) {\n return {\n _parameters: input._parameters,\n _specification: input._specification\n };\n }\n }]);\n}();\nfunction normalizePropertyExpression(value, specification) {\n if (isFunction$1(value)) {\n return new StylePropertyFunction(value, specification);\n } else if (isExpression(value)) {\n var _expression8 = createPropertyExpression(value, specification);\n if (_expression8.result === 'error') {\n throw new Error(_expression8.value.map(function (err) {\n return \"\".concat(err.key, \": \").concat(err.message);\n }).join(', '));\n }\n return _expression8.value;\n } else {\n var constant = value;\n if (typeof value === 'string' && specification.type === 'color') {\n constant = Color.parse(value);\n }\n return {\n kind: 'constant',\n evaluate: function evaluate() {\n return constant;\n }\n };\n }\n}\nfunction findZoomCurve(expression) {\n var result = null;\n if (expression instanceof Let) {\n result = findZoomCurve(expression.result);\n } else if (expression instanceof Coalesce) {\n var _iterator39 = _createForOfIteratorHelper(expression.args),\n _step39;\n try {\n for (_iterator39.s(); !(_step39 = _iterator39.n()).done;) {\n var arg = _step39.value;\n result = findZoomCurve(arg);\n if (result) {\n break;\n }\n }\n } catch (err) {\n _iterator39.e(err);\n } finally {\n _iterator39.f();\n }\n } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') {\n result = expression;\n }\n if (result instanceof ParsingError) {\n return result;\n }\n expression.eachChild(function (child) {\n var childResult = findZoomCurve(child);\n if (childResult instanceof ParsingError) {\n result = childResult;\n } else if (!result && childResult) {\n result = new ParsingError('', '\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.');\n } else if (result && childResult && result !== childResult) {\n result = new ParsingError('', 'Only one zoom-based \"step\" or \"interpolate\" subexpression may be used in an expression.');\n }\n });\n return result;\n}\nfunction getExpectedType(spec) {\n var types = {\n color: ColorType,\n string: StringType,\n number: NumberType,\n \"enum\": StringType,\n \"boolean\": BooleanType,\n formatted: FormattedType,\n resolvedImage: ResolvedImageType\n };\n if (spec.type === 'array') {\n return array(types[spec.value] || ValueType, spec.length);\n }\n return types[spec.type];\n}\nfunction getDefaultValue(spec) {\n if (spec.type === 'color' && isFunction$1(spec[\"default\"])) {\n return new Color(0, 0, 0, 0);\n } else if (spec.type === 'color') {\n return Color.parse(spec[\"default\"]) || null;\n } else if (spec[\"default\"] === undefined) {\n return null;\n } else {\n return spec[\"default\"];\n }\n}\nfunction convertLiteral(value) {\n return _typeof(value) === 'object' ? ['literal', value] : value;\n}\nfunction convertFunction(parameters, propertySpec) {\n var stops = parameters.stops;\n if (!stops) {\n return convertIdentityFunction(parameters, propertySpec);\n }\n var zoomAndFeatureDependent = stops && _typeof(stops[0][0]) === 'object';\n var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n var zoomDependent = zoomAndFeatureDependent || !featureDependent;\n stops = stops.map(function (stop) {\n if (!featureDependent && propertySpec.tokens && typeof stop[1] === 'string') {\n return [stop[0], convertTokenString(stop[1])];\n }\n return [stop[0], convertLiteral(stop[1])];\n });\n if (zoomAndFeatureDependent) {\n return convertZoomAndPropertyFunction(parameters, propertySpec, stops);\n } else if (zoomDependent) {\n return convertZoomFunction(parameters, propertySpec, stops);\n } else {\n return convertPropertyFunction(parameters, propertySpec, stops);\n }\n}\nfunction convertIdentityFunction(parameters, propertySpec) {\n var get = ['get', parameters.property];\n if (parameters[\"default\"] === undefined) {\n return propertySpec.type === 'string' ? ['string', get] : get;\n } else if (propertySpec.type === 'enum') {\n return ['match', get, Object.keys(propertySpec.values), get, parameters[\"default\"]];\n } else {\n var _expression9 = [propertySpec.type === 'color' ? 'to-color' : propertySpec.type, get, convertLiteral(parameters[\"default\"])];\n if (propertySpec.type === 'array') {\n _expression9.splice(1, 0, propertySpec.value, propertySpec.length || null);\n }\n return _expression9;\n }\n}\nfunction getInterpolateOperator(parameters) {\n switch (parameters.colorSpace) {\n case 'hcl':\n return 'interpolate-hcl';\n case 'lab':\n return 'interpolate-lab';\n default:\n return 'interpolate';\n }\n}\nfunction convertZoomAndPropertyFunction(parameters, propertySpec, stops) {\n var featureFunctionParameters = {};\n var featureFunctionStops = {};\n var zoomStops = [];\n for (var s = 0; s < stops.length; s++) {\n var stop = stops[s];\n var zoom = stop[0].zoom;\n if (featureFunctionParameters[zoom] === undefined) {\n featureFunctionParameters[zoom] = {\n zoom: zoom,\n type: parameters.type,\n property: parameters.property,\n \"default\": parameters[\"default\"]\n };\n featureFunctionStops[zoom] = [];\n zoomStops.push(zoom);\n }\n featureFunctionStops[zoom].push([stop[0].value, stop[1]]);\n }\n var functionType = getFunctionType({}, propertySpec);\n if (functionType === 'exponential') {\n var _expression10 = [getInterpolateOperator(parameters), ['linear'], ['zoom']];\n var _iterator40 = _createForOfIteratorHelper(zoomStops),\n _step40;\n try {\n for (_iterator40.s(); !(_step40 = _iterator40.n()).done;) {\n var z = _step40.value;\n var output = convertPropertyFunction(featureFunctionParameters[z], propertySpec, featureFunctionStops[z]);\n appendStopPair(_expression10, z, output, false);\n }\n } catch (err) {\n _iterator40.e(err);\n } finally {\n _iterator40.f();\n }\n return _expression10;\n } else {\n var _expression11 = ['step', ['zoom']];\n var _iterator41 = _createForOfIteratorHelper(zoomStops),\n _step41;\n try {\n for (_iterator41.s(); !(_step41 = _iterator41.n()).done;) {\n var _z = _step41.value;\n var _output = convertPropertyFunction(featureFunctionParameters[_z], propertySpec, featureFunctionStops[_z]);\n appendStopPair(_expression11, _z, _output, true);\n }\n } catch (err) {\n _iterator41.e(err);\n } finally {\n _iterator41.f();\n }\n fixupDegenerateStepCurve(_expression11);\n return _expression11;\n }\n}\nfunction coalesce$1(a, b) {\n if (a !== undefined) return a;\n if (b !== undefined) return b;\n}\nfunction getFallback(parameters, propertySpec) {\n var defaultValue = convertLiteral(coalesce$1(parameters[\"default\"], propertySpec[\"default\"]));\n if (defaultValue === undefined && propertySpec.type === 'resolvedImage') {\n return '';\n }\n return defaultValue;\n}\nfunction convertPropertyFunction(parameters, propertySpec, stops) {\n var type = getFunctionType(parameters, propertySpec);\n var get = ['get', parameters.property];\n if (type === 'categorical' && typeof stops[0][0] === 'boolean') {\n var _expression12 = ['case'];\n var _iterator42 = _createForOfIteratorHelper(stops),\n _step42;\n try {\n for (_iterator42.s(); !(_step42 = _iterator42.n()).done;) {\n var stop = _step42.value;\n _expression12.push(['==', get, stop[0]], stop[1]);\n }\n } catch (err) {\n _iterator42.e(err);\n } finally {\n _iterator42.f();\n }\n _expression12.push(getFallback(parameters, propertySpec));\n return _expression12;\n } else if (type === 'categorical') {\n var _expression13 = ['match', get];\n var _iterator43 = _createForOfIteratorHelper(stops),\n _step43;\n try {\n for (_iterator43.s(); !(_step43 = _iterator43.n()).done;) {\n var _stop2 = _step43.value;\n appendStopPair(_expression13, _stop2[0], _stop2[1], false);\n }\n } catch (err) {\n _iterator43.e(err);\n } finally {\n _iterator43.f();\n }\n _expression13.push(getFallback(parameters, propertySpec));\n return _expression13;\n } else if (type === 'interval') {\n var _expression14 = ['step', ['number', get]];\n var _iterator44 = _createForOfIteratorHelper(stops),\n _step44;\n try {\n for (_iterator44.s(); !(_step44 = _iterator44.n()).done;) {\n var _stop3 = _step44.value;\n appendStopPair(_expression14, _stop3[0], _stop3[1], true);\n }\n } catch (err) {\n _iterator44.e(err);\n } finally {\n _iterator44.f();\n }\n fixupDegenerateStepCurve(_expression14);\n return parameters[\"default\"] === undefined ? _expression14 : ['case', ['==', ['typeof', get], 'number'], _expression14, convertLiteral(parameters[\"default\"])];\n } else if (type === 'exponential') {\n var base = parameters.base !== undefined ? parameters.base : 1;\n var _expression15 = [getInterpolateOperator(parameters), base === 1 ? ['linear'] : ['exponential', base], ['number', get]];\n var _iterator45 = _createForOfIteratorHelper(stops),\n _step45;\n try {\n for (_iterator45.s(); !(_step45 = _iterator45.n()).done;) {\n var _stop4 = _step45.value;\n appendStopPair(_expression15, _stop4[0], _stop4[1], false);\n }\n } catch (err) {\n _iterator45.e(err);\n } finally {\n _iterator45.f();\n }\n return parameters[\"default\"] === undefined ? _expression15 : ['case', ['==', ['typeof', get], 'number'], _expression15, convertLiteral(parameters[\"default\"])];\n } else {\n throw new Error(\"Unknown property function type \".concat(type));\n }\n}\nfunction convertZoomFunction(parameters, propertySpec, stops) {\n var input = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ['zoom'];\n var type = getFunctionType(parameters, propertySpec);\n var expression;\n var isStep = false;\n if (type === 'interval') {\n expression = ['step', input];\n isStep = true;\n } else if (type === 'exponential') {\n var base = parameters.base !== undefined ? parameters.base : 1;\n expression = [getInterpolateOperator(parameters), base === 1 ? ['linear'] : ['exponential', base], input];\n } else {\n throw new Error(\"Unknown zoom function type \\\"\".concat(type, \"\\\"\"));\n }\n var _iterator46 = _createForOfIteratorHelper(stops),\n _step46;\n try {\n for (_iterator46.s(); !(_step46 = _iterator46.n()).done;) {\n var stop = _step46.value;\n appendStopPair(expression, stop[0], stop[1], isStep);\n }\n } catch (err) {\n _iterator46.e(err);\n } finally {\n _iterator46.f();\n }\n fixupDegenerateStepCurve(expression);\n return expression;\n}\nfunction fixupDegenerateStepCurve(expression) {\n if (expression[0] === 'step' && expression.length === 3) {\n expression.push(0);\n expression.push(expression[3]);\n }\n}\nfunction appendStopPair(curve, input, output, isStep) {\n if (curve.length > 3 && input === curve[curve.length - 2]) {\n return;\n }\n if (!(isStep && curve.length === 2)) {\n curve.push(input);\n }\n curve.push(output);\n}\nfunction getFunctionType(parameters, propertySpec) {\n if (parameters.type) {\n return parameters.type;\n } else {\n return propertySpec.expression.interpolated ? 'exponential' : 'interval';\n }\n}\nfunction convertTokenString(s) {\n var result = ['concat'];\n var re = /{([^{}]+)}/g;\n var pos = 0;\n for (var match = re.exec(s); match !== null; match = re.exec(s)) {\n var literal = s.slice(pos, re.lastIndex - match[0].length);\n pos = re.lastIndex;\n if (literal.length > 0) result.push(literal);\n result.push(['get', match[1]]);\n }\n if (result.length === 1) {\n return s;\n }\n if (pos < s.length) {\n result.push(s.slice(pos));\n } else if (result.length === 2) {\n return ['to-string', result[1]];\n }\n return result;\n}\nfunction isExpressionFilter(filter) {\n if (filter === true || filter === false) {\n return true;\n }\n if (!Array.isArray(filter) || filter.length === 0) {\n return false;\n }\n switch (filter[0]) {\n case 'has':\n return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type';\n case 'in':\n return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2]));\n case '!in':\n case '!has':\n case 'none':\n return false;\n case '==':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=':\n return filter.length !== 3 || Array.isArray(filter[1]) || Array.isArray(filter[2]);\n case 'any':\n case 'all':\n var _iterator47 = _createForOfIteratorHelper(filter.slice(1)),\n _step47;\n try {\n for (_iterator47.s(); !(_step47 = _iterator47.n()).done;) {\n var f = _step47.value;\n if (!isExpressionFilter(f) && typeof f !== 'boolean') {\n return false;\n }\n }\n } catch (err) {\n _iterator47.e(err);\n } finally {\n _iterator47.f();\n }\n return true;\n default:\n return true;\n }\n}\nvar filterSpec = {\n 'type': 'boolean',\n 'default': false,\n 'transition': false,\n 'property-type': 'data-driven',\n 'expression': {\n 'interpolated': false,\n 'parameters': ['zoom', 'feature']\n }\n};\nfunction createFilter(filter) {\n if (filter === null || filter === undefined) {\n return {\n filter: function filter() {\n return true;\n },\n needGeometry: false\n };\n }\n if (!isExpressionFilter(filter)) {\n filter = convertFilter(filter);\n }\n var compiled = createExpression(filter, filterSpec);\n if (compiled.result === 'error') {\n throw new Error(compiled.value.map(function (err) {\n return \"\".concat(err.key, \": \").concat(err.message);\n }).join(', '));\n } else {\n var needGeometry = geometryNeeded(filter);\n return {\n filter: function filter(globalProperties, feature, canonical) {\n return compiled.value.evaluate(globalProperties, feature, {}, canonical);\n },\n needGeometry: needGeometry\n };\n }\n}\nfunction compare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\nfunction geometryNeeded(filter) {\n if (!Array.isArray(filter)) return false;\n if (filter[0] === 'within') return true;\n for (var index = 1; index < filter.length; index++) {\n if (geometryNeeded(filter[index])) return true;\n }\n return false;\n}\nfunction convertFilter(filter) {\n if (!filter) return true;\n var op = filter[0];\n if (filter.length <= 1) return op !== 'any';\n var converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : op === 'within' ? filter : true;\n return converted;\n}\nfunction convertComparisonOp(property, value, op) {\n switch (property) {\n case '$type':\n return [\"filter-type-\".concat(op), value];\n case '$id':\n return [\"filter-id-\".concat(op), value];\n default:\n return [\"filter-\".concat(op), property, value];\n }\n}\nfunction convertDisjunctionOp(filters) {\n return ['any'].concat(filters.map(convertFilter));\n}\nfunction convertInOp(property, values) {\n if (values.length === 0) {\n return false;\n }\n switch (property) {\n case '$type':\n return [\"filter-type-in\", ['literal', values]];\n case '$id':\n return [\"filter-id-in\", ['literal', values]];\n default:\n if (values.length > 200 && !values.some(function (v) {\n return _typeof(v) !== _typeof(values[0]);\n })) {\n return ['filter-in-large', property, ['literal', values.sort(compare)]];\n } else {\n return ['filter-in-small', property, ['literal', values]];\n }\n }\n}\nfunction convertHasOp(property) {\n switch (property) {\n case '$type':\n return true;\n case '$id':\n return [\"filter-has-id\"];\n default:\n return [\"filter-has\", property];\n }\n}\nfunction convertNegation(filter) {\n return ['!', filter];\n}\nfunction convertFilter$1(filter) {\n return _convertFilter(filter, {});\n}\nfunction _convertFilter(filter, expectedTypes) {\n if (isExpressionFilter(filter)) {\n return filter;\n }\n if (!filter) return true;\n var op = filter[0];\n if (filter.length <= 1) return op !== 'any';\n var converted;\n if (op === '==' || op === '!=' || op === '<' || op === '>' || op === '<=' || op === '>=') {\n var _filter = _slicedToArray(filter, 3),\n property = _filter[1],\n value = _filter[2];\n converted = convertComparisonOp$1(property, value, op, expectedTypes);\n } else if (op === 'any') {\n var children = filter.slice(1).map(function (f) {\n var types = {};\n var child = _convertFilter(f, types);\n var typechecks = runtimeTypeChecks(types);\n return typechecks === true ? child : ['case', typechecks, child, false];\n });\n return ['any'].concat(children);\n } else if (op === 'all') {\n var _ref111;\n var _children = filter.slice(1).map(function (f) {\n return _convertFilter(f, expectedTypes);\n });\n return _children.length > 1 ? ['all'].concat(_children) : (_ref111 = []).concat.apply(_ref111, _toConsumableArray(_children));\n } else if (op === 'none') {\n return ['!', _convertFilter(['any'].concat(filter.slice(1)), {})];\n } else if (op === 'in') {\n converted = convertInOp$1(filter[1], filter.slice(2));\n } else if (op === '!in') {\n converted = convertInOp$1(filter[1], filter.slice(2), true);\n } else if (op === 'has') {\n converted = convertHasOp$1(filter[1]);\n } else if (op === '!has') {\n converted = ['!', convertHasOp$1(filter[1])];\n } else {\n converted = true;\n }\n return converted;\n}\nfunction runtimeTypeChecks(expectedTypes) {\n var conditions = [];\n for (var property in expectedTypes) {\n var _get = property === '$id' ? ['id'] : ['get', property];\n conditions.push(['==', ['typeof', _get], expectedTypes[property]]);\n }\n if (conditions.length === 0) return true;\n if (conditions.length === 1) return conditions[0];\n return ['all'].concat(conditions);\n}\nfunction convertComparisonOp$1(property, value, op, expectedTypes) {\n var get;\n if (property === '$type') {\n return [op, ['geometry-type'], value];\n } else if (property === '$id') {\n get = ['id'];\n } else {\n get = ['get', property];\n }\n if (expectedTypes && value !== null) {\n var type = _typeof(value);\n expectedTypes[property] = type;\n }\n if (op === '==' && property !== '$id' && value === null) {\n return ['all', ['has', property], ['==', get, null]];\n } else if (op === '!=' && property !== '$id' && value === null) {\n return ['any', ['!', ['has', property]], ['!=', get, null]];\n }\n return [op, get, value];\n}\nfunction convertInOp$1(property, values) {\n var negate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (values.length === 0) return negate;\n var get;\n if (property === '$type') {\n get = ['geometry-type'];\n } else if (property === '$id') {\n get = ['id'];\n } else {\n get = ['get', property];\n }\n var uniformTypes = true;\n var type = _typeof(values[0]);\n var _iterator48 = _createForOfIteratorHelper(values),\n _step48;\n try {\n for (_iterator48.s(); !(_step48 = _iterator48.n()).done;) {\n var value = _step48.value;\n if (_typeof(value) !== type) {\n uniformTypes = false;\n break;\n }\n }\n } catch (err) {\n _iterator48.e(err);\n } finally {\n _iterator48.f();\n }\n if (uniformTypes && (type === 'string' || type === 'number')) {\n var uniqueValues = values.sort().filter(function (v, i) {\n return i === 0 || values[i - 1] !== v;\n });\n return ['match', get, uniqueValues, !negate, negate];\n }\n return [negate ? 'all' : 'any'].concat(values.map(function (v) {\n return [negate ? '!=' : '==', get, v];\n }));\n}\nfunction convertHasOp$1(property) {\n if (property === '$type') {\n return true;\n } else if (property === '$id') {\n return ['!=', ['id'], null];\n } else {\n return ['has', property];\n }\n}\nfunction migrateToExpressions(style) {\n var converted = [];\n eachLayer(style, function (layer) {\n if (layer.filter) {\n layer.filter = convertFilter$1(layer.filter);\n }\n });\n eachProperty(style, {\n paint: true,\n layout: true\n }, function (_ref112) {\n var path = _ref112.path,\n value = _ref112.value,\n reference = _ref112.reference,\n set = _ref112.set;\n if (isExpression(value)) return;\n if (_typeof(value) === 'object' && !Array.isArray(value)) {\n set(convertFunction(value, reference));\n converted.push(path.join('.'));\n } else if (reference.tokens && typeof value === 'string') {\n set(convertTokenString(value));\n }\n });\n return style;\n}\nfunction migrate(style) {\n var migrated = false;\n if (style.version === 7) {\n style = migrateToV8(style);\n migrated = true;\n }\n if (style.version === 8) {\n migrated = migrateToExpressions(style);\n migrated = true;\n }\n if (!migrated) {\n throw new Error('cannot migrate from', style.version);\n }\n return style;\n}\nfunction composite(style) {\n var styleIDs = [];\n var sourceIDs = [];\n var compositedSourceLayers = [];\n for (var id in style.sources) {\n var _source = style.sources[id];\n if (_source.type !== 'vector') continue;\n var match = /^mapbox:\\/\\/(.*)/.exec(_source.url);\n if (!match) continue;\n styleIDs.push(id);\n sourceIDs.push(match[1]);\n }\n if (styleIDs.length < 2) return style;\n styleIDs.forEach(function (id) {\n delete style.sources[id];\n });\n var compositeID = sourceIDs.join(',');\n style.sources[compositeID] = {\n 'type': 'vector',\n 'url': \"mapbox://\".concat(compositeID)\n };\n style.layers.forEach(function (layer) {\n if (styleIDs.indexOf(layer.source) >= 0) {\n layer.source = compositeID;\n if ('source-layer' in layer) {\n if (compositedSourceLayers.indexOf(layer['source-layer']) >= 0) {\n throw new Error('Conflicting source layer names');\n } else {\n compositedSourceLayers.push(layer['source-layer']);\n }\n }\n }\n });\n return style;\n}\nvar refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\nfunction deref(layer, parent) {\n var result = {};\n for (var k in layer) {\n if (k !== 'ref') {\n result[k] = layer[k];\n }\n }\n refProperties.forEach(function (k) {\n if (k in parent) {\n result[k] = parent[k];\n }\n });\n return result;\n}\nfunction derefLayers(layers) {\n layers = layers.slice();\n var map = Object.create(null);\n for (var i = 0; i < layers.length; i++) {\n map[layers[i].id] = layers[i];\n }\n for (var _i9 = 0; _i9 < layers.length; _i9++) {\n if ('ref' in layers[_i9]) {\n layers[_i9] = deref(layers[_i9], map[layers[_i9].ref]);\n }\n }\n return layers;\n}\nfunction deepEqual(a, b) {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (var i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n if (_typeof(a) === 'object' && a !== null && b !== null) {\n if (!(_typeof(b) === 'object')) return false;\n var keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n for (var key in a) {\n if (!deepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n return a === b;\n}\nvar operations = {\n setStyle: 'setStyle',\n addLayer: 'addLayer',\n removeLayer: 'removeLayer',\n setPaintProperty: 'setPaintProperty',\n setLayoutProperty: 'setLayoutProperty',\n setFilter: 'setFilter',\n addSource: 'addSource',\n removeSource: 'removeSource',\n setGeoJSONSourceData: 'setGeoJSONSourceData',\n setLayerZoomRange: 'setLayerZoomRange',\n setLayerProperty: 'setLayerProperty',\n setCenter: 'setCenter',\n setZoom: 'setZoom',\n setBearing: 'setBearing',\n setPitch: 'setPitch',\n setSprite: 'setSprite',\n setGlyphs: 'setGlyphs',\n setTransition: 'setTransition',\n setLight: 'setLight',\n setTerrain: 'setTerrain',\n setFog: 'setFog'\n};\nfunction addSource(sourceId, after, commands) {\n commands.push({\n command: operations.addSource,\n args: [sourceId, after[sourceId]]\n });\n}\nfunction removeSource(sourceId, commands, sourcesRemoved) {\n commands.push({\n command: operations.removeSource,\n args: [sourceId]\n });\n sourcesRemoved[sourceId] = true;\n}\nfunction updateSource(sourceId, after, commands, sourcesRemoved) {\n removeSource(sourceId, commands, sourcesRemoved);\n addSource(sourceId, after, commands);\n}\nfunction canUpdateGeoJSON(before, after, sourceId) {\n var prop;\n for (prop in before[sourceId]) {\n if (!before[sourceId].hasOwnProperty(prop)) continue;\n if (prop !== 'data' && !deepEqual(before[sourceId][prop], after[sourceId][prop])) {\n return false;\n }\n }\n for (prop in after[sourceId]) {\n if (!after[sourceId].hasOwnProperty(prop)) continue;\n if (prop !== 'data' && !deepEqual(before[sourceId][prop], after[sourceId][prop])) {\n return false;\n }\n }\n return true;\n}\nfunction diffSources(before, after, commands, sourcesRemoved) {\n before = before || {};\n after = after || {};\n var sourceId;\n for (sourceId in before) {\n if (!before.hasOwnProperty(sourceId)) continue;\n if (!after.hasOwnProperty(sourceId)) {\n removeSource(sourceId, commands, sourcesRemoved);\n }\n }\n for (sourceId in after) {\n if (!after.hasOwnProperty(sourceId)) continue;\n if (!before.hasOwnProperty(sourceId)) {\n addSource(sourceId, after, commands);\n } else if (!deepEqual(before[sourceId], after[sourceId])) {\n if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) {\n commands.push({\n command: operations.setGeoJSONSourceData,\n args: [sourceId, after[sourceId].data]\n });\n } else {\n updateSource(sourceId, after, commands, sourcesRemoved);\n }\n }\n }\n}\nfunction diffLayerPropertyChanges(before, after, commands, layerId, klass, command) {\n before = before || {};\n after = after || {};\n var prop;\n for (prop in before) {\n if (!before.hasOwnProperty(prop)) continue;\n if (!deepEqual(before[prop], after[prop])) {\n commands.push({\n command: command,\n args: [layerId, prop, after[prop], klass]\n });\n }\n }\n for (prop in after) {\n if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue;\n if (!deepEqual(before[prop], after[prop])) {\n commands.push({\n command: command,\n args: [layerId, prop, after[prop], klass]\n });\n }\n }\n}\nfunction pluckId(layer) {\n return layer.id;\n}\nfunction indexById(group, layer) {\n group[layer.id] = layer;\n return group;\n}\nfunction diffLayers(before, after, commands) {\n before = before || [];\n after = after || [];\n var beforeOrder = before.map(pluckId);\n var afterOrder = after.map(pluckId);\n var beforeIndex = before.reduce(indexById, {});\n var afterIndex = after.reduce(indexById, {});\n var tracker = beforeOrder.slice();\n var clean = Object.create(null);\n var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop;\n for (i = 0, d = 0; i < beforeOrder.length; i++) {\n layerId = beforeOrder[i];\n if (!afterIndex.hasOwnProperty(layerId)) {\n commands.push({\n command: operations.removeLayer,\n args: [layerId]\n });\n tracker.splice(tracker.indexOf(layerId, d), 1);\n } else {\n d++;\n }\n }\n for (i = 0, d = 0; i < afterOrder.length; i++) {\n layerId = afterOrder[afterOrder.length - 1 - i];\n if (tracker[tracker.length - 1 - i] === layerId) continue;\n if (beforeIndex.hasOwnProperty(layerId)) {\n commands.push({\n command: operations.removeLayer,\n args: [layerId]\n });\n tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1);\n } else {\n d++;\n }\n insertBeforeLayerId = tracker[tracker.length - i];\n commands.push({\n command: operations.addLayer,\n args: [afterIndex[layerId], insertBeforeLayerId]\n });\n tracker.splice(tracker.length - i, 0, layerId);\n clean[layerId] = true;\n }\n for (i = 0; i < afterOrder.length; i++) {\n layerId = afterOrder[i];\n beforeLayer = beforeIndex[layerId];\n afterLayer = afterIndex[layerId];\n if (clean[layerId] || deepEqual(beforeLayer, afterLayer)) continue;\n if (!deepEqual(beforeLayer.source, afterLayer.source) || !deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !deepEqual(beforeLayer.type, afterLayer.type)) {\n commands.push({\n command: operations.removeLayer,\n args: [layerId]\n });\n insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1];\n commands.push({\n command: operations.addLayer,\n args: [afterLayer, insertBeforeLayerId]\n });\n continue;\n }\n diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty);\n diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty);\n if (!deepEqual(beforeLayer.filter, afterLayer.filter)) {\n commands.push({\n command: operations.setFilter,\n args: [layerId, afterLayer.filter]\n });\n }\n if (!deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) {\n commands.push({\n command: operations.setLayerZoomRange,\n args: [layerId, afterLayer.minzoom, afterLayer.maxzoom]\n });\n }\n for (prop in beforeLayer) {\n if (!beforeLayer.hasOwnProperty(prop)) continue;\n if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue;\n if (prop.indexOf('paint.') === 0) {\n diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n } else if (!deepEqual(beforeLayer[prop], afterLayer[prop])) {\n commands.push({\n command: operations.setLayerProperty,\n args: [layerId, prop, afterLayer[prop]]\n });\n }\n }\n for (prop in afterLayer) {\n if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) continue;\n if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue;\n if (prop.indexOf('paint.') === 0) {\n diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n } else if (!deepEqual(beforeLayer[prop], afterLayer[prop])) {\n commands.push({\n command: operations.setLayerProperty,\n args: [layerId, prop, afterLayer[prop]]\n });\n }\n }\n }\n}\nfunction diffStyles(before, after) {\n if (!before) return [{\n command: operations.setStyle,\n args: [after]\n }];\n var commands = [];\n try {\n if (!deepEqual(before.version, after.version)) {\n return [{\n command: operations.setStyle,\n args: [after]\n }];\n }\n if (!deepEqual(before.center, after.center)) {\n commands.push({\n command: operations.setCenter,\n args: [after.center]\n });\n }\n if (!deepEqual(before.zoom, after.zoom)) {\n commands.push({\n command: operations.setZoom,\n args: [after.zoom]\n });\n }\n if (!deepEqual(before.bearing, after.bearing)) {\n commands.push({\n command: operations.setBearing,\n args: [after.bearing]\n });\n }\n if (!deepEqual(before.pitch, after.pitch)) {\n commands.push({\n command: operations.setPitch,\n args: [after.pitch]\n });\n }\n if (!deepEqual(before.sprite, after.sprite)) {\n commands.push({\n command: operations.setSprite,\n args: [after.sprite]\n });\n }\n if (!deepEqual(before.glyphs, after.glyphs)) {\n commands.push({\n command: operations.setGlyphs,\n args: [after.glyphs]\n });\n }\n if (!deepEqual(before.transition, after.transition)) {\n commands.push({\n command: operations.setTransition,\n args: [after.transition]\n });\n }\n if (!deepEqual(before.light, after.light)) {\n commands.push({\n command: operations.setLight,\n args: [after.light]\n });\n }\n if (!deepEqual(before.fog, after.fog)) {\n commands.push({\n command: operations.setFog,\n args: [after.fog]\n });\n }\n var sourcesRemoved = {};\n var removeOrAddSourceCommands = [];\n diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved);\n var beforeLayers = [];\n if (before.layers) {\n before.layers.forEach(function (layer) {\n if (sourcesRemoved[layer.source]) {\n commands.push({\n command: operations.removeLayer,\n args: [layer.id]\n });\n } else {\n beforeLayers.push(layer);\n }\n });\n }\n var beforeTerrain = before.terrain;\n if (beforeTerrain) {\n if (sourcesRemoved[beforeTerrain.source]) {\n commands.push({\n command: operations.setTerrain,\n args: [undefined]\n });\n beforeTerrain = undefined;\n }\n }\n commands = commands.concat(removeOrAddSourceCommands);\n if (!deepEqual(beforeTerrain, after.terrain)) {\n commands.push({\n command: operations.setTerrain,\n args: [after.terrain]\n });\n }\n diffLayers(beforeLayers, after.layers, commands);\n } catch (e) {\n console.warn('Unable to compute style diff:', e);\n commands = [{\n command: operations.setStyle,\n args: [after]\n }];\n }\n return commands;\n}\nvar ValidationError = /*#__PURE__*/_createClass(function ValidationError(key, value, message, identifier) {\n _classCallCheck(this, ValidationError);\n this.message = (key ? \"\".concat(key, \": \") : '') + message;\n if (identifier) this.identifier = identifier;\n if (value !== null && value !== undefined && value.__line__) {\n this.line = value.__line__;\n }\n});\nvar ParsingError$1 = /*#__PURE__*/_createClass(function ParsingError$1(error) {\n _classCallCheck(this, ParsingError$1);\n this.error = error;\n this.message = error.message;\n var match = error.message.match(/line (\\d+)/);\n this.line = match ? parseInt(match[1], 10) : 0;\n});\nfunction validateConstants(options) {\n var key = options.key;\n var constants = options.value;\n if (constants) {\n return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n } else {\n return [];\n }\n}\nfunction unbundle(value) {\n if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n return value.valueOf();\n } else {\n return value;\n }\n}\nfunction deepUnbundle(value) {\n if (Array.isArray(value)) {\n return value.map(deepUnbundle);\n } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) {\n var unbundledValue = {};\n for (var key in value) {\n unbundledValue[key] = deepUnbundle(value[key]);\n }\n return unbundledValue;\n }\n return unbundle(value);\n}\nfunction validateObject(options) {\n var key = options.key;\n var object = options.value;\n var elementSpecs = options.valueSpec || {};\n var elementValidators = options.objectElementValidators || {};\n var style = options.style;\n var styleSpec = options.styleSpec;\n var errors = [];\n var type = getType(object);\n if (type !== 'object') {\n return [new ValidationError(key, object, \"object expected, \".concat(type, \" found\"))];\n }\n for (var objectKey in object) {\n var elementSpecKey = objectKey.split('.')[0];\n var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];\n var validateElement = void 0;\n if (elementValidators[elementSpecKey]) {\n validateElement = elementValidators[elementSpecKey];\n } else if (elementSpecs[elementSpecKey]) {\n validateElement = validate;\n } else if (elementValidators['*']) {\n validateElement = elementValidators['*'];\n } else if (elementSpecs['*']) {\n validateElement = validate;\n } else {\n errors.push(new ValidationError(key, object[objectKey], \"unknown property \\\"\".concat(objectKey, \"\\\"\")));\n continue;\n }\n errors = errors.concat(validateElement({\n key: (key ? \"\".concat(key, \".\") : key) + objectKey,\n value: object[objectKey],\n valueSpec: elementSpec,\n style: style,\n styleSpec: styleSpec,\n object: object,\n objectKey: objectKey\n }, object));\n }\n for (var _elementSpecKey in elementSpecs) {\n if (elementValidators[_elementSpecKey]) {\n continue;\n }\n if (elementSpecs[_elementSpecKey].required && elementSpecs[_elementSpecKey]['default'] === undefined && object[_elementSpecKey] === undefined) {\n errors.push(new ValidationError(key, object, \"missing required property \\\"\".concat(_elementSpecKey, \"\\\"\")));\n }\n }\n return errors;\n}\nfunction validateArray(options) {\n var array = options.value;\n var arraySpec = options.valueSpec;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var key = options.key;\n var validateArrayElement = options.arrayElementValidator || validate;\n if (getType(array) !== 'array') {\n return [new ValidationError(key, array, \"array expected, \".concat(getType(array), \" found\"))];\n }\n if (arraySpec.length && array.length !== arraySpec.length) {\n return [new ValidationError(key, array, \"array length \".concat(arraySpec.length, \" expected, length \").concat(array.length, \" found\"))];\n }\n if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n return [new ValidationError(key, array, \"array length at least \".concat(arraySpec['min-length'], \" expected, length \").concat(array.length, \" found\"))];\n }\n var arrayElementSpec = {\n 'type': arraySpec.value,\n 'values': arraySpec.values,\n 'minimum': arraySpec.minimum,\n 'maximum': arraySpec.maximum\n };\n if (styleSpec.$version < 7) {\n arrayElementSpec[\"function\"] = arraySpec[\"function\"];\n }\n if (getType(arraySpec.value) === 'object') {\n arrayElementSpec = arraySpec.value;\n }\n var errors = [];\n for (var i = 0; i < array.length; i++) {\n errors = errors.concat(validateArrayElement({\n array: array,\n arrayIndex: i,\n value: array[i],\n valueSpec: arrayElementSpec,\n style: style,\n styleSpec: styleSpec,\n key: \"\".concat(key, \"[\").concat(i, \"]\")\n }));\n }\n return errors;\n}\nfunction validateNumber(options) {\n var key = options.key;\n var value = options.value;\n var valueSpec = options.valueSpec;\n var type = getType(value);\n if (type === 'number' && value !== value) {\n type = 'NaN';\n }\n if (type !== 'number') {\n return [new ValidationError(key, value, \"number expected, \".concat(type, \" found\"))];\n }\n if ('minimum' in valueSpec) {\n var specMin = valueSpec.minimum;\n if (getType(valueSpec.minimum) === 'array') {\n var i = options.arrayIndex;\n specMin = valueSpec.minimum[i];\n }\n if (value < specMin) {\n return [new ValidationError(key, value, \"\".concat(value, \" is less than the minimum value \").concat(specMin))];\n }\n }\n if ('maximum' in valueSpec) {\n var specMax = valueSpec.maximum;\n if (getType(valueSpec.maximum) === 'array') {\n var _i10 = options.arrayIndex;\n specMax = valueSpec.maximum[_i10];\n }\n if (value > specMax) {\n return [new ValidationError(key, value, \"\".concat(value, \" is greater than the maximum value \").concat(specMax))];\n }\n }\n return [];\n}\nfunction validateFunction(options) {\n var functionValueSpec = options.valueSpec;\n var functionType = unbundle(options.value.type);\n var stopKeyType;\n var stopDomainValues = {};\n var previousStopDomainValue;\n var previousStopDomainZoom;\n var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;\n var isPropertyFunction = !isZoomFunction;\n var isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object';\n var errors = validateObject({\n key: options.key,\n value: options.value,\n valueSpec: options.styleSpec[\"function\"],\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n stops: validateFunctionStops,\n \"default\": validateFunctionDefault\n }\n });\n if (functionType === 'identity' && isZoomFunction) {\n errors.push(new ValidationError(options.key, options.value, 'missing required property \"property\"'));\n }\n if (functionType !== 'identity' && !options.value.stops) {\n errors.push(new ValidationError(options.key, options.value, 'missing required property \"stops\"'));\n }\n if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) {\n errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));\n }\n if (options.styleSpec.$version >= 8) {\n if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) {\n errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) {\n errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n }\n }\n if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {\n errors.push(new ValidationError(options.key, options.value, '\"property\" property is required'));\n }\n return errors;\n function validateFunctionStops(options) {\n if (functionType === 'identity') {\n return [new ValidationError(options.key, options.value, 'identity function may not have a \"stops\" property')];\n }\n var errors = [];\n var value = options.value;\n errors = errors.concat(validateArray({\n key: options.key,\n value: value,\n valueSpec: options.valueSpec,\n style: options.style,\n styleSpec: options.styleSpec,\n arrayElementValidator: validateFunctionStop\n }));\n if (getType(value) === 'array' && value.length === 0) {\n errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n }\n return errors;\n }\n function validateFunctionStop(options) {\n var errors = [];\n var value = options.value;\n var key = options.key;\n if (getType(value) !== 'array') {\n return [new ValidationError(key, value, \"array expected, \".concat(getType(value), \" found\"))];\n }\n if (value.length !== 2) {\n return [new ValidationError(key, value, \"array length 2 expected, length \".concat(value.length, \" found\"))];\n }\n if (isZoomAndPropertyFunction) {\n if (getType(value[0]) !== 'object') {\n return [new ValidationError(key, value, \"object expected, \".concat(getType(value[0]), \" found\"))];\n }\n if (value[0].zoom === undefined) {\n return [new ValidationError(key, value, 'object stop key must have zoom')];\n }\n if (value[0].value === undefined) {\n return [new ValidationError(key, value, 'object stop key must have value')];\n }\n if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {\n return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];\n }\n if (unbundle(value[0].zoom) !== previousStopDomainZoom) {\n previousStopDomainZoom = unbundle(value[0].zoom);\n previousStopDomainValue = undefined;\n stopDomainValues = {};\n }\n errors = errors.concat(validateObject({\n key: \"\".concat(key, \"[0]\"),\n value: value[0],\n valueSpec: {\n zoom: {}\n },\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n zoom: validateNumber,\n value: validateStopDomainValue\n }\n }));\n } else {\n errors = errors.concat(validateStopDomainValue({\n key: \"\".concat(key, \"[0]\"),\n value: value[0],\n valueSpec: {},\n style: options.style,\n styleSpec: options.styleSpec\n }, value));\n }\n if (isExpression(deepUnbundle(value[1]))) {\n return errors.concat([new ValidationError(\"\".concat(key, \"[1]\"), value[1], 'expressions are not allowed in function stops.')]);\n }\n return errors.concat(validate({\n key: \"\".concat(key, \"[1]\"),\n value: value[1],\n valueSpec: functionValueSpec,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n function validateStopDomainValue(options, stop) {\n var type = getType(options.value);\n var value = unbundle(options.value);\n var reportValue = options.value !== null ? options.value : stop;\n if (!stopKeyType) {\n stopKeyType = type;\n } else if (type !== stopKeyType) {\n return [new ValidationError(options.key, reportValue, \"\".concat(type, \" stop domain type must match previous stop domain type \").concat(stopKeyType))];\n }\n if (type !== 'number' && type !== 'string' && type !== 'boolean') {\n return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')];\n }\n if (type !== 'number' && functionType !== 'categorical') {\n var message = \"number expected, \".concat(type, \" found\");\n if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) {\n message += '\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.';\n }\n return [new ValidationError(options.key, reportValue, message)];\n }\n if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {\n return [new ValidationError(options.key, reportValue, \"integer expected, found \".concat(value))];\n }\n if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {\n return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')];\n } else {\n previousStopDomainValue = value;\n }\n if (functionType === 'categorical' && value in stopDomainValues) {\n return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')];\n } else {\n stopDomainValues[value] = true;\n }\n return [];\n }\n function validateFunctionDefault(options) {\n return validate({\n key: options.key,\n value: options.value,\n valueSpec: functionValueSpec,\n style: options.style,\n styleSpec: options.styleSpec\n });\n }\n}\nfunction validateExpression(options) {\n var expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec);\n if (expression.result === 'error') {\n return expression.value.map(function (error) {\n return new ValidationError(\"\".concat(options.key).concat(error.key), options.value, error.message);\n });\n }\n var expressionObj = expression.value.expression || expression.value._styleExpression.expression;\n if (options.expressionContext === 'property' && options.propertyKey === 'text-font' && !expressionObj.outputDefined()) {\n return [new ValidationError(options.key, options.value, \"Invalid data expression for \\\"\".concat(options.propertyKey, \"\\\". Output values must be contained as literals within the expression.\"))];\n }\n if (options.expressionContext === 'property' && options.propertyType === 'layout' && !isStateConstant(expressionObj)) {\n return [new ValidationError(options.key, options.value, '\"feature-state\" data expressions are not supported with layout properties.')];\n }\n if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) {\n return [new ValidationError(options.key, options.value, '\"feature-state\" data expressions are not supported with filters.')];\n }\n if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) {\n if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) {\n return [new ValidationError(options.key, options.value, '\"zoom\" and \"feature-state\" expressions are not supported with cluster properties.')];\n }\n if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) {\n return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')];\n }\n }\n return [];\n}\nfunction validateBoolean(options) {\n var value = options.value;\n var key = options.key;\n var type = getType(value);\n if (type !== 'boolean') {\n return [new ValidationError(key, value, \"boolean expected, \".concat(type, \" found\"))];\n }\n return [];\n}\nfunction validateColor(options) {\n var key = options.key;\n var value = options.value;\n var type = getType(value);\n if (type !== 'string') {\n return [new ValidationError(key, value, \"color expected, \".concat(type, \" found\"))];\n }\n if (csscolorparser.parseCSSColor(value) === null) {\n return [new ValidationError(key, value, \"color expected, \\\"\".concat(value, \"\\\" found\"))];\n }\n return [];\n}\nfunction validateEnum(options) {\n var key = options.key;\n var value = options.value;\n var valueSpec = options.valueSpec;\n var errors = [];\n if (Array.isArray(valueSpec.values)) {\n if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n errors.push(new ValidationError(key, value, \"expected one of [\".concat(valueSpec.values.join(', '), \"], \").concat(JSON.stringify(value), \" found\")));\n }\n } else {\n if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {\n errors.push(new ValidationError(key, value, \"expected one of [\".concat(Object.keys(valueSpec.values).join(', '), \"], \").concat(JSON.stringify(value), \" found\")));\n }\n }\n return errors;\n}\nfunction validateFilter(options) {\n if (isExpressionFilter(deepUnbundle(options.value))) {\n return validateExpression(extend({}, options, {\n expressionContext: 'filter',\n valueSpec: {\n value: 'boolean'\n }\n }));\n } else {\n return validateNonExpressionFilter(options);\n }\n}\nfunction validateNonExpressionFilter(options) {\n var value = options.value;\n var key = options.key;\n if (getType(value) !== 'array') {\n return [new ValidationError(key, value, \"array expected, \".concat(getType(value), \" found\"))];\n }\n var styleSpec = options.styleSpec;\n var type;\n var errors = [];\n if (value.length < 1) {\n return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n }\n errors = errors.concat(validateEnum({\n key: \"\".concat(key, \"[0]\"),\n value: value[0],\n valueSpec: styleSpec.filter_operator,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n switch (unbundle(value[0])) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n if (value.length >= 2 && unbundle(value[1]) === '$type') {\n errors.push(new ValidationError(key, value, \"\\\"$type\\\" cannot be use with operator \\\"\".concat(value[0], \"\\\"\")));\n }\n case '==':\n case '!=':\n if (value.length !== 3) {\n errors.push(new ValidationError(key, value, \"filter array for operator \\\"\".concat(value[0], \"\\\" must have 3 elements\")));\n }\n case 'in':\n case '!in':\n if (value.length >= 2) {\n type = getType(value[1]);\n if (type !== 'string') {\n errors.push(new ValidationError(\"\".concat(key, \"[1]\"), value[1], \"string expected, \".concat(type, \" found\")));\n }\n }\n for (var i = 2; i < value.length; i++) {\n type = getType(value[i]);\n if (unbundle(value[1]) === '$type') {\n errors = errors.concat(validateEnum({\n key: \"\".concat(key, \"[\").concat(i, \"]\"),\n value: value[i],\n valueSpec: styleSpec.geometry_type,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n errors.push(new ValidationError(\"\".concat(key, \"[\").concat(i, \"]\"), value[i], \"string, number, or boolean expected, \".concat(type, \" found\")));\n }\n }\n break;\n case 'any':\n case 'all':\n case 'none':\n for (var _i11 = 1; _i11 < value.length; _i11++) {\n errors = errors.concat(validateNonExpressionFilter({\n key: \"\".concat(key, \"[\").concat(_i11, \"]\"),\n value: value[_i11],\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n break;\n case 'has':\n case '!has':\n type = getType(value[1]);\n if (value.length !== 2) {\n errors.push(new ValidationError(key, value, \"filter array for \\\"\".concat(value[0], \"\\\" operator must have 2 elements\")));\n } else if (type !== 'string') {\n errors.push(new ValidationError(\"\".concat(key, \"[1]\"), value[1], \"string expected, \".concat(type, \" found\")));\n }\n break;\n case 'within':\n type = getType(value[1]);\n if (value.length !== 2) {\n errors.push(new ValidationError(key, value, \"filter array for \\\"\".concat(value[0], \"\\\" operator must have 2 elements\")));\n } else if (type !== 'object') {\n errors.push(new ValidationError(\"\".concat(key, \"[1]\"), value[1], \"object expected, \".concat(type, \" found\")));\n }\n break;\n }\n return errors;\n}\nfunction validateProperty(options, propertyType) {\n var key = options.key;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var value = options.value;\n var propertyKey = options.objectKey;\n var layerSpec = styleSpec[\"\".concat(propertyType, \"_\").concat(options.layerType)];\n if (!layerSpec) return [];\n var transitionMatch = propertyKey.match(/^(.*)-transition$/);\n if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n return validate({\n key: key,\n value: value,\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n });\n }\n var valueSpec = options.valueSpec || layerSpec[propertyKey];\n if (!valueSpec) {\n return [new ValidationError(key, value, \"unknown property \\\"\".concat(propertyKey, \"\\\"\"))];\n }\n var tokenMatch;\n if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) {\n return [new ValidationError(key, value, \"\\\"\".concat(propertyKey, \"\\\" does not support interpolation syntax\\n\") + \"Use an identity property function instead: `{ \\\"type\\\": \\\"identity\\\", \\\"property\\\": \".concat(JSON.stringify(tokenMatch[1]), \" }`.\"))];\n }\n var errors = [];\n if (options.layerType === 'symbol') {\n if (propertyKey === 'text-field' && style && !style.glyphs) {\n errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n }\n if (propertyKey === 'text-font' && isFunction$1(deepUnbundle(value)) && unbundle(value.type) === 'identity') {\n errors.push(new ValidationError(key, value, '\"text-font\" does not support identity functions'));\n }\n }\n return errors.concat(validate({\n key: options.key,\n value: value,\n valueSpec: valueSpec,\n style: style,\n styleSpec: styleSpec,\n expressionContext: 'property',\n propertyType: propertyType,\n propertyKey: propertyKey\n }));\n}\nfunction validatePaintProperty(options) {\n return validateProperty(options, 'paint');\n}\nfunction validateLayoutProperty(options) {\n return validateProperty(options, 'layout');\n}\nfunction validateLayer(options) {\n var errors = [];\n var layer = options.value;\n var key = options.key;\n var style = options.style;\n var styleSpec = options.styleSpec;\n if (!layer.type && !layer.ref) {\n errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n }\n var type = unbundle(layer.type);\n var ref = unbundle(layer.ref);\n if (layer.id) {\n var layerId = unbundle(layer.id);\n for (var i = 0; i < options.arrayIndex; i++) {\n var otherLayer = style.layers[i];\n if (unbundle(otherLayer.id) === layerId) {\n errors.push(new ValidationError(key, layer.id, \"duplicate layer id \\\"\".concat(layer.id, \"\\\", previously used at line \").concat(otherLayer.id.__line__)));\n }\n }\n }\n if ('ref' in layer) {\n ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n if (p in layer) {\n errors.push(new ValidationError(key, layer[p], \"\\\"\".concat(p, \"\\\" is prohibited for ref layers\")));\n }\n });\n var parent;\n style.layers.forEach(function (layer) {\n if (unbundle(layer.id) === ref) parent = layer;\n });\n if (!parent) {\n errors.push(new ValidationError(key, layer.ref, \"ref layer \\\"\".concat(ref, \"\\\" not found\")));\n } else if (parent.ref) {\n errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n } else {\n type = unbundle(parent.type);\n }\n } else if (!(type === 'background' || type === 'sky')) {\n if (!layer.source) {\n errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n } else {\n var _source2 = style.sources && style.sources[layer.source];\n var sourceType = _source2 && unbundle(_source2.type);\n if (!_source2) {\n errors.push(new ValidationError(key, layer.source, \"source \\\"\".concat(layer.source, \"\\\" not found\")));\n } else if (sourceType === 'vector' && type === 'raster') {\n errors.push(new ValidationError(key, layer.source, \"layer \\\"\".concat(layer.id, \"\\\" requires a raster source\")));\n } else if (sourceType === 'raster' && type !== 'raster') {\n errors.push(new ValidationError(key, layer.source, \"layer \\\"\".concat(layer.id, \"\\\" requires a vector source\")));\n } else if (sourceType === 'vector' && !layer['source-layer']) {\n errors.push(new ValidationError(key, layer, \"layer \\\"\".concat(layer.id, \"\\\" must specify a \\\"source-layer\\\"\")));\n } else if (sourceType === 'raster-dem' && type !== 'hillshade') {\n errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \\'hillshade\\'.'));\n } else if (type === 'line' && layer.paint && layer.paint['line-gradient'] && (sourceType !== 'geojson' || !_source2.lineMetrics)) {\n errors.push(new ValidationError(key, layer, \"layer \\\"\".concat(layer.id, \"\\\" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled.\")));\n }\n }\n }\n errors = errors.concat(validateObject({\n key: key,\n value: layer,\n valueSpec: styleSpec.layer,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function _() {\n return [];\n },\n type: function type() {\n return validate({\n key: \"\".concat(key, \".type\"),\n value: layer.type,\n valueSpec: styleSpec.layer.type,\n style: options.style,\n styleSpec: options.styleSpec,\n object: layer,\n objectKey: 'type'\n });\n },\n filter: validateFilter,\n layout: function layout(options) {\n return validateObject({\n layer: layer,\n key: options.key,\n value: options.value,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function _(options) {\n return validateLayoutProperty(extend({\n layerType: type\n }, options));\n }\n }\n });\n },\n paint: function paint(options) {\n return validateObject({\n layer: layer,\n key: options.key,\n value: options.value,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function _(options) {\n return validatePaintProperty(extend({\n layerType: type\n }, options));\n }\n }\n });\n }\n }\n }));\n return errors;\n}\nfunction validateString(options) {\n var value = options.value;\n var key = options.key;\n var type = getType(value);\n if (type !== 'string') {\n return [new ValidationError(key, value, \"string expected, \".concat(type, \" found\"))];\n }\n return [];\n}\nvar objectElementValidators = {\n promoteId: validatePromoteId\n};\nfunction validateSource(options) {\n var value = options.value;\n var key = options.key;\n var styleSpec = options.styleSpec;\n var style = options.style;\n if (!value.type) {\n return [new ValidationError(key, value, '\"type\" is required')];\n }\n var type = unbundle(value.type);\n var errors;\n switch (type) {\n case 'vector':\n case 'raster':\n case 'raster-dem':\n errors = validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec[\"source_\".concat(type.replace('-', '_'))],\n style: options.style,\n styleSpec: styleSpec,\n objectElementValidators: objectElementValidators\n });\n return errors;\n case 'geojson':\n errors = validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_geojson,\n style: style,\n styleSpec: styleSpec,\n objectElementValidators: objectElementValidators\n });\n if (value.cluster) {\n for (var prop in value.clusterProperties) {\n var _errors, _errors2;\n var _value$clusterPropert = _slicedToArray(value.clusterProperties[prop], 2),\n operator = _value$clusterPropert[0],\n mapExpr = _value$clusterPropert[1];\n var reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;\n (_errors = errors).push.apply(_errors, _toConsumableArray(validateExpression({\n key: \"\".concat(key, \".\").concat(prop, \".map\"),\n value: mapExpr,\n expressionContext: 'cluster-map'\n })));\n (_errors2 = errors).push.apply(_errors2, _toConsumableArray(validateExpression({\n key: \"\".concat(key, \".\").concat(prop, \".reduce\"),\n value: reduceExpr,\n expressionContext: 'cluster-reduce'\n })));\n }\n }\n return errors;\n case 'video':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_video,\n style: style,\n styleSpec: styleSpec\n });\n case 'image':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_image,\n style: style,\n styleSpec: styleSpec\n });\n case 'canvas':\n return [new ValidationError(key, null, \"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.\", 'source.canvas')];\n default:\n return validateEnum({\n key: \"\".concat(key, \".type\"),\n value: value.type,\n valueSpec: {\n values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']\n },\n style: style,\n styleSpec: styleSpec\n });\n }\n}\nfunction validatePromoteId(_ref113) {\n var key = _ref113.key,\n value = _ref113.value;\n if (getType(value) === 'string') {\n return validateString({\n key: key,\n value: value\n });\n } else {\n var errors = [];\n for (var prop in value) {\n errors.push.apply(errors, _toConsumableArray(validateString({\n key: \"\".concat(key, \".\").concat(prop),\n value: value[prop]\n })));\n }\n return errors;\n }\n}\nfunction validateLight(options) {\n var light = options.value;\n var styleSpec = options.styleSpec;\n var lightSpec = styleSpec.light;\n var style = options.style;\n var errors = [];\n var rootType = getType(light);\n if (light === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('light', light, \"object expected, \".concat(rootType, \" found\"))]);\n return errors;\n }\n for (var key in light) {\n var transitionMatch = key.match(/^(.*)-transition$/);\n if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: key,\n value: light[key],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (lightSpec[key]) {\n errors = errors.concat(validate({\n key: key,\n value: light[key],\n valueSpec: lightSpec[key],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(key, light[key], \"unknown property \\\"\".concat(key, \"\\\"\"))]);\n }\n }\n return errors;\n}\nfunction validateTerrain(options) {\n var terrain = options.value;\n var key = options.key;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var terrainSpec = styleSpec.terrain;\n var errors = [];\n var rootType = getType(terrain);\n if (terrain === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('terrain', terrain, \"object expected, \".concat(rootType, \" found\"))]);\n return errors;\n }\n for (var _key6 in terrain) {\n var transitionMatch = _key6.match(/^(.*)-transition$/);\n if (transitionMatch && terrainSpec[transitionMatch[1]] && terrainSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: _key6,\n value: terrain[_key6],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (terrainSpec[_key6]) {\n errors = errors.concat(validate({\n key: _key6,\n value: terrain[_key6],\n valueSpec: terrainSpec[_key6],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(_key6, terrain[_key6], \"unknown property \\\"\".concat(_key6, \"\\\"\"))]);\n }\n }\n if (!terrain.source) {\n errors.push(new ValidationError(key, terrain, \"terrain is missing required property \\\"source\\\"\"));\n } else {\n var _source3 = style.sources && style.sources[terrain.source];\n var sourceType = _source3 && unbundle(_source3.type);\n if (!_source3) {\n errors.push(new ValidationError(key, terrain.source, \"source \\\"\".concat(terrain.source, \"\\\" not found\")));\n } else if (sourceType !== 'raster-dem') {\n errors.push(new ValidationError(key, terrain.source, \"terrain cannot be used with a source of type \".concat(sourceType, \", it only be used with a \\\"raster-dem\\\" source type\")));\n }\n }\n return errors;\n}\nfunction validateFog(options) {\n var fog = options.value;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var fogSpec = styleSpec.fog;\n var errors = [];\n var rootType = getType(fog);\n if (fog === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('fog', fog, \"object expected, \".concat(rootType, \" found\"))]);\n return errors;\n }\n for (var key in fog) {\n var transitionMatch = key.match(/^(.*)-transition$/);\n if (transitionMatch && fogSpec[transitionMatch[1]] && fogSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: key,\n value: fog[key],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (fogSpec[key]) {\n errors = errors.concat(validate({\n key: key,\n value: fog[key],\n valueSpec: fogSpec[key],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(key, fog[key], \"unknown property \\\"\".concat(key, \"\\\"\"))]);\n }\n }\n return errors;\n}\nfunction validateFormatted(options) {\n if (validateString(options).length === 0) {\n return [];\n }\n return validateExpression(options);\n}\nfunction validateImage(options) {\n if (validateString(options).length === 0) {\n return [];\n }\n return validateExpression(options);\n}\nvar VALIDATORS = {\n '*': function _() {\n return [];\n },\n 'array': validateArray,\n 'boolean': validateBoolean,\n 'number': validateNumber,\n 'color': validateColor,\n 'constants': validateConstants,\n 'enum': validateEnum,\n 'filter': validateFilter,\n 'function': validateFunction,\n 'layer': validateLayer,\n 'object': validateObject,\n 'source': validateSource,\n 'light': validateLight,\n 'terrain': validateTerrain,\n 'fog': validateFog,\n 'string': validateString,\n 'formatted': validateFormatted,\n 'resolvedImage': validateImage\n};\nfunction validate(options) {\n var value = options.value;\n var valueSpec = options.valueSpec;\n var styleSpec = options.styleSpec;\n if (valueSpec.expression && isFunction$1(unbundle(value))) {\n return validateFunction(options);\n } else if (valueSpec.expression && isExpression(deepUnbundle(value))) {\n return validateExpression(options);\n } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n return VALIDATORS[valueSpec.type](options);\n } else {\n var valid = validateObject(extend({}, options, {\n valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n }));\n return valid;\n }\n}\nfunction validateGlyphsURL(options) {\n var value = options.value;\n var key = options.key;\n var errors = validateString(options);\n if (errors.length) return errors;\n if (value.indexOf('{fontstack}') === -1) {\n errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n }\n if (value.indexOf('{range}') === -1) {\n errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n }\n return errors;\n}\nfunction validateStyleMin(style) {\n var styleSpec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : v8;\n var errors = [];\n errors = errors.concat(validate({\n key: '',\n value: style,\n valueSpec: styleSpec.$root,\n styleSpec: styleSpec,\n style: style,\n objectElementValidators: {\n glyphs: validateGlyphsURL,\n '*': function _() {\n return [];\n }\n }\n }));\n if (style.constants) {\n errors = errors.concat(validateConstants({\n key: 'constants',\n value: style.constants,\n style: style,\n styleSpec: styleSpec\n }));\n }\n return sortErrors(errors);\n}\nvalidateStyleMin.source = wrapCleanErrors(validateSource);\nvalidateStyleMin.light = wrapCleanErrors(validateLight);\nvalidateStyleMin.terrain = wrapCleanErrors(validateTerrain);\nvalidateStyleMin.fog = wrapCleanErrors(validateFog);\nvalidateStyleMin.layer = wrapCleanErrors(validateLayer);\nvalidateStyleMin.filter = wrapCleanErrors(validateFilter);\nvalidateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty);\nvalidateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty);\nfunction sortErrors(errors) {\n return [].concat(errors).sort(function (a, b) {\n return a.line - b.line;\n });\n}\nfunction wrapCleanErrors(inner) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key7 = 0; _key7 < _len4; _key7++) {\n args[_key7] = arguments[_key7];\n }\n return sortErrors(inner.apply(this, args));\n };\n}\n\n/* parser generated by jison 0.4.15 */\n\nvar jsonlint = createCommonjsModule(function (module, exports) {\n /*\n Returns a Parser object of the following structure:\n \n Parser: {\n yy: {}\n }\n \n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n \n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n \n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n \n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n \n \n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n \n \n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n */\n var parser = function () {\n var o = function o(k, v, _o, l) {\n for (_o = _o || {}, l = k.length; l--; _o[k[l]] = v);\n return _o;\n },\n $V0 = [1, 12],\n $V1 = [1, 13],\n $V2 = [1, 9],\n $V3 = [1, 10],\n $V4 = [1, 11],\n $V5 = [1, 14],\n $V6 = [1, 15],\n $V7 = [14, 18, 22, 24],\n $V8 = [18, 22],\n $V9 = [22, 24];\n var parser = {\n trace: function trace() {},\n yy: {},\n symbols_: {\n \"error\": 2,\n \"JSONString\": 3,\n \"STRING\": 4,\n \"JSONNumber\": 5,\n \"NUMBER\": 6,\n \"JSONNullLiteral\": 7,\n \"NULL\": 8,\n \"JSONBooleanLiteral\": 9,\n \"TRUE\": 10,\n \"FALSE\": 11,\n \"JSONText\": 12,\n \"JSONValue\": 13,\n \"EOF\": 14,\n \"JSONObject\": 15,\n \"JSONArray\": 16,\n \"{\": 17,\n \"}\": 18,\n \"JSONMemberList\": 19,\n \"JSONMember\": 20,\n \":\": 21,\n \",\": 22,\n \"[\": 23,\n \"]\": 24,\n \"JSONElementList\": 25,\n \"$accept\": 0,\n \"$end\": 1\n },\n terminals_: {\n 2: \"error\",\n 4: \"STRING\",\n 6: \"NUMBER\",\n 8: \"NULL\",\n 10: \"TRUE\",\n 11: \"FALSE\",\n 14: \"EOF\",\n 17: \"{\",\n 18: \"}\",\n 21: \":\",\n 22: \",\",\n 23: \"[\",\n 24: \"]\"\n },\n productions_: [0, [3, 1], [5, 1], [7, 1], [9, 1], [9, 1], [12, 2], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [15, 2], [15, 3], [20, 3], [19, 1], [19, 3], [16, 2], [16, 3], [25, 1], [25, 3]],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n /* this == yyval */\n\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n // replace escaped characters with actual character\n this.$ = new String(yytext.replace(/\\\\(\\\\|\")/g, \"$\" + \"1\").replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\v/g, '\\v').replace(/\\\\f/g, '\\f').replace(/\\\\b/g, '\\b'));\n this.$.__line__ = this._$.first_line;\n break;\n case 2:\n this.$ = new Number(yytext);\n this.$.__line__ = this._$.first_line;\n break;\n case 3:\n this.$ = null;\n break;\n case 4:\n this.$ = new Boolean(true);\n this.$.__line__ = this._$.first_line;\n break;\n case 5:\n this.$ = new Boolean(false);\n this.$.__line__ = this._$.first_line;\n break;\n case 6:\n return this.$ = $$[$0 - 1];\n case 13:\n this.$ = {};\n Object.defineProperty(this.$, '__line__', {\n value: this._$.first_line,\n enumerable: false\n });\n break;\n case 14:\n case 19:\n this.$ = $$[$0 - 1];\n Object.defineProperty(this.$, '__line__', {\n value: this._$.first_line,\n enumerable: false\n });\n break;\n case 15:\n this.$ = [$$[$0 - 2], $$[$0]];\n break;\n case 16:\n this.$ = {};\n this.$[$$[$0][0]] = $$[$0][1];\n break;\n case 17:\n this.$ = $$[$0 - 2];\n $$[$0 - 2][$$[$0][0]] = $$[$0][1];\n break;\n case 18:\n this.$ = [];\n Object.defineProperty(this.$, '__line__', {\n value: this._$.first_line,\n enumerable: false\n });\n break;\n case 20:\n this.$ = [$$[$0]];\n break;\n case 21:\n this.$ = $$[$0 - 2];\n $$[$0 - 2].push($$[$0]);\n break;\n }\n },\n table: [{\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 12: 1,\n 13: 2,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6\n }, {\n 1: [3]\n }, {\n 14: [1, 16]\n }, o($V7, [2, 7]), o($V7, [2, 8]), o($V7, [2, 9]), o($V7, [2, 10]), o($V7, [2, 11]), o($V7, [2, 12]), o($V7, [2, 3]), o($V7, [2, 4]), o($V7, [2, 5]), o([14, 18, 21, 22, 24], [2, 1]), o($V7, [2, 2]), {\n 3: 20,\n 4: $V0,\n 18: [1, 17],\n 19: 18,\n 20: 19\n }, {\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 13: 23,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6,\n 24: [1, 21],\n 25: 22\n }, {\n 1: [2, 6]\n }, o($V7, [2, 13]), {\n 18: [1, 24],\n 22: [1, 25]\n }, o($V8, [2, 16]), {\n 21: [1, 26]\n }, o($V7, [2, 18]), {\n 22: [1, 28],\n 24: [1, 27]\n }, o($V9, [2, 20]), o($V7, [2, 14]), {\n 3: 20,\n 4: $V0,\n 20: 29\n }, {\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 13: 30,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6\n }, o($V7, [2, 19]), {\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 13: 31,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6\n }, o($V8, [2, 17]), o($V8, [2, 15]), o($V9, [2, 21])],\n defaultActions: {\n 16: [2, 6]\n },\n parseError: function parseError(str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n throw new Error(str);\n }\n },\n parse: function parse(input) {\n var self = this,\n stack = [0],\n vstack = [null],\n lstack = [],\n table = this.table,\n yytext = '',\n yylineno = 0,\n yyleng = 0,\n TERROR = 2,\n EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = {\n yy: {}\n };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function lex() {\n var token;\n token = lexer.lex() || EOF;\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol,\n state,\n action,\n r,\n yyval = {},\n p,\n len,\n newState,\n expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n }\n r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n }\n };\n /* generated by jison-lex 0.3.4 */\n var lexer = function () {\n var lexer = {\n EOF: 1,\n parseError: function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n // resets the lexer, sets new input\n setInput: function setInput(input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0, 0];\n }\n this.offset = 0;\n return this;\n },\n // consumes and returns one char from the input\n input: function input() {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n this._input = this._input.slice(1);\n return ch;\n },\n // unshifts one char (or a string) into the input\n unput: function unput(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n };\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n // When called from action, caches matched text and appends it on next action\n more: function more() {\n this._more = true;\n return this;\n },\n // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\n reject: function reject() {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n return this;\n },\n // retain first n characters of the match\n less: function less(n) {\n this.unput(this.match.slice(n));\n },\n // displays already matched input, i.e. for error messages\n pastInput: function pastInput() {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\\n/g, \"\");\n },\n // displays upcoming input, i.e. for error messages\n upcomingInput: function upcomingInput() {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20 - next.length);\n }\n return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: function showPosition() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: function test_match(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n // return next match in input\n next: function next() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n // return next match that has a token\n lex: function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: function begin(condition) {\n this.conditionStack.push(condition);\n },\n // pop the previously active lexer condition state off the condition stack\n popState: function popState() {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: function _currentRules() {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: function topState(n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n // alias for begin(condition)\n pushState: function pushState(condition) {\n this.begin(condition);\n },\n // return the number of states currently on the stack\n stateStackSize: function stateStackSize() {\n return this.conditionStack.length;\n },\n options: {},\n performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n switch ($avoiding_name_collisions) {\n case 0:\n /* skip whitespace */\n break;\n case 1:\n return 6;\n case 2:\n yy_.yytext = yy_.yytext.substr(1, yy_.yyleng - 2);\n return 4;\n case 3:\n return 17;\n case 4:\n return 18;\n case 5:\n return 23;\n case 6:\n return 24;\n case 7:\n return 22;\n case 8:\n return 21;\n case 9:\n return 10;\n case 10:\n return 11;\n case 11:\n return 8;\n case 12:\n return 14;\n case 13:\n return 'INVALID';\n }\n },\n rules: [/^(?:\\s+)/, /^(?:(-?([0-9]|[1-9][0-9]+))(\\.[0-9]+)?([eE][-+]?[0-9]+)?\\b)/, /^(?:\"(?:\\\\[\\\\\"bfnrt/]|\\\\u[a-fA-F0-9]{4}|[^\\\\\\0-\\x09\\x0a-\\x1f\"])*\")/, /^(?:\\{)/, /^(?:\\})/, /^(?:\\[)/, /^(?:\\])/, /^(?:,)/, /^(?::)/, /^(?:true\\b)/, /^(?:false\\b)/, /^(?:null\\b)/, /^(?:$)/, /^(?:.)/],\n conditions: {\n \"INITIAL\": {\n \"rules\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],\n \"inclusive\": true\n }\n }\n };\n return lexer;\n }();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n Parser.prototype = parser;\n parser.Parser = Parser;\n return new Parser();\n }();\n if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') {\n exports.parser = parser;\n exports.Parser = parser.Parser;\n exports.parse = function () {\n return parser.parse.apply(parser, arguments);\n };\n }\n});\nfunction readStyle(style) {\n if (style instanceof String || typeof style === 'string' || style instanceof Buffer) {\n try {\n return jsonlint.parse(style.toString());\n } catch (e) {\n throw new ParsingError$1(e);\n }\n }\n return style;\n}\nfunction validateStyle(style) {\n var styleSpec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : v8;\n var s = style;\n try {\n s = readStyle(s);\n } catch (e) {\n return [e];\n }\n return validateStyleMin(s, styleSpec);\n}\nvar SUPPORTED_SPEC_VERSION = 8;\nvar MAX_SOURCES_IN_STYLE = 15;\nfunction isValid(value, regex) {\n if (!value || getType(value) !== 'string') return true;\n return !!value.match(regex);\n}\nfunction getSourceCount(source) {\n if (source.url) {\n return source.url.split(',').length;\n } else {\n return 0;\n }\n}\nfunction getAllowedKeyErrors(obj, keys, path) {\n var allowed = new Set(keys);\n var errors = [];\n Object.keys(obj).forEach(function (k) {\n if (!allowed.has(k)) {\n var prop = path ? \"\".concat(path, \".\").concat(k) : null;\n errors.push(new ValidationError(prop, obj[k], \"Unsupported property \\\"\".concat(k, \"\\\"\")));\n }\n });\n return errors;\n}\nvar acceptedSourceTypes = new Set(['vector', 'raster', 'raster-dem']);\nfunction getSourceErrors(source, i) {\n var errors = [];\n var sourceKeys = ['type', 'url', 'tileSize'];\n errors.push.apply(errors, _toConsumableArray(getAllowedKeyErrors(source, sourceKeys, 'source')));\n if (!acceptedSourceTypes.has(String(source.type))) {\n errors.push(new ValidationError(\"sources[\".concat(i, \"].type\"), source.type, \"Expected one of [\".concat(Array.from(acceptedSourceTypes).join(', '), \"]\")));\n }\n var sourceUrlPattern = /^mapbox:\\/\\/([^/]*)$/;\n if (!source.url || !isValid(source.url, sourceUrlPattern)) {\n errors.push(new ValidationError(\"sources[\".concat(i, \"].url\"), source.url, 'Expected a valid Mapbox tileset url'));\n }\n return errors;\n}\nfunction getSourcesErrors(sources) {\n var errors = [];\n var count = 0;\n Object.keys(sources).forEach(function (s, i) {\n var sourceErrors = getSourceErrors(sources[s], i);\n if (!sourceErrors.length) {\n count = count + getSourceCount(sources[s]);\n }\n errors.push.apply(errors, _toConsumableArray(sourceErrors));\n });\n if (count > MAX_SOURCES_IN_STYLE) {\n errors.push(new ValidationError('sources', null, \"Styles must contain \".concat(MAX_SOURCES_IN_STYLE, \" or fewer sources\")));\n }\n return errors;\n}\nfunction getRootErrors(style, specKeys) {\n var errors = [];\n var optionalRootProperties = ['owner', 'id', 'cacheControl', 'draft', 'created', 'modified', 'visibility'];\n var allowedKeyErrors = getAllowedKeyErrors(style, [].concat(_toConsumableArray(specKeys), optionalRootProperties));\n errors.push.apply(errors, _toConsumableArray(allowedKeyErrors));\n if (style.version > SUPPORTED_SPEC_VERSION || style.version < SUPPORTED_SPEC_VERSION) {\n errors.push(new ValidationError('version', style.version, \"Style version must be \".concat(SUPPORTED_SPEC_VERSION)));\n }\n var glyphUrlPattern = /^mapbox:\\/\\/fonts\\/([^/]*)\\/{fontstack}\\/{range}.pbf$/;\n if (!isValid(style.glyphs, glyphUrlPattern)) {\n errors.push(new ValidationError('glyphs', style.glyphs, 'Styles must reference glyphs hosted by Mapbox'));\n }\n var spriteUrlPattern = /^mapbox:\\/\\/sprites\\/([^/]*)\\/([^/]*)\\/?([^/]*)?$/;\n if (!isValid(style.sprite, spriteUrlPattern)) {\n errors.push(new ValidationError('sprite', style.sprite, 'Styles must reference sprites hosted by Mapbox'));\n }\n var visibilityPattern = /^(public|private)$/;\n if (!isValid(style.visibility, visibilityPattern)) {\n errors.push(new ValidationError('visibility', style.visibility, 'Style visibility must be public or private'));\n }\n return errors;\n}\nfunction validateMapboxApiSupported(style) {\n var s = style;\n try {\n s = readStyle(s);\n } catch (e) {\n return [e];\n }\n var errors = validateStyleMin(s, v8).concat(getRootErrors(s, Object.keys(v8.$root)));\n if (s.sources) {\n errors = errors.concat(getSourcesErrors(s.sources));\n }\n return errors;\n}\nvar expression$1 = {\n StyleExpression: StyleExpression,\n isExpression: isExpression,\n isExpressionFilter: isExpressionFilter,\n createExpression: createExpression,\n createPropertyExpression: createPropertyExpression,\n normalizePropertyExpression: normalizePropertyExpression,\n ZoomConstantExpression: ZoomConstantExpression,\n ZoomDependentExpression: ZoomDependentExpression,\n StylePropertyFunction: StylePropertyFunction\n};\nvar styleFunction = {\n convertFunction: convertFunction,\n createFunction: createFunction,\n isFunction: isFunction$1\n};\nvar visit = {\n eachSource: eachSource,\n eachLayer: eachLayer,\n eachProperty: eachProperty\n};\nvalidateStyle.parsed = validateStyle;\nvalidateStyle.latest = validateStyle;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! ./../../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvanNvbi1zdHJpbmdpZnktcHJldHR5LWNvbXBhY3QvaW5kZXguanM/NzQzNSIsIndlYnBhY2s6Ly9HcC8uLi9mb3JtYXQuanM/MDNmYiIsIndlYnBhY2s6Ly9HcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdXJsL25vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcz8wM2EzIiwid2VicGFjazovL0dwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy91cmwvdXRpbC5qcz83NWZhIiwid2VicGFjazovL0dwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy9kZWNvZGUuanM/MWI2YSIsIndlYnBhY2s6Ly9HcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmcvZW5jb2RlLmpzPzkzZjciLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nL2luZGV4LmpzPzEyMzYiLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VybC91cmwuanM/NWU5MiIsIndlYnBhY2s6Ly9HcC8uLi92aXNpdC5qcz85OGZkIiwid2VicGFjazovL0dwLy4uL21pZ3JhdGUvdjguanM/NWRiMiIsIndlYnBhY2s6Ly9HcC8uLi91dGlsL2V4dGVuZC5qcz9iY2FjIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vcGFyc2luZ19lcnJvci5qcz83MGY0Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vc2NvcGUuanM/YzAzNyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3R5cGVzLmpzP2Y5NTUiLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzPzIzMDYiLCJ3ZWJwYWNrOi8vR3AvLi4vdXRpbC9jb2xvci5qcz8zZGE0Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vdHlwZXMvY29sbGF0b3IuanM/MzM0MyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcz9lMGM4Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanM/NGI2OCIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3ZhbHVlcy5qcz82NmMxIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGl0ZXJhbC5qcz85NTFjIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vcnVudGltZV9lcnJvci5qcz85NTUzIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uLmpzPzJiYzUiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9mb3JtYXQuanM/ZjBlOSIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL2ltYWdlLmpzP2YwYWQiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2VyY2lvbi5qcz8wNzI2Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZXZhbHVhdGlvbl9jb250ZXh0LmpzP2NhNmEiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uLmpzPzQyN2UiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2xsYXRvci5qcz9lNzlmIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvd2l0aGluLmpzPzM0NWQiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9pc19jb25zdGFudC5qcz9iNTNjIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvdmFyLmpzPzI5YjUiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9wYXJzaW5nX2NvbnRleHQuanM/OGJhNCIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3N0b3BzLmpzPzU4MDQiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zdGVwLmpzP2I3NjMiLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdW5pdGJlemllci9pbmRleC5qcz81MTBlIiwid2VicGFjazovL0dwLy4uL3V0aWwvaW50ZXJwb2xhdGUuanM/ZDZlNyIsIndlYnBhY2s6Ly9HcC8uLi91dGlsL2NvbG9yX3NwYWNlcy5qcz83ZjNhIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUuanM/ZDE5ZiIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzP2ZhMTIiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZXQuanM/Y2NkYyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL2F0LmpzP2IyZDYiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbi5qcz9jYjFmIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXhfb2YuanM/NTRlMyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL21hdGNoLmpzPzdlODIiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jYXNlLmpzP2YyYjMiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zbGljZS5qcz8wZGRhIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29tcGFyaXNvbi5qcz85Njg3Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbnVtYmVyX2Zvcm1hdC5qcz8wZjJlIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGVuZ3RoLmpzPzU5MWMiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbmRleC5qcz8yZjExIiwid2VicGFjazovL0dwLy4uL3V0aWwvcmVzdWx0LmpzP2NiNzkiLCJ3ZWJwYWNrOi8vR3AvLi4vdXRpbC9wcm9wZXJ0aWVzLmpzPzIyY2MiLCJ3ZWJwYWNrOi8vR3AvLi4vdXRpbC9nZXRfdHlwZS5qcz9jOTJiIiwid2VicGFjazovL0dwLy4uL2Z1bmN0aW9uL2luZGV4LmpzPzRjOTciLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9pbmRleC5qcz9kMDQ1Iiwid2VicGFjazovL0dwLy4uL2Z1bmN0aW9uL2NvbnZlcnQuanM/Njk4ZSIsIndlYnBhY2s6Ly9HcC8uLi9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcz83NzdhIiwid2VicGFjazovL0dwLy4uL2ZlYXR1cmVfZmlsdGVyL2NvbnZlcnQuanM/MWFhYiIsIndlYnBhY2s6Ly9HcC8uLi9taWdyYXRlL2V4cHJlc3Npb25zLmpzPzZmZmQiLCJ3ZWJwYWNrOi8vR3AvLi4vbWlncmF0ZS5qcz80ZmY3Iiwid2VicGFjazovL0dwLy4uL2NvbXBvc2l0ZS5qcz8xOTNiIiwid2VicGFjazovL0dwLy4uL3V0aWwvcmVmX3Byb3BlcnRpZXMuanM/MjYzMSIsIndlYnBhY2s6Ly9HcC8uLi9kZXJlZi5qcz8wMTU4Iiwid2VicGFjazovL0dwLy4uL3V0aWwvZGVlcF9lcXVhbC5qcz9jZjc2Iiwid2VicGFjazovL0dwLy4uL2RpZmYuanM/ZDlmMiIsIndlYnBhY2s6Ly9HcC8uLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzPzE1NWMiLCJ3ZWJwYWNrOi8vR3AvLi4vZXJyb3IvcGFyc2luZ19lcnJvci5qcz9lZTdkIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbnN0YW50cy5qcz8yNTM1Iiwid2VicGFjazovL0dwLy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanM/ZDc4NiIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QuanM/YzUyMSIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS5qcz8zNjEzIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci5qcz8xNGVmIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLmpzP2ZiN2IiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfZXhwcmVzc2lvbi5qcz80MjI1Iiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4uanM/YzEzMyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9jb2xvci5qcz8xZDFkIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0uanM/MjJkNyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXIuanM/NTQ2YiIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9wcm9wZXJ0eS5qcz9mYTUyIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5LmpzPzczOWUiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzP2M5MjQiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXIuanM/ZDViOSIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9zdHJpbmcuanM/YjdiYSIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9zb3VyY2UuanM/ODk4NyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9saWdodC5qcz82YzQ3Iiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX3RlcnJhaW4uanM/MmJiYiIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9mb2cuanM/NTlhOCIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9mb3JtYXR0ZWQuanM/OTEyMyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9pbWFnZS5qcz81ZDJlIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlLmpzPzFmYzYiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcz9mMjhiIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlX3N0eWxlLm1pbi5qcz82NmY1Iiwid2VicGFjazovL0dwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2pzb25saW50LWxpbmVzLXByaW1pdGl2ZXMvbGliL2pzb25saW50LmpzP2ZiOTciLCJ3ZWJwYWNrOi8vR3AvLi4vcmVhZF9zdHlsZS5qcz9kMWI4Iiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlX3N0eWxlLmpzP2YyMGEiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGVfbWFwYm94X2FwaV9zdXBwb3J0ZWQuanM/M2I2ZSIsIndlYnBhY2s6Ly9HcC8uLi9zdHlsZS1zcGVjLmpzP2Q4ZGUiXSwibmFtZXMiOlsic3RyaW5nT3JDaGFyIiwianNvblN0cmluZ2lmeVByZXR0eUNvbXBhY3QiLCJzdHJpbmdpZnkiLCJwYXNzZWRPYmoiLCJvcHRpb25zIiwiaW5kZW50IiwibWF4TGVuZ3RoIiwicmVwbGFjZXIiLCJKU09OIiwidW5kZWZpbmVkIiwic2xpY2UiLCJJbmZpbml0eSIsIl9zdHJpbmdpZnkiLCJvYmoiLCJjdXJyZW50SW5kZW50IiwicmVzZXJ2ZWQiLCJlbmQiLCJpbmRleCIsIml0ZW1zIiwia2V5Iiwia2V5UGFydCIsImtleXMiLCJsZW5ndGgiLCJuZXh0SW5kZW50IiwicHJldHRpZmllZCIsInN0YXJ0Iiwic3RyaW5nIiwidmFsdWUiLCJ0b0pTT04iLCJyZXBsYWNlIiwibWF0Y2giLCJzdHJpbmdMaXRlcmFsIiwicGFyc2UiLCJfdHlwZW9mIiwiQXJyYXkiLCJpc0FycmF5IiwicHVzaCIsIk9iamVjdCIsImpvaW4iLCJzb3J0S2V5c0J5IiwicmVmZXJlbmNlIiwicmVzdWx0IiwiZm9ybWF0Iiwic3R5bGUiLCJzcGFjZSIsImFyZ3VtZW50cyIsInY4IiwiJHJvb3QiLCJsYXllcnMiLCJtYXAiLCJsYXllciIsInJvb3QiLCJmcmVlRXhwb3J0cyIsImV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJtb2R1bGUiLCJmcmVlR2xvYmFsIiwiY29tbW9uanNHbG9iYWwiLCJnbG9iYWwiLCJ3aW5kb3ciLCJzZWxmIiwicHVueWNvZGUiLCJtYXhJbnQiLCJiYXNlIiwidE1pbiIsInRNYXgiLCJza2V3IiwiZGFtcCIsImluaXRpYWxCaWFzIiwiaW5pdGlhbE4iLCJkZWxpbWl0ZXIiLCJyZWdleFB1bnljb2RlIiwicmVnZXhOb25BU0NJSSIsInJlZ2V4U2VwYXJhdG9ycyIsImVycm9ycyIsImJhc2VNaW51c1RNaW4iLCJmbG9vciIsIk1hdGgiLCJzdHJpbmdGcm9tQ2hhckNvZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJlcnJvciIsInR5cGUiLCJSYW5nZUVycm9yIiwiYXJyYXkiLCJmbiIsIm1hcERvbWFpbiIsInBhcnRzIiwic3BsaXQiLCJsYWJlbHMiLCJlbmNvZGVkIiwidWNzMmRlY29kZSIsIm91dHB1dCIsImNvdW50ZXIiLCJleHRyYSIsImNoYXJDb2RlQXQiLCJ1Y3MyZW5jb2RlIiwiYmFzaWNUb0RpZ2l0IiwiY29kZVBvaW50IiwiZGlnaXRUb0Jhc2ljIiwiZGlnaXQiLCJmbGFnIiwiYWRhcHQiLCJkZWx0YSIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImsiLCJkZWNvZGUiLCJpbnB1dCIsImlucHV0TGVuZ3RoIiwib3V0IiwiaSIsIm4iLCJiaWFzIiwiYmFzaWMiLCJqIiwib2xkaSIsInciLCJ0IiwiYmFzZU1pbnVzVCIsImxhc3RJbmRleE9mIiwic3BsaWNlIiwiZW5jb2RlIiwiaGFuZGxlZENQQ291bnQiLCJiYXNpY0xlbmd0aCIsIm0iLCJxIiwiY3VycmVudFZhbHVlIiwiaGFuZGxlZENQQ291bnRQbHVzT25lIiwicU1pbnVzVCIsInRvVW5pY29kZSIsInRlc3QiLCJ0b0xvd2VyQ2FzZSIsInRvQVNDSUkiLCJoYXNPd25Qcm9wZXJ0eSIsInV0aWwiLCJpc1N0cmluZyIsImFyZyIsImlzT2JqZWN0IiwiaXNOdWxsIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJwcm9wIiwicHJvdG90eXBlIiwiY2FsbCIsInFzIiwic2VwIiwiZXEiLCJyZWdleHAiLCJtYXhLZXlzIiwibGVuIiwieCIsImlkeCIsImluZGV4T2YiLCJrc3RyIiwidnN0ciIsInYiLCJzdWJzdHIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdHJpbmdpZnlQcmltaXRpdmUiLCJpc0Zpbml0ZSIsIm5hbWUiLCJrcyIsImVuY29kZVVSSUNvbXBvbmVudCIsInVybFBhcnNlIiwicmVzb2x2ZSIsInVybFJlc29sdmUiLCJyZXNvbHZlT2JqZWN0IiwidXJsUmVzb2x2ZU9iamVjdCIsImZvcm1hdCQxIiwidXJsRm9ybWF0IiwiVXJsXzEiLCJVcmwiLCJwcm90b2NvbCIsInNsYXNoZXMiLCJhdXRoIiwiaG9zdCIsInBvcnQiLCJob3N0bmFtZSIsImhhc2giLCJzZWFyY2giLCJxdWVyeSIsInBhdGhuYW1lIiwicGF0aCIsImhyZWYiLCJwcm90b2NvbFBhdHRlcm4iLCJwb3J0UGF0dGVybiIsInNpbXBsZVBhdGhQYXR0ZXJuIiwiZGVsaW1zIiwidW53aXNlIiwiY29uY2F0IiwiYXV0b0VzY2FwZSIsIm5vbkhvc3RDaGFycyIsImhvc3RFbmRpbmdDaGFycyIsImhvc3RuYW1lTWF4TGVuIiwiaG9zdG5hbWVQYXJ0UGF0dGVybiIsImhvc3RuYW1lUGFydFN0YXJ0IiwidW5zYWZlUHJvdG9jb2wiLCJob3N0bGVzc1Byb3RvY29sIiwic2xhc2hlZFByb3RvY29sIiwidXJsIiwicGFyc2VRdWVyeVN0cmluZyIsInNsYXNoZXNEZW5vdGVIb3N0IiwidSIsIlR5cGVFcnJvciIsInF1ZXJ5SW5kZXgiLCJzcGxpdHRlciIsInVTcGxpdCIsInNsYXNoUmVnZXgiLCJyZXN0IiwidHJpbSIsInNpbXBsZVBhdGgiLCJleGVjIiwicXVlcnlzdHJpbmciLCJwcm90byIsImxvd2VyUHJvdG8iLCJob3N0RW5kIiwiaGVjIiwiYXRTaWduIiwicGFyc2VIb3N0IiwiaXB2Nkhvc3RuYW1lIiwiaG9zdHBhcnRzIiwibCIsInBhcnQiLCJuZXdwYXJ0IiwidmFsaWRQYXJ0cyIsIm5vdEhvc3QiLCJiaXQiLCJ1bnNoaWZ0IiwicCIsImgiLCJhZSIsImVzYyIsImVzY2FwZSIsInFtIiwicyIsImNoYXJBdCIsInNvdXJjZSIsInJlbGF0aXZlIiwicmVsIiwidGtleXMiLCJ0ayIsInRrZXkiLCJya2V5cyIsInJrIiwicmtleSIsInJlbFBhdGgiLCJzaGlmdCIsImlzU291cmNlQWJzIiwiaXNSZWxBYnMiLCJtdXN0RW5kQWJzIiwicmVtb3ZlQWxsRG90cyIsInNyY1BhdGgiLCJwc3ljaG90aWMiLCJwb3AiLCJhdXRoSW5Ib3N0IiwibGFzdCIsImhhc1RyYWlsaW5nU2xhc2giLCJ1cCIsImlzQWJzb2x1dGUiLCJnZXRQcm9wZXJ0eVJlZmVyZW5jZSIsInByb3BlcnR5TmFtZSIsImxheW91dCIsInBhaW50IiwiZWFjaFNvdXJjZSIsImNhbGxiYWNrIiwic291cmNlcyIsImVhY2hMYXllciIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJkb25lIiwiZXJyIiwiZSIsImYiLCJlYWNoUHJvcGVydHkiLCJpbm5lciIsInByb3BlcnR5VHlwZSIsInByb3BlcnRpZXMiLCJmb3JFYWNoIiwiaWQiLCJzZXQiLCJlYWNoTGF5b3V0IiwiZWFjaFBhaW50IiwicmVzb2x2ZUNvbnN0YW50IiwiY29uc3RhbnRzIiwiaXNGdW5jdGlvbiIsInN0b3BzIiwicmVuYW1lUHJvcGVydHkiLCJmcm9tIiwidG8iLCJtaWdyYXRlVG9WOCIsInZlcnNpb24iLCJjb29yZGluYXRlcyIsImNvb3JkIiwicmV2ZXJzZSIsInByb3BlcnR5Iiwic3RvcCIsIm1pZ3JhdGVGb250c3RhY2tVUkwiLCJpbnB1dFBhcnNlZCIsImlucHV0UGF0aG5hbWVQYXJ0cyIsImdseXBocyIsIm1pZ3JhdGVGb250U3RhY2siLCJmb250Iiwic3BsaXRBbmRUcmltIiwiRXJyb3IiLCJmaXJzdFN5bWJvbExheWVyIiwic3ltYm9sTGF5ZXJzIiwiZXh0ZW5kIiwiX2xlbiIsImlucHV0cyIsIl9rZXkzIiwiX2kyIiwiX2lucHV0cyIsIlBhcnNpbmdFcnJvciIsIl9FcnJvciIsIm1lc3NhZ2UiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJfd3JhcE5hdGl2ZVN1cGVyIiwiU2NvcGUiLCJwYXJlbnQiLCJiaW5kaW5ncyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJfc2xpY2VkVG9BcnJheSIsImV4cHJlc3Npb24iLCJnZXQiLCJoYXMiLCJOdWxsVHlwZSIsImtpbmQiLCJOdW1iZXJUeXBlIiwiU3RyaW5nVHlwZSIsIkJvb2xlYW5UeXBlIiwiQ29sb3JUeXBlIiwiT2JqZWN0VHlwZSIsIlZhbHVlVHlwZSIsIkVycm9yVHlwZSIsIkNvbGxhdG9yVHlwZSIsIkZvcm1hdHRlZFR5cGUiLCJSZXNvbHZlZEltYWdlVHlwZSIsIml0ZW1UeXBlIiwiTiIsInRvU3RyaW5nIiwidmFsdWVNZW1iZXJUeXBlcyIsImNoZWNrU3VidHlwZSIsImV4cGVjdGVkIiwiX2kzIiwiX3ZhbHVlTWVtYmVyVHlwZXMiLCJtZW1iZXJUeXBlIiwiaXNWYWxpZFR5cGUiLCJwcm92aWRlZCIsImFsbG93ZWRUeXBlcyIsInNvbWUiLCJpc1ZhbGlkTmF0aXZlVHlwZSIsImtDU1NDb2xvclRhYmxlIiwiY2xhbXBfY3NzX2J5dGUiLCJyb3VuZCIsImNsYW1wX2Nzc19mbG9hdCIsInBhcnNlX2Nzc19pbnQiLCJzdHIiLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJwYXJzZV9jc3NfZmxvYXQiLCJjc3NfaHVlX3RvX3JnYiIsIm0xIiwibTIiLCJwYXJzZUNTU0NvbG9yIiwiY3NzX3N0ciIsIml2Iiwib3AiLCJlcCIsImZuYW1lIiwicGFyYW1zIiwiYWxwaGEiLCJDb2xvciIsInIiLCJnIiwiYiIsImEiLCJfdGhpcyR0b0FycmF5IiwidG9BcnJheSIsIl90aGlzJHRvQXJyYXkyIiwicmdiYSIsImNzc2NvbG9ycGFyc2VyIiwiYmxhY2siLCJ3aGl0ZSIsInRyYW5zcGFyZW50IiwicmVkIiwiYmx1ZSIsIkNvbGxhdG9yIiwiY2FzZVNlbnNpdGl2ZSIsImRpYWNyaXRpY1NlbnNpdGl2ZSIsImxvY2FsZSIsInNlbnNpdGl2aXR5IiwiY29sbGF0b3IiLCJJbnRsIiwidXNhZ2UiLCJjb21wYXJlIiwibGhzIiwicmhzIiwicmVzb2x2ZWRMb2NhbGUiLCJyZXNvbHZlZE9wdGlvbnMiLCJGb3JtYXR0ZWRTZWN0aW9uIiwidGV4dCIsImltYWdlIiwic2NhbGUiLCJmb250U3RhY2siLCJ0ZXh0Q29sb3IiLCJGb3JtYXR0ZWQiLCJzZWN0aW9ucyIsImlzRW1wdHkiLCJzZWN0aW9uIiwic2VyaWFsaXplIiwic2VyaWFsaXplZCIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJmcm9tU3RyaW5nIiwidW5mb3JtYXR0ZWQiLCJmYWN0b3J5IiwiUmVzb2x2ZWRJbWFnZSIsImF2YWlsYWJsZSIsInZhbGlkYXRlUkdCQSIsImlzVmFsdWUiLCJtaXhlZCIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJpdGVtIiwidHlwZU9mIiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsInRvU3RyaW5nJDEiLCJMaXRlcmFsIiwiZXZhbHVhdGUiLCJlYWNoQ2hpbGQiLCJvdXRwdXREZWZpbmVkIiwiYXJncyIsImNvbnRleHQiLCJleHBlY3RlZFR5cGUiLCJSdW50aW1lRXJyb3IiLCJ0eXBlcyIsIm51bWJlciIsIm9iamVjdCIsIkFzc2VydGlvbiIsImN0eCIsImV2ZXJ5IiwicGFyc2VkIiwiRm9ybWF0RXhwcmVzc2lvbiIsImV2YWx1YXRlU2VjdGlvbiIsImV2YWx1YXRlZENvbnRlbnQiLCJjb250ZW50IiwiX2l0ZXJhdG9yNiIsIl9zdGVwNiIsIl9pdGVyYXRvcjciLCJfc3RlcDciLCJmaXJzdEFyZyIsIm5leHRUb2tlbk1heUJlT2JqZWN0IiwibGFzdEV4cHJlc3Npb24iLCJJbWFnZUV4cHJlc3Npb24iLCJldmFsdWF0ZWRJbWFnZU5hbWUiLCJhdmFpbGFibGVJbWFnZXMiLCJ0eXBlcyQxIiwiQ29lcmNpb24iLCJCb29sZWFuIiwiX2l0ZXJhdG9yOCIsIl9zdGVwOCIsImMiLCJwYXJzZUNvbG9yIiwiX2l0ZXJhdG9yOSIsIl9zdGVwOSIsIm51bSIsIk51bWJlciIsImlzTmFOIiwiY2hpbGQiLCJnZW9tZXRyeVR5cGVzIiwiRXZhbHVhdGlvbkNvbnRleHQiLCJnbG9iYWxzIiwiZmVhdHVyZSIsImZlYXR1cmVTdGF0ZSIsImZvcm1hdHRlZFNlY3Rpb24iLCJfcGFyc2VDb2xvckNhY2hlIiwiY2Fub25pY2FsIiwiZ2VvbWV0cnlUeXBlIiwiZ2VvbWV0cnkiLCJjYW5vbmljYWxJRCIsImNhY2hlZCIsIkNvbXBvdW5kRXhwcmVzc2lvbiIsIl9ldmFsdWF0ZSIsImRlZmluaXRpb24iLCJkZWZpbml0aW9ucyIsImF2YWlsYWJsZU92ZXJsb2FkcyIsIm92ZXJsb2FkcyIsImZpbHRlciIsIl9yZWYiLCJfcmVmMiIsInNpZ25hdHVyZSIsInNpZ25hdHVyZUNvbnRleHQiLCJfaXRlcmF0b3IxMCIsIl9zdGVwMTAiLCJfc3RlcDEwJHZhbHVlIiwiUGFyc2luZ0NvbnRleHQiLCJyZWdpc3RyeSIsInNjb3BlIiwicGFyc2VkQXJncyIsImFyZ1BhcnNlRmFpbGVkIiwiX2NvbnRleHQkZXJyb3JzIiwiYXBwbHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzaWduYXR1cmVzIiwiX3JlZjMiLCJfcmVmNCIsInN0cmluZ2lmeVNpZ25hdHVyZSIsImFjdHVhbFR5cGVzIiwicmVnaXN0ZXIiLCJDb2xsYXRvckV4cHJlc3Npb24iLCJFWFRFTlQiLCJ1cGRhdGVCQm94IiwiYmJveCIsIm1pbiIsIm1heCIsIm1lcmNhdG9yWGZyb21MbmciLCJsbmciLCJtZXJjYXRvcllmcm9tTGF0IiwibGF0IiwiUEkiLCJsb2ciLCJ0YW4iLCJib3hXaXRoaW5Cb3giLCJiYm94MSIsImJib3gyIiwiZ2V0VGlsZUNvb3JkaW5hdGVzIiwieSIsInRpbGVzQXRab29tIiwicG93IiwieiIsIm9uQm91bmRhcnkiLCJwMSIsInAyIiwieDEiLCJ5MSIsIngyIiwieTIiLCJyYXlJbnRlcnNlY3QiLCJwb2ludFdpdGhpblBvbHlnb24iLCJwb2ludCIsInJpbmdzIiwiaW5zaWRlIiwicmluZyIsImxlbjIiLCJwb2ludFdpdGhpblBvbHlnb25zIiwicG9seWdvbnMiLCJwZXJwIiwidjEiLCJ2MiIsInR3b1NpZGVkIiwicTEiLCJxMiIsIngzIiwieTMiLCJkZXQxIiwiZGV0MiIsImxpbmVJbnRlcnNlY3RMaW5lIiwiZCIsInZlY3RvclAiLCJ2ZWN0b3JRIiwibGluZUludGVyc2VjdFBvbHlnb24iLCJwb2x5Z29uIiwiX2l0ZXJhdG9yMTEiLCJfc3RlcDExIiwibGluZVN0cmluZ1dpdGhpblBvbHlnb24iLCJsaW5lIiwibGluZVN0cmluZ1dpdGhpblBvbHlnb25zIiwiZ2V0VGlsZVBvbHlnb24iLCJnZXRUaWxlUG9seWdvbnMiLCJ1cGRhdGVQb2ludCIsInBvbHlCQm94Iiwid29ybGRTaXplIiwiaGFsZldvcmxkU2l6ZSIsInJlc2V0QkJveCIsImdldFRpbGVQb2ludHMiLCJwb2ludEJCb3giLCJzaGlmdHMiLCJ0aWxlUG9pbnRzIiwiX2l0ZXJhdG9yMTIiLCJfc3RlcDEyIiwicG9pbnRzIiwiX2l0ZXJhdG9yMTMiLCJfc3RlcDEzIiwiZ2V0VGlsZUxpbmVzIiwibGluZUJCb3giLCJ0aWxlTGluZXMiLCJfaXRlcmF0b3IxNCIsIl9zdGVwMTQiLCJ0aWxlTGluZSIsIl9pdGVyYXRvcjE3IiwiX3N0ZXAxNyIsIl9pdGVyYXRvcjE1IiwiX3N0ZXAxNSIsIl9pdGVyYXRvcjE2IiwiX3N0ZXAxNiIsInBvaW50c1dpdGhpblBvbHlnb25zIiwicG9seWdvbkdlb21ldHJ5IiwidGlsZVBvbHlnb24iLCJfaXRlcmF0b3IxOCIsIl9zdGVwMTgiLCJ0aWxlUG9seWdvbnMiLCJfaXRlcmF0b3IxOSIsIl9zdGVwMTkiLCJsaW5lc1dpdGhpblBvbHlnb25zIiwiX2l0ZXJhdG9yMjAiLCJfc3RlcDIwIiwiX2l0ZXJhdG9yMjEiLCJfc3RlcDIxIiwiV2l0aGluIiwiZ2VvanNvbiIsImdlb21ldHJpZXMiLCJmZWF0dXJlcyIsImlzRmVhdHVyZUNvbnN0YW50IiwiaXNTdGF0ZUNvbnN0YW50IiwiaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50IiwiVmFyIiwiYm91bmRFeHByZXNzaW9uIiwiZXhwciIsIl9wYXJzZSIsImFubm90YXRlIiwidHlwZUFubm90YXRpb24iLCJFeHByIiwiYWN0dWFsIiwiaXNDb25zdGFudCIsImVjIiwiX2xlbjIiLCJfa2V5NCIsImlzVHlwZUFubm90YXRpb24iLCJjaGlsZHJlbkNvbnN0YW50IiwiZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyIsImxhc3RJbmRleCIsImxvd2VySW5kZXgiLCJ1cHBlckluZGV4IiwiY3VycmVudEluZGV4IiwibmV4dFZhbHVlIiwiU3RlcCIsIm91dHB1dHMiLCJfaXRlcmF0b3IyMiIsIl9zdGVwMjIiLCJfc3RlcDIyJHZhbHVlIiwibGFiZWwiLCJzdG9wQ291bnQiLCJfaXRlcmF0b3IyMyIsIl9zdGVwMjMiLCJvdXRwdXRUeXBlIiwibGFiZWxLZXkiLCJ2YWx1ZUtleSIsInVuaXRiZXppZXIiLCJVbml0QmV6aWVyIiwicDF4IiwicDF5IiwicDJ4IiwicDJ5IiwiY3giLCJieCIsImF4IiwiY3kiLCJieSIsImF5Iiwic2FtcGxlQ3VydmVYIiwic2FtcGxlQ3VydmVZIiwic2FtcGxlQ3VydmVEZXJpdmF0aXZlWCIsInNvbHZlQ3VydmVYIiwiZXBzaWxvbiIsInQwIiwidDEiLCJ0MiIsImFicyIsImQyIiwic29sdmUiLCJjb2xvciIsImFycmF5JDEiLCJYbiIsIlluIiwiWm4iLCJ0MyIsImRlZzJyYWQiLCJyYWQyZGVnIiwieHl6MmxhYiIsImxhYjJ4eXoiLCJ4eXoycmdiIiwicmdiMnh5eiIsInJnYlRvTGFiIiwicmdiQ29sb3IiLCJsYWJUb1JnYiIsImxhYkNvbG9yIiwiaW50ZXJwb2xhdGVMYWIiLCJyZ2JUb0hjbCIsIl9yZ2JUb0xhYiIsImF0YW4yIiwic3FydCIsImhjbFRvUmdiIiwiaGNsQ29sb3IiLCJjb3MiLCJzaW4iLCJpbnRlcnBvbGF0ZUh1ZSIsImludGVycG9sYXRlSGNsIiwibGFiIiwiZm9yd2FyZCIsImludGVycG9sYXRlIiwiaGNsIiwiSW50ZXJwb2xhdGUiLCJvcGVyYXRvciIsImludGVycG9sYXRpb24iLCJfaXRlcmF0b3IyNCIsIl9zdGVwMjQiLCJfc3RlcDI0JHZhbHVlIiwibG93ZXIiLCJ1cHBlciIsImludGVycG9sYXRpb25GYWN0b3IiLCJvdXRwdXRMb3dlciIsIm91dHB1dFVwcGVyIiwiX2l0ZXJhdG9yMjUiLCJfc3RlcDI1IiwiY29udHJvbFBvaW50cyIsImV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbiIsInViIiwiX2FyZ3MiLCJfdG9BcnJheSIsImxvd2VyVmFsdWUiLCJ1cHBlclZhbHVlIiwiZGlmZmVyZW5jZSIsInByb2dyZXNzIiwiQ29hbGVzY2UiLCJhcmdDb3VudCIsInJlcXVlc3RlZEltYWdlTmFtZSIsIl9pdGVyYXRvcjI2IiwiX3N0ZXAyNiIsIl9pdGVyYXRvcjI3IiwiX3N0ZXAyNyIsIm5lZWRzQW5ub3RhdGlvbiIsIkxldCIsIl9pdGVyYXRvcjI4IiwiX3N0ZXAyOCIsImJpbmRpbmciLCJfaXRlcmF0b3IyOSIsIl9zdGVwMjkiLCJfc3RlcDI5JHZhbHVlIiwiQXQiLCJJbiIsIm5lZWRsZSIsImhheXN0YWNrIiwiSW5kZXhPZiIsImZyb21JbmRleCIsIk1hdGNoIiwiaW5wdXRUeXBlIiwiY2FzZXMiLCJvdGhlcndpc2UiLCJfdGhpczIiLCJzb3J0ZWRMYWJlbHMiLCJzb3J0IiwiZ3JvdXBlZEJ5T3V0cHV0Iiwib3V0cHV0TG9va3VwIiwiX2l0ZXJhdG9yMzAiLCJfc3RlcDMwIiwib3V0cHV0SW5kZXgiLCJjb2VyY2VMYWJlbCIsIl9pNyIsIl9ncm91cGVkQnlPdXRwdXQiLCJfZ3JvdXBlZEJ5T3V0cHV0JF9pIiwibGFiZWxDb250ZXh0IiwiX2l0ZXJhdG9yMzEiLCJfc3RlcDMxIiwiTUFYX1NBRkVfSU5URUdFUiIsIkNhc2UiLCJicmFuY2hlcyIsIl9pdGVyYXRvcjMyIiwiX3N0ZXAzMiIsIl9zdGVwMzIkdmFsdWUiLCJfaXRlcmF0b3IzMyIsIl9zdGVwMzMiLCJfc3RlcDMzJHZhbHVlIiwiX3JlZjUiLCJfcmVmNiIsIl8iLCJTbGljZSIsImJlZ2luSW5kZXgiLCJlbmRJbmRleCIsImlzQ29tcGFyYWJsZVR5cGUiLCJuZXEiLCJsdCIsImd0IiwibHRlcSIsImd0ZXEiLCJlcUNvbGxhdGUiLCJuZXFDb2xsYXRlIiwibHRDb2xsYXRlIiwiZ3RDb2xsYXRlIiwibHRlcUNvbGxhdGUiLCJndGVxQ29sbGF0ZSIsIm1ha2VDb21wYXJpc29uIiwiY29tcGFyZUJhc2ljIiwiY29tcGFyZVdpdGhDb2xsYXRvciIsImlzT3JkZXJDb21wYXJpc29uIiwiQ29tcGFyaXNvbiIsImhhc1VudHlwZWRBcmd1bWVudCIsInJ0IiwiRXF1YWxzIiwiTm90RXF1YWxzIiwiTGVzc1RoYW4iLCJHcmVhdGVyVGhhbiIsIkxlc3NUaGFuT3JFcXVhbCIsIkdyZWF0ZXJUaGFuT3JFcXVhbCIsIk51bWJlckZvcm1hdCIsImN1cnJlbmN5IiwibWluRnJhY3Rpb25EaWdpdHMiLCJtYXhGcmFjdGlvbkRpZ2l0cyIsIm1pbmltdW1GcmFjdGlvbkRpZ2l0cyIsIm1heGltdW1GcmFjdGlvbkRpZ2l0cyIsIkxlbmd0aCIsImV4cHJlc3Npb25zIiwiX3JlZjciLCJfcmVmOCIsImJpbmFyeVNlYXJjaCIsInZhcmFyZ3MiLCJfcmVmOSIsIl9yZWYxMCIsIl9yZWYxMSIsIl9yZWYxMiIsIl9yZWYxMyIsIl9yZWYxNCIsIl9yZWYxNSIsIl9yZWYxNiIsIl9yZWYxNyIsIl9yZWYxOCIsIl9yZWYxOSIsIl9yZWYyMCIsIl9yZWYyMSIsIl9yZWYyMiIsIl9yZWYyMyIsIl9yZWYyNCIsInpvb20iLCJoZWF0bWFwRGVuc2l0eSIsImxpbmVQcm9ncmVzcyIsInNreVJhZGlhbFByb2dyZXNzIiwiYWNjdW11bGF0ZWQiLCJfaXRlcmF0b3IzNCIsIl9zdGVwMzQiLCJfaXRlcmF0b3IzNSIsIl9zdGVwMzUiLCJfcmVmMjUiLCJfcmVmMjYiLCJfcmVmMjciLCJfcmVmMjgiLCJfcmVmMjkiLCJfcmVmMzAiLCJfcmVmMzEiLCJfcmVmMzIiLCJMTjIiLCJFIiwiX3JlZjMzIiwiX3JlZjM0IiwiX3JlZjM1IiwiX3JlZjM2IiwiX3JlZjM3IiwiX3JlZjM4IiwiTE4xMCIsIl9yZWYzOSIsIl9yZWY0MCIsIl9yZWY0MSIsIl9yZWY0MiIsIl9yZWY0MyIsIl9yZWY0NCIsIl9yZWY0NSIsIl9yZWY0NiIsIl9yZWY0NyIsIl9yZWY0OCIsIl9yZWY0OSIsIl9yZWY1MCIsImFzaW4iLCJfcmVmNTEiLCJfcmVmNTIiLCJhY29zIiwiX3JlZjUzIiwiX3JlZjU0IiwiYXRhbiIsIl9yZWY1NSIsIl9yZWY1NiIsIl9yZWY1NyIsIl9yZWY1OCIsIl9yZWY1OSIsIl9yZWY2MCIsIl9yZWY2MSIsIl9yZWY2MiIsImNlaWwiLCJfcmVmNjMiLCJfcmVmNjQiLCJfcmVmNjUiLCJfcmVmNjYiLCJfcmVmNjciLCJfcmVmNjgiLCJfcmVmNjkiLCJfcmVmNzAiLCJfcmVmNzEiLCJfcmVmNzIiLCJfcmVmNzMiLCJfcmVmNzQiLCJfcmVmNzUiLCJfcmVmNzYiLCJfcmVmNzciLCJfcmVmNzgiLCJfcmVmNzkiLCJfcmVmODAiLCJfcmVmODEiLCJfcmVmODIiLCJfcmVmODMiLCJfcmVmODQiLCJfcmVmODUiLCJfcmVmODYiLCJfcmVmODciLCJfcmVmODgiLCJfcmVmODkiLCJfcmVmOTAiLCJfcmVmOTEiLCJfcmVmOTIiLCJfcmVmOTMiLCJfcmVmOTQiLCJfcmVmOTUiLCJfcmVmOTYiLCJfaXRlcmF0b3IzNiIsIl9zdGVwMzYiLCJfcmVmOTciLCJfcmVmOTgiLCJfaXRlcmF0b3IzNyIsIl9zdGVwMzciLCJfcmVmOTkiLCJfcmVmMTAwIiwiX3JlZjEwMSIsIl9yZWYxMDIiLCJpc1N1cHBvcnRlZFNjcmlwdCIsIl9yZWYxMDMiLCJfcmVmMTA0IiwidG9VcHBlckNhc2UiLCJfcmVmMTA1IiwiX3JlZjEwNiIsIl9yZWYxMDciLCJfcmVmMTA4Iiwic3VjY2VzcyIsInN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uIiwic3BlYyIsInN1cHBvcnRzWm9vbUV4cHJlc3Npb24iLCJwYXJhbWV0ZXJzIiwic3VwcG9ydHNJbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGVkIiwiZ2V0VHlwZSIsInZhbCIsImlzRnVuY3Rpb24kMSIsImlkZW50aXR5RnVuY3Rpb24iLCJjcmVhdGVGdW5jdGlvbiIsInByb3BlcnR5U3BlYyIsImlzQ29sb3IiLCJ6b29tQW5kRmVhdHVyZURlcGVuZGVudCIsImZlYXR1cmVEZXBlbmRlbnQiLCJ6b29tRGVwZW5kZW50IiwiY29sb3JTcGFjZSIsImNvbG9yU3BhY2VzIiwiaW5uZXJGdW4iLCJoYXNoZWRTdG9wcyIsImNhdGVnb3JpY2FsS2V5VHlwZSIsImV2YWx1YXRlRXhwb25lbnRpYWxGdW5jdGlvbiIsImV2YWx1YXRlSW50ZXJ2YWxGdW5jdGlvbiIsImV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbiIsImNyZWF0ZSIsIl9pdGVyYXRvcjM4IiwiX3N0ZXAzOCIsImV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbiIsImZlYXR1cmVGdW5jdGlvbnMiLCJ6b29tU3RvcHMiLCJmZWF0dXJlRnVuY3Rpb25TdG9wcyIsIl9pOCIsIl96b29tU3RvcHMiLCJpbnRlcnBvbGF0aW9uVHlwZSIsImJpbmQiLCJfcmVmMTA5IiwiX3JlZjExMCIsImNvYWxlc2NlIiwia2V5VHlwZSIsImV2YWx1YXRlZCIsImludGVycCIsImNvbG9yc3BhY2UiLCJfbGVuMyIsIl9rZXk1IiwiZXZhbHVhdGVkTG93ZXIiLCJldmFsdWF0ZWRVcHBlciIsInZhbHVlcyIsIlN0eWxlRXhwcmVzc2lvbiIsIl93YXJuaW5nSGlzdG9yeSIsIl9ldmFsdWF0b3IiLCJfZGVmYXVsdFZhbHVlIiwiZ2V0RGVmYXVsdFZhbHVlIiwiX2VudW1WYWx1ZXMiLCJldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nIiwiY29uc29sZSIsIndhcm4iLCJpc0V4cHJlc3Npb24iLCJjcmVhdGVFeHByZXNzaW9uIiwicGFyc2VyIiwiZ2V0RXhwZWN0ZWRUeXBlIiwiWm9vbUNvbnN0YW50RXhwcmVzc2lvbiIsIl9zdHlsZUV4cHJlc3Npb24iLCJpc1N0YXRlRGVwZW5kZW50IiwiWm9vbURlcGVuZGVudEV4cHJlc3Npb24iLCJjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24iLCJpc0ZlYXR1cmVDb25zdGFudCQxIiwiaXNab29tQ29uc3RhbnQiLCJ6b29tQ3VydmUiLCJmaW5kWm9vbUN1cnZlIiwiU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uIiwic3BlY2lmaWNhdGlvbiIsIl9wYXJhbWV0ZXJzIiwiX3NwZWNpZmljYXRpb24iLCJkZXNlcmlhbGl6ZSIsIm5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbiIsImNvbnN0YW50IiwiX2l0ZXJhdG9yMzkiLCJfc3RlcDM5IiwiY2hpbGRSZXN1bHQiLCJmb3JtYXR0ZWQiLCJyZXNvbHZlZEltYWdlIiwiY29udmVydExpdGVyYWwiLCJjb252ZXJ0RnVuY3Rpb24iLCJjb252ZXJ0SWRlbnRpdHlGdW5jdGlvbiIsInRva2VucyIsImNvbnZlcnRUb2tlblN0cmluZyIsImNvbnZlcnRab29tQW5kUHJvcGVydHlGdW5jdGlvbiIsImNvbnZlcnRab29tRnVuY3Rpb24iLCJjb252ZXJ0UHJvcGVydHlGdW5jdGlvbiIsImdldEludGVycG9sYXRlT3BlcmF0b3IiLCJmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzIiwiZnVuY3Rpb25UeXBlIiwiZ2V0RnVuY3Rpb25UeXBlIiwiX2l0ZXJhdG9yNDAiLCJfc3RlcDQwIiwiYXBwZW5kU3RvcFBhaXIiLCJfaXRlcmF0b3I0MSIsIl9zdGVwNDEiLCJmaXh1cERlZ2VuZXJhdGVTdGVwQ3VydmUiLCJjb2FsZXNjZSQxIiwiZ2V0RmFsbGJhY2siLCJkZWZhdWx0VmFsdWUiLCJfaXRlcmF0b3I0MiIsIl9zdGVwNDIiLCJfaXRlcmF0b3I0MyIsIl9zdGVwNDMiLCJfaXRlcmF0b3I0NCIsIl9zdGVwNDQiLCJfaXRlcmF0b3I0NSIsIl9zdGVwNDUiLCJpc1N0ZXAiLCJfaXRlcmF0b3I0NiIsIl9zdGVwNDYiLCJjdXJ2ZSIsInJlIiwicG9zIiwibGl0ZXJhbCIsImlzRXhwcmVzc2lvbkZpbHRlciIsIl9pdGVyYXRvcjQ3IiwiX3N0ZXA0NyIsImZpbHRlclNwZWMiLCJjcmVhdGVGaWx0ZXIiLCJuZWVkR2VvbWV0cnkiLCJjb252ZXJ0RmlsdGVyIiwiY29tcGlsZWQiLCJnZW9tZXRyeU5lZWRlZCIsImdsb2JhbFByb3BlcnRpZXMiLCJjb252ZXJ0ZWQiLCJjb252ZXJ0Q29tcGFyaXNvbk9wIiwiY29udmVydE5lZ2F0aW9uIiwiY29udmVydERpc2p1bmN0aW9uT3AiLCJjb252ZXJ0SW5PcCIsImNvbnZlcnRIYXNPcCIsImZpbHRlcnMiLCJjb252ZXJ0RmlsdGVyJDEiLCJfY29udmVydEZpbHRlciIsImV4cGVjdGVkVHlwZXMiLCJfZmlsdGVyIiwiY29udmVydENvbXBhcmlzb25PcCQxIiwiY2hpbGRyZW4iLCJ0eXBlY2hlY2tzIiwicnVudGltZVR5cGVDaGVja3MiLCJfcmVmMTExIiwiY29udmVydEluT3AkMSIsImNvbnZlcnRIYXNPcCQxIiwiY29uZGl0aW9ucyIsIm5lZ2F0ZSIsInVuaWZvcm1UeXBlcyIsIl9pdGVyYXRvcjQ4IiwiX3N0ZXA0OCIsInVuaXF1ZVZhbHVlcyIsIm1pZ3JhdGVUb0V4cHJlc3Npb25zIiwiX3JlZjExMiIsIm1pZ3JhdGUiLCJtaWdyYXRlZCIsImNvbXBvc2l0ZSIsInN0eWxlSURzIiwic291cmNlSURzIiwiY29tcG9zaXRlZFNvdXJjZUxheWVycyIsImNvbXBvc2l0ZUlEIiwicmVmUHJvcGVydGllcyIsImRlcmVmIiwiZGVyZWZMYXllcnMiLCJyZWYiLCJkZWVwRXF1YWwiLCJvcGVyYXRpb25zIiwic2V0U3R5bGUiLCJhZGRMYXllciIsInJlbW92ZUxheWVyIiwic2V0UGFpbnRQcm9wZXJ0eSIsInNldExheW91dFByb3BlcnR5Iiwic2V0RmlsdGVyIiwiYWRkU291cmNlIiwicmVtb3ZlU291cmNlIiwic2V0R2VvSlNPTlNvdXJjZURhdGEiLCJzZXRMYXllclpvb21SYW5nZSIsInNldExheWVyUHJvcGVydHkiLCJzZXRDZW50ZXIiLCJzZXRab29tIiwic2V0QmVhcmluZyIsInNldFBpdGNoIiwic2V0U3ByaXRlIiwic2V0R2x5cGhzIiwic2V0VHJhbnNpdGlvbiIsInNldExpZ2h0Iiwic2V0VGVycmFpbiIsInNldEZvZyIsInNvdXJjZUlkIiwiYWZ0ZXIiLCJjb21tYW5kcyIsImNvbW1hbmQiLCJzb3VyY2VzUmVtb3ZlZCIsInVwZGF0ZVNvdXJjZSIsImNhblVwZGF0ZUdlb0pTT04iLCJiZWZvcmUiLCJkaWZmU291cmNlcyIsImRhdGEiLCJkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMiLCJsYXllcklkIiwia2xhc3MiLCJwbHVja0lkIiwiaW5kZXhCeUlkIiwiZ3JvdXAiLCJkaWZmTGF5ZXJzIiwiYmVmb3JlT3JkZXIiLCJhZnRlck9yZGVyIiwiYmVmb3JlSW5kZXgiLCJyZWR1Y2UiLCJhZnRlckluZGV4IiwidHJhY2tlciIsImNsZWFuIiwiYmVmb3JlTGF5ZXIiLCJhZnRlckxheWVyIiwiaW5zZXJ0QmVmb3JlTGF5ZXJJZCIsIm1pbnpvb20iLCJtYXh6b29tIiwiZGlmZlN0eWxlcyIsImNlbnRlciIsImJlYXJpbmciLCJwaXRjaCIsInNwcml0ZSIsInRyYW5zaXRpb24iLCJsaWdodCIsImZvZyIsInJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMiLCJiZWZvcmVMYXllcnMiLCJiZWZvcmVUZXJyYWluIiwidGVycmFpbiIsIlZhbGlkYXRpb25FcnJvciIsImlkZW50aWZpZXIiLCJfX2xpbmVfXyIsIlBhcnNpbmdFcnJvciQxIiwidmFsaWRhdGVDb25zdGFudHMiLCJ1bmJ1bmRsZSIsInZhbHVlT2YiLCJkZWVwVW5idW5kbGUiLCJ1bmJ1bmRsZWRWYWx1ZSIsInZhbGlkYXRlT2JqZWN0IiwiZWxlbWVudFNwZWNzIiwidmFsdWVTcGVjIiwiZWxlbWVudFZhbGlkYXRvcnMiLCJvYmplY3RFbGVtZW50VmFsaWRhdG9ycyIsInN0eWxlU3BlYyIsIm9iamVjdEtleSIsImVsZW1lbnRTcGVjS2V5IiwiZWxlbWVudFNwZWMiLCJ2YWxpZGF0ZUVsZW1lbnQiLCJ2YWxpZGF0ZSIsInJlcXVpcmVkIiwidmFsaWRhdGVBcnJheSIsImFycmF5U3BlYyIsInZhbGlkYXRlQXJyYXlFbGVtZW50IiwiYXJyYXlFbGVtZW50VmFsaWRhdG9yIiwiYXJyYXlFbGVtZW50U3BlYyIsIm1pbmltdW0iLCJtYXhpbXVtIiwiJHZlcnNpb24iLCJhcnJheUluZGV4IiwidmFsaWRhdGVOdW1iZXIiLCJzcGVjTWluIiwic3BlY01heCIsInZhbGlkYXRlRnVuY3Rpb24iLCJmdW5jdGlvblZhbHVlU3BlYyIsInN0b3BLZXlUeXBlIiwic3RvcERvbWFpblZhbHVlcyIsInByZXZpb3VzU3RvcERvbWFpblZhbHVlIiwicHJldmlvdXNTdG9wRG9tYWluWm9vbSIsImlzWm9vbUZ1bmN0aW9uIiwiaXNQcm9wZXJ0eUZ1bmN0aW9uIiwiaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbiIsInZhbGlkYXRlRnVuY3Rpb25TdG9wcyIsInZhbGlkYXRlRnVuY3Rpb25EZWZhdWx0IiwidmFsaWRhdGVGdW5jdGlvblN0b3AiLCJ2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZSIsInJlcG9ydFZhbHVlIiwidmFsaWRhdGVFeHByZXNzaW9uIiwiZXhwcmVzc2lvbkNvbnRleHQiLCJleHByZXNzaW9uT2JqIiwicHJvcGVydHlLZXkiLCJ2YWxpZGF0ZUJvb2xlYW4iLCJ2YWxpZGF0ZUNvbG9yIiwidmFsaWRhdGVFbnVtIiwidmFsaWRhdGVGaWx0ZXIiLCJ2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIiLCJmaWx0ZXJfb3BlcmF0b3IiLCJnZW9tZXRyeV90eXBlIiwidmFsaWRhdGVQcm9wZXJ0eSIsImxheWVyU3BlYyIsImxheWVyVHlwZSIsInRyYW5zaXRpb25NYXRjaCIsInRva2VuTWF0Y2giLCJ2YWxpZGF0ZVBhaW50UHJvcGVydHkiLCJ2YWxpZGF0ZUxheW91dFByb3BlcnR5IiwidmFsaWRhdGVMYXllciIsIm90aGVyTGF5ZXIiLCJzb3VyY2VUeXBlIiwibGluZU1ldHJpY3MiLCJ2YWxpZGF0ZVN0cmluZyIsInByb21vdGVJZCIsInZhbGlkYXRlUHJvbW90ZUlkIiwidmFsaWRhdGVTb3VyY2UiLCJzb3VyY2VfZ2VvanNvbiIsImNsdXN0ZXIiLCJjbHVzdGVyUHJvcGVydGllcyIsIl9lcnJvcnMiLCJfZXJyb3JzMiIsIl92YWx1ZSRjbHVzdGVyUHJvcGVydCIsIm1hcEV4cHIiLCJyZWR1Y2VFeHByIiwic291cmNlX3ZpZGVvIiwic291cmNlX2ltYWdlIiwiX3JlZjExMyIsInZhbGlkYXRlTGlnaHQiLCJsaWdodFNwZWMiLCJyb290VHlwZSIsInZhbGlkYXRlVGVycmFpbiIsInRlcnJhaW5TcGVjIiwidmFsaWRhdGVGb2ciLCJmb2dTcGVjIiwidmFsaWRhdGVGb3JtYXR0ZWQiLCJ2YWxpZGF0ZUltYWdlIiwiVkFMSURBVE9SUyIsInZhbGlkIiwidmFsaWRhdGVHbHlwaHNVUkwiLCJ2YWxpZGF0ZVN0eWxlTWluIiwic29ydEVycm9ycyIsIndyYXBDbGVhbkVycm9ycyIsInBhaW50UHJvcGVydHkiLCJsYXlvdXRQcm9wZXJ0eSIsIl9sZW40IiwiX2tleTciLCJvIiwiJFYwIiwiJFYxIiwiJFYyIiwiJFYzIiwiJFY0IiwiJFY1IiwiJFY2IiwiJFY3IiwiJFY4IiwiJFY5IiwidHJhY2UiLCJ5eSIsInN5bWJvbHNfIiwidGVybWluYWxzXyIsInByb2R1Y3Rpb25zXyIsInBlcmZvcm1BY3Rpb24iLCJhbm9ueW1vdXMiLCJ5eXRleHQiLCJ5eWxlbmciLCJ5eWxpbmVubyIsInl5c3RhdGUiLCIkJCIsIl8kIiwiJDAiLCIkIiwiZmlyc3RfbGluZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsInRhYmxlIiwiZGVmYXVsdEFjdGlvbnMiLCJwYXJzZUVycm9yIiwicmVjb3ZlcmFibGUiLCJzdGFjayIsInZzdGFjayIsImxzdGFjayIsIlRFUlJPUiIsIkVPRiIsImxleGVyIiwic2hhcmVkU3RhdGUiLCJzZXRJbnB1dCIsInl5bGxvYyIsInl5bG9jIiwicmFuZ2VzIiwiZ2V0UHJvdG90eXBlT2YiLCJsZXgiLCJ0b2tlbiIsInN5bWJvbCIsInN0YXRlIiwiYWN0aW9uIiwieXl2YWwiLCJuZXdTdGF0ZSIsImVyclN0ciIsInNob3dQb3NpdGlvbiIsImxvYyIsImxhc3RfbGluZSIsImZpcnN0X2NvbHVtbiIsImxhc3RfY29sdW1uIiwicmFuZ2UiLCJfaW5wdXQiLCJfbW9yZSIsIl9iYWNrdHJhY2siLCJtYXRjaGVkIiwiY29uZGl0aW9uU3RhY2siLCJvZmZzZXQiLCJjaCIsImxpbmVzIiwidW5wdXQiLCJvbGRMaW5lcyIsIm1vcmUiLCJyZWplY3QiLCJiYWNrdHJhY2tfbGV4ZXIiLCJsZXNzIiwicGFzdElucHV0IiwicGFzdCIsInVwY29taW5nSW5wdXQiLCJuZXh0IiwicHJlIiwidGVzdF9tYXRjaCIsImluZGV4ZWRfcnVsZSIsImJhY2t1cCIsIm1hdGNoZXMiLCJ0ZW1wTWF0Y2giLCJydWxlcyIsIl9jdXJyZW50UnVsZXMiLCJmbGV4IiwiYmVnaW4iLCJjb25kaXRpb24iLCJwb3BTdGF0ZSIsInRvcFN0YXRlIiwicHVzaFN0YXRlIiwic3RhdGVTdGFja1NpemUiLCJ5eV8iLCIkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zIiwiWVlfU1RBUlQiLCJQYXJzZXIiLCJjb21tb25qc1JlcXVpcmUiLCJyZWFkU3R5bGUiLCJCdWZmZXIiLCJqc29ubGludCIsInZhbGlkYXRlU3R5bGUiLCJTVVBQT1JURURfU1BFQ19WRVJTSU9OIiwiTUFYX1NPVVJDRVNfSU5fU1RZTEUiLCJpc1ZhbGlkIiwicmVnZXgiLCJnZXRTb3VyY2VDb3VudCIsImdldEFsbG93ZWRLZXlFcnJvcnMiLCJhbGxvd2VkIiwiU2V0IiwiYWNjZXB0ZWRTb3VyY2VUeXBlcyIsImdldFNvdXJjZUVycm9ycyIsInNvdXJjZUtleXMiLCJzb3VyY2VVcmxQYXR0ZXJuIiwiZ2V0U291cmNlc0Vycm9ycyIsImNvdW50Iiwic291cmNlRXJyb3JzIiwiZ2V0Um9vdEVycm9ycyIsInNwZWNLZXlzIiwib3B0aW9uYWxSb290UHJvcGVydGllcyIsImFsbG93ZWRLZXlFcnJvcnMiLCJnbHlwaFVybFBhdHRlcm4iLCJzcHJpdGVVcmxQYXR0ZXJuIiwidmlzaWJpbGl0eVBhdHRlcm4iLCJ2aXNpYmlsaXR5IiwidmFsaWRhdGVNYXBib3hBcGlTdXBwb3J0ZWQiLCJleHByZXNzaW9uJDEiLCJzdHlsZUZ1bmN0aW9uIiwidmlzaXQiLCJsYXRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsWUFBWSxHQUFHLDJCQUEyQjtBQUU5QyxJQUFBQywwQkFBYyxHQUFHLFNBQVNDLFNBQVNBLENBQUNDLFNBQVMsRUFBRUMsT0FBTyxFQUFFO0VBQ3RELElBQUlDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxRQUFRO0VBRS9CSCxPQUFPLEdBQUdBLE9BQU8sSUFBSSxFQUFFO0VBQ3ZCQyxNQUFN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QUFDO0lBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzVELFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNwRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDOUQsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQzdELGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUM3RCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDdkQsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3hELFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN4RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDMUQsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7SUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdDLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN0RCxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNsRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDN0QsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNyRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMvRCxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNsRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3BFLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNuRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDcEQsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQy9DLGtCQUFrQixFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzlELGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMvRCxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3BFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDckUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDaEUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNsRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzlELGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMvRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2hELFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN0RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDL0IsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2hELFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUN6RCxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDdkQsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNsRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNyRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2pELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNwRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFH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QUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQ0EsQ0FBQyxDQUFDUSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztRQUFDLENBQUMsRUFBQyxFQUFFO1FBQUMsQ0FBQyxFQUFDUCxHQUFHO1FBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQztRQUFDLEVBQUUsRUFBQyxFQUFFO1FBQUMsRUFBRSxFQUFDO01BQUUsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxDQUFDLEVBQUNBLEdBQUc7UUFBQyxDQUFDLEVBQUMsQ0FBQztRQUFDLENBQUMsRUFBQ0MsR0FBRztRQUFDLENBQUMsRUFBQyxDQUFDO1FBQUMsQ0FBQyxFQUFDQyxHQUFHO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDO1FBQUMsRUFBRSxFQUFDO01BQUUsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7TUFBQyxDQUFDLEVBQUNQLENBQUMsQ0FBQ1EsR0FBRyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUM7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUU7TUFBQyxDQUFDLEVBQUNSLENBQUMsQ0FBQ1MsR0FBRyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUM7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRTtNQUFDLENBQUMsRUFBQ1QsQ0FBQyxDQUFDUSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBQztRQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUM7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRTtNQUFDLENBQUMsRUFBQ1IsQ0FBQyxDQUFDVSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBQ1YsQ0FBQyxDQUFDUSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBQztRQUFDLENBQUMsRUFBQyxFQUFFO1FBQUMsQ0FBQyxFQUFDUCxHQUFHO1FBQUMsRUFBRSxFQUFDO01BQUUsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxDQUFDLEVBQUNBLEdBQUc7UUFBQyxDQUFDLEVBQUMsQ0FBQztRQUFDLENBQUMsRUFBQ0MsR0FBRztRQUFDLENBQUMsRUFBQyxDQUFDO1FBQUMsQ0FBQyxFQUFDQyxHQUFHO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDO01BQUcsQ0FBQyxFQUFDUCxDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxDQUFDLEVBQUNQLEdBQUc7UUFBQyxDQUFDLEVBQUMsQ0FBQztRQUFDLENBQUMsRUFBQ0MsR0FBRztRQUFDLENBQUMsRUFBQyxDQUFDO1FBQUMsQ0FBQyxFQUFDQyxHQUFHO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDO01BQUcsQ0FBQyxFQUFDUCxDQUFDLENBQUNTLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDVCxDQUFDLENBQUNTLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDVCxDQUFDLENBQUNVLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ3J3Qm9CLGNBQWMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDO01BQUMsQ0FBQztNQUMxQkMsVUFBVSxFQUFFLFNBQVNBLFVBQVVBLENBQUNqN0IsR0FBRyxFQUFFekwsSUFB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Q0FBUzRCLE1BQVQsR0FBa0I1QixhQUFsQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AbWFwYm94L21hcGJveC1nbC1zdHlsZS1zcGVjL2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLy8gTm90ZTogVGhpcyByZWdleCBtYXRjaGVzIGV2ZW4gaW52YWxpZCBKU09OIHN0cmluZ3MsIGJ1dCBzaW5jZSB3ZeKAmXJlXG4vLyB3b3JraW5nIG9uIHRoZSBvdXRwdXQgb2YgYEpTT04uc3RyaW5naWZ5YCB3ZSBrbm93IHRoYXQgb25seSB2YWxpZCBzdHJpbmdzXG4vLyBhcmUgcHJlc2VudCAodW5sZXNzIHRoZSB1c2VyIHN1cHBsaWVkIGEgd2VpcmQgYG9wdGlvbnMuaW5kZW50YCBidXQgaW5cbi8vIHRoYXQgY2FzZSB3ZSBkb27igJl0IGNhcmUgc2luY2UgdGhlIG91dHB1dCB3b3VsZCBiZSBpbnZhbGlkIGFueXdheSkuXG52YXIgc3RyaW5nT3JDaGFyID0gLyhcIig/OlteXFxcXFwiXXxcXFxcLikqXCIpfFs6LF0vZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkocGFzc2VkT2JqLCBvcHRpb25zKSB7XG4gIHZhciBpbmRlbnQsIG1heExlbmd0aCwgcmVwbGFjZXI7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGluZGVudCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIFsxXSxcbiAgICB1bmRlZmluZWQsXG4gICAgb3B0aW9ucy5pbmRlbnQgPT09IHVuZGVmaW5lZCA/IDIgOiBvcHRpb25zLmluZGVudFxuICApLnNsaWNlKDIsIC0zKTtcbiAgbWF4TGVuZ3RoID1cbiAgICBpbmRlbnQgPT09IFwiXCJcbiAgICAgID8gSW5maW5pdHlcbiAgICAgIDogb3B0aW9ucy5tYXhMZW5ndGggPT09IHVuZGVmaW5lZFxuICAgICAgPyA4MFxuICAgICAgOiBvcHRpb25zLm1heExlbmd0aDtcbiAgcmVwbGFjZXIgPSBvcHRpb25zLnJlcGxhY2VyO1xuXG4gIHJldHVybiAoZnVuY3Rpb24gX3N0cmluZ2lmeShvYmosIGN1cnJlbnRJbmRlbnQsIHJlc2VydmVkKSB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIGVuZCwgaW5kZXgsIGl0ZW1zLCBrZXksIGtleVBhcnQsIGtleXMsIGxlbmd0aCwgbmV4dEluZGVudCwgcHJldHRpZmllZCwgc3RhcnQsIHN0cmluZywgdmFsdWU7XG5cbiAgICBpZiAob2JqICYmIHR5cGVvZiBvYmoudG9KU09OID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgICB9XG5cbiAgICBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcblxuICAgIGlmIChzdHJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBsZW5ndGggPSBtYXhMZW5ndGggLSBjdXJyZW50SW5kZW50Lmxlbmd0aCAtIHJlc2VydmVkO1xuXG4gICAgaWYgKHN0cmluZy5sZW5ndGggPD0gbGVuZ3RoKSB7XG4gICAgICBwcmV0dGlmaWVkID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nT3JDaGFyLCBmdW5jdGlvbihtYXRjaCwgc3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbCB8fCBtYXRjaCArIFwiIFwiO1xuICAgICAgfSk7XG4gICAgICBpZiAocHJldHRpZmllZC5sZW5ndGggPD0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBwcmV0dGlmaWVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXBsYWNlciAhPSBudWxsKSB7XG4gICAgICBvYmogPSBKU09OLnBhcnNlKHN0cmluZyk7XG4gICAgICByZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIG5leHRJbmRlbnQgPSBjdXJyZW50SW5kZW50ICsgaW5kZW50O1xuICAgICAgaXRlbXMgPSBbXTtcbiAgICAgIGluZGV4ID0gMDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBzdGFydCA9IFwiW1wiO1xuICAgICAgICBlbmQgPSBcIl1cIjtcbiAgICAgICAgbGVuZ3RoID0gb2JqLmxlbmd0aDtcbiAgICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgICAgIF9zdHJpbmdpZnkob2JqW2luZGV4XSwgbmV4dEluZGVudCwgaW5kZXggPT09IGxlbmd0aCAtIDEgPyAwIDogMSkgfHxcbiAgICAgICAgICAgICAgXCJudWxsXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IFwie1wiO1xuICAgICAgICBlbmQgPSBcIn1cIjtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgICAgICBrZXlQYXJ0ID0gSlNPTi5zdHJpbmdpZnkoa2V5KSArIFwiOiBcIjtcbiAgICAgICAgICB2YWx1ZSA9IF9zdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIG5leHRJbmRlbnQsXG4gICAgICAgICAgICBrZXlQYXJ0Lmxlbmd0aCArIChpbmRleCA9PT0gbGVuZ3RoIC0gMSA/IDAgOiAxKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goa2V5UGFydCArIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFtzdGFydCwgaW5kZW50ICsgaXRlbXMuam9pbihcIixcXG5cIiArIG5leHRJbmRlbnQpLCBlbmRdLmpvaW4oXG4gICAgICAgICAgXCJcXG5cIiArIGN1cnJlbnRJbmRlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9KShwYXNzZWRPYmosIFwiXCIsIDApO1xufTtcbiIsIlxuaW1wb3J0IHJlZmVyZW5jZSBmcm9tICcuL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuaW1wb3J0IHN0cmluZ2lmeVByZXR0eSBmcm9tICdqc29uLXN0cmluZ2lmeS1wcmV0dHktY29tcGFjdCc7XG5cbmZ1bmN0aW9uIHNvcnRLZXlzQnkob2JqLCByZWZlcmVuY2UpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZWZlcmVuY2UpIHtcbiAgICAgICAgaWYgKG9ialtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgTWFwYm94IEdMIFN0eWxlLiAgUmV0dXJucyBhIHN0cmluZ2lmaWVkIHN0eWxlIHdpdGggaXRzIGtleXNcbiAqIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgcmVmZXJlbmNlIHN0eWxlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgc3BhY2VgIGFyZ3VtZW50IGlzIHBhc3NlZCB0b1xuICogW2BKU09OLnN0cmluZ2lmeWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogdG8gZ2VuZXJhdGUgZm9ybWF0dGVkIG91dHB1dC5cbiAqXG4gKiBJZiBgc3BhY2VgIGlzIHVuc3BlY2lmaWVkLCBhIGRlZmF1bHQgb2YgYDJgIHNwYWNlcyB3aWxsIGJlIHVzZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSBhIE1hcGJveCBHTCBTdHlsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZV0gc3BhY2UgYXJndW1lbnQgdG8gcGFzcyB0byBgSlNPTi5zdHJpbmdpZnlgXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBzdHJpbmdpZmllZCBmb3JtYXR0ZWQgSlNPTlxuICogQGV4YW1wbGVcbiAqIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gKiB2YXIgZm9ybWF0ID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMnKS5mb3JtYXQ7XG4gKiB2YXIgc3R5bGUgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc291cmNlLmpzb24nLCAndXRmOCcpO1xuICogZnMud3JpdGVGaWxlU3luYygnLi9kZXN0Lmpzb24nLCBmb3JtYXQoc3R5bGUpKTtcbiAqIGZzLndyaXRlRmlsZVN5bmMoJy4vZGVzdC5taW4uanNvbicsIGZvcm1hdChzdHlsZSwgMCkpO1xuICovXG5mdW5jdGlvbiBmb3JtYXQoc3R5bGUsIHNwYWNlID0gMikge1xuICAgIHN0eWxlID0gc29ydEtleXNCeShzdHlsZSwgcmVmZXJlbmNlLiRyb290KTtcblxuICAgIGlmIChzdHlsZS5sYXllcnMpIHtcbiAgICAgICAgc3R5bGUubGF5ZXJzID0gc3R5bGUubGF5ZXJzLm1hcCgobGF5ZXIpID0+IHNvcnRLZXlzQnkobGF5ZXIsIHJlZmVyZW5jZS5sYXllcikpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnlQcmV0dHkoc3R5bGUsIHtpbmRlbnQ6IHNwYWNlfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdDtcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuMy4yIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG5cdH1cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuXHQgKiBpdGVtLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0XHRyZXN1bHRbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuXHQgKiBhZGRyZXNzZXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuXHQgKiBjaGFyYWN0ZXIuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG5cdCAqIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0XHR2YXIgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHRcdH1cblx0XHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0XHR2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdFx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRcdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcblx0ICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuIFdoaWxlIEphdmFTY3JpcHQgdXNlcyBVQ1MtMiBpbnRlcm5hbGx5LFxuXHQgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuXHQgKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcblx0ICogbWF0Y2hpbmcgVVRGLTE2LlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGRlY29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgY291bnRlciA9IDAsXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG5cdFx0ICAgIHZhbHVlLFxuXHRcdCAgICBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZW5jb2RlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHRyZXR1cm4gbWFwKGFycmF5LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxuXHQgKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDIyO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDY1O1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDk3O1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuXHQgKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcblx0ICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdFx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdFx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuXHQgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjMuMicsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBvYmpba10ubWFwKGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5qb2luKHNlcCk7XG5cbiAgfVxuXG4gIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArXG4gICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5kZWNvZGUgPSBleHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmV4cG9ydHMuZW5jb2RlID0gZXhwb3J0cy5zdHJpbmdpZnkgPSByZXF1aXJlKCcuL2VuY29kZScpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gICAgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICAgIGRlbGltcyA9IFsnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCddLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gICAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gICAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgICAvLyBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAgLy8gdGhlbS5cbiAgICBub25Ib3N0Q2hhcnMgPSBbJyUnLCAnLycsICc/JywgJzsnLCAnIyddLmNvbmNhdChhdXRvRXNjYXBlKSxcbiAgICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gICAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gICAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1dGlsLmlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghdXRpbC5pc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgICAgc3BsaXR0ZXIgPVxuICAgICAgICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAodXRpbC5pc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICB1dGlsLmlzT2JqZWN0KHRoaXMucXVlcnkpICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgcHJvdG9jb2wgKz0gJzonO1xuXG4gIC8vIG9ubHkgdGhlIHNsYXNoZWRQcm90b2NvbHMgZ2V0IHRoZSAvLy4gIE5vdCBtYWlsdG86LCB4bXBwOiwgZXRjLlxuICAvLyB1bmxlc3MgdGhleSBoYWQgdGhlbSB0byBiZWdpbiB3aXRoLlxuICBpZiAodGhpcy5zbGFzaGVzIHx8XG4gICAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB0aGlzLmhvc3RuYW1lID0gaG9zdDtcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUmVmZXJlbmNlIGZyb20gJy4vcmVmZXJlbmNlL3Y4Lmpzb24nO1xuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFN0eWxlU3BlY2lmaWNhdGlvbixcbiAgICBTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIExheWVyU3BlY2lmaWNhdGlvbixcbiAgICBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbixcbiAgICBEYXRhRHJpdmVuUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5UmVmZXJlbmNlKHByb3BlcnR5TmFtZSk6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFJlZmVyZW5jZS5sYXlvdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gUmVmZXJlbmNlW1JlZmVyZW5jZS5sYXlvdXRbaV1dKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBwcm9wZXJ0eU5hbWUpIHJldHVybiAoUmVmZXJlbmNlW1JlZmVyZW5jZS5sYXlvdXRbaV1dW2tleV06IGFueSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBSZWZlcmVuY2UucGFpbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gUmVmZXJlbmNlW1JlZmVyZW5jZS5wYWludFtpXV0pIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHByb3BlcnR5TmFtZSkgcmV0dXJuIChSZWZlcmVuY2VbUmVmZXJlbmNlLnBhaW50W2ldXVtrZXldOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChudWxsOiBhbnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFjaFNvdXJjZShzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uLCBjYWxsYmFjazogKF86IFNvdXJjZVNwZWNpZmljYXRpb24pID0+IHZvaWQpIHtcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3R5bGUuc291cmNlcykge1xuICAgICAgICBjYWxsYmFjayhzdHlsZS5zb3VyY2VzW2tdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlYWNoTGF5ZXIoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiwgY2FsbGJhY2s6IChfOiBMYXllclNwZWNpZmljYXRpb24pID0+IHZvaWQpIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHN0eWxlLmxheWVycykge1xuICAgICAgICBjYWxsYmFjayhsYXllcik7XG4gICAgfVxufVxuXG50eXBlIFByb3BlcnR5Q2FsbGJhY2sgPSAoe1xuICAgIHBhdGg6IFtzdHJpbmcsICdwYWludCcgfCAnbGF5b3V0Jywgc3RyaW5nXSwgLy8gW2xheWVyaWQsIHBhaW50L2xheW91dCwgcHJvcGVydHkga2V5XVxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxtaXhlZD4gfCBEYXRhRHJpdmVuUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+LFxuICAgIHJlZmVyZW5jZTogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24sXG4gICAgc2V0OiAoUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+IHwgRGF0YURyaXZlblByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPG1peGVkPikgPT4gdm9pZFxufSkgPT4gdm9pZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2hQcm9wZXJ0eShcbiAgICBzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIG9wdGlvbnM6IHtwYWludD86IGJvb2xlYW4sIGxheW91dD86IGJvb2xlYW59LFxuICAgIGNhbGxiYWNrOiBQcm9wZXJ0eUNhbGxiYWNrXG4pIHtcbiAgICBmdW5jdGlvbiBpbm5lcihsYXllciwgcHJvcGVydHlUeXBlOiAncGFpbnQnIHwgJ2xheW91dCcpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IChsYXllcltwcm9wZXJ0eVR5cGVdOiBhbnkpO1xuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgcGF0aDogW2xheWVyLmlkLCBwcm9wZXJ0eVR5cGUsIGtleV0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2tleV0sXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBnZXRQcm9wZXJ0eVJlZmVyZW5jZShrZXkpLFxuICAgICAgICAgICAgICAgIHNldCh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNba2V5XSA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLnBhaW50KSB7XG4gICAgICAgICAgICBpbm5lcihsYXllciwgJ3BhaW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubGF5b3V0KSB7XG4gICAgICAgICAgICBpbm5lcihsYXllciwgJ2xheW91dCcpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcbmltcG9ydCB7ZWFjaFNvdXJjZSwgZWFjaExheWVyLCBlYWNoUHJvcGVydHl9IGZyb20gJy4uL3Zpc2l0LmpzJztcblxuZnVuY3Rpb24gZWFjaExheW91dChsYXllciwgY2FsbGJhY2spIHtcbiAgICBmb3IgKGNvbnN0IGsgaW4gbGF5ZXIpIHtcbiAgICAgICAgaWYgKGsuaW5kZXhPZignbGF5b3V0JykgPT09IDApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGxheWVyW2tdLCBrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZWFjaFBhaW50KGxheWVyLCBjYWxsYmFjaykge1xuICAgIGZvciAoY29uc3QgayBpbiBsYXllcikge1xuICAgICAgICBpZiAoay5pbmRleE9mKCdwYWludCcpID09PSAwKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhsYXllcltrXSwgayk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdGFudChzdHlsZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZVswXSA9PT0gJ0AnKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29uc3RhbnQoc3R5bGUsIHN0eWxlLmNvbnN0YW50c1t2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZS5zdG9wcyk7XG59XG5cbmZ1bmN0aW9uIHJlbmFtZVByb3BlcnR5KG9iaiwgZnJvbSwgdG8pIHtcbiAgICBvYmpbdG9dID0gb2JqW2Zyb21dOyBkZWxldGUgb2JqW2Zyb21dO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHlsZSkge1xuICAgIHN0eWxlLnZlcnNpb24gPSA4O1xuXG4gICAgLy8gUmVuYW1lIHByb3BlcnRpZXMsIHJldmVyc2UgY29vcmRpbmF0ZXMgaW4gc291cmNlIGFuZCBsYXllcnNcbiAgICBlYWNoU291cmNlKHN0eWxlLCAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ3ZpZGVvJyAmJiBzb3VyY2UudXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KHNvdXJjZSwgJ3VybCcsICd1cmxzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICBzb3VyY2UuY29vcmRpbmF0ZXMuZm9yRWFjaCgoY29vcmQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29vcmQucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGVhY2hMYXlvdXQobGF5ZXIsIChsYXlvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXlvdXRbJ3N5bWJvbC1taW4tZGlzdGFuY2UnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkobGF5b3V0LCAnc3ltYm9sLW1pbi1kaXN0YW5jZScsICdzeW1ib2wtc3BhY2luZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBlYWNoUGFpbnQobGF5ZXIsIChwYWludCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhaW50WydiYWNrZ3JvdW5kLWltYWdlJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KHBhaW50LCAnYmFja2dyb3VuZC1pbWFnZScsICdiYWNrZ3JvdW5kLXBhdHRlcm4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWludFsnbGluZS1pbWFnZSddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShwYWludCwgJ2xpbmUtaW1hZ2UnLCAnbGluZS1wYXR0ZXJuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFpbnRbJ2ZpbGwtaW1hZ2UnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkocGFpbnQsICdmaWxsLWltYWdlJywgJ2ZpbGwtcGF0dGVybicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIElubGluZSBDb25zdGFudHNcbiAgICBlYWNoUHJvcGVydHkoc3R5bGUsIHtwYWludDogdHJ1ZSwgbGF5b3V0OiB0cnVlfSwgKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZUNvbnN0YW50KHN0eWxlLCBwcm9wZXJ0eS52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZS5zdG9wcy5mb3JFYWNoKChzdG9wKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcFsxXSA9IHJlc29sdmVDb25zdGFudChzdHlsZSwgc3RvcFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb3BlcnR5LnNldCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgZGVsZXRlIHN0eWxlLmNvbnN0YW50cztcblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIC8vIGdldCByaWQgb2YgdGV4dC1tYXgtc2l6ZSwgaWNvbi1tYXgtc2l6ZVxuICAgICAgICAvLyB0dXJuIHRleHQtc2l6ZSwgaWNvbi1zaXplIGludG8gbGF5b3V0IHByb3BlcnRpZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtc3R5bGUtc3BlYy9pc3N1ZXMvMjU1XG5cbiAgICAgICAgZWFjaExheW91dChsYXllciwgKGxheW91dCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGxheW91dFsndGV4dC1tYXgtc2l6ZSddO1xuICAgICAgICAgICAgZGVsZXRlIGxheW91dFsnaWNvbi1tYXgtc2l6ZSddO1xuICAgICAgICB9KTtcblxuICAgICAgICBlYWNoUGFpbnQobGF5ZXIsIChwYWludCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhaW50Wyd0ZXh0LXNpemUnXSkge1xuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIubGF5b3V0KSBsYXllci5sYXlvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICBsYXllci5sYXlvdXRbJ3RleHQtc2l6ZSddID0gcGFpbnRbJ3RleHQtc2l6ZSddO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYWludFsndGV4dC1zaXplJ107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYWludFsnaWNvbi1zaXplJ10pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyLmxheW91dCkgbGF5ZXIubGF5b3V0ID0ge307XG4gICAgICAgICAgICAgICAgbGF5ZXIubGF5b3V0WydpY29uLXNpemUnXSA9IHBhaW50WydpY29uLXNpemUnXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFpbnRbJ2ljb24tc2l6ZSddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1pZ3JhdGVGb250c3RhY2tVUkwoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgaW5wdXRQYXJzZWQgPSBVUkwucGFyc2UoaW5wdXQpO1xuICAgICAgICBjb25zdCBpbnB1dFBhdGhuYW1lUGFydHMgPSBpbnB1dFBhcnNlZC5wYXRobmFtZS5zcGxpdCgnLycpO1xuXG4gICAgICAgIGlmIChpbnB1dFBhcnNlZC5wcm90b2NvbCAhPT0gJ21hcGJveDonKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFBhcnNlZC5ob3N0bmFtZSA9PT0gJ2ZvbnRzdGFjaycpIHtcbiAgICAgICAgICAgIGFzc2VydChkZWNvZGVVUkkoaW5wdXRQYXJzZWQucGF0aG5hbWUpID09PSAnL3tmb250c3RhY2t9L3tyYW5nZX0ucGJmJyk7XG4gICAgICAgICAgICByZXR1cm4gJ21hcGJveDovL2ZvbnRzL21hcGJveC97Zm9udHN0YWNrfS97cmFuZ2V9LnBiZic7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFBhcnNlZC5ob3N0bmFtZSA9PT0gJ2ZvbnRzJykge1xuICAgICAgICAgICAgYXNzZXJ0KGlucHV0UGF0aG5hbWVQYXJ0c1sxXSA9PT0gJ3YxJyk7XG4gICAgICAgICAgICBhc3NlcnQoZGVjb2RlVVJJKGlucHV0UGF0aG5hbWVQYXJ0c1szXSkgPT09ICd7Zm9udHN0YWNrfScpO1xuICAgICAgICAgICAgYXNzZXJ0KGRlY29kZVVSSShpbnB1dFBhdGhuYW1lUGFydHNbNF0pID09PSAne3JhbmdlfS5wYmYnKTtcbiAgICAgICAgICAgIHJldHVybiBgbWFwYm94Oi8vZm9udHMvJHtpbnB1dFBhdGhuYW1lUGFydHNbMl19L3tmb250c3RhY2t9L3tyYW5nZX0ucGJmYDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFzc2VydChwcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvbnQgdXJsOiBcIiR7aW5wdXR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHlsZS5nbHlwaHMpIHtcbiAgICAgICAgc3R5bGUuZ2x5cGhzID0gbWlncmF0ZUZvbnRzdGFja1VSTChzdHlsZS5nbHlwaHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1pZ3JhdGVGb250U3RhY2soZm9udCkge1xuICAgICAgICBmdW5jdGlvbiBzcGxpdEFuZFRyaW0oc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcsJykubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMudHJpbSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmb250KSkge1xuICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBwcmV2aW91c2x5IG1pZ3JhdGVkIGZvbnQtYXJyYXkuXG4gICAgICAgICAgICByZXR1cm4gZm9udDtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb250ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0QW5kVHJpbShmb250KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb250ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZm9udC5zdG9wcy5mb3JFYWNoKChzdG9wKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcFsxXSA9IHNwbGl0QW5kVHJpbShzdG9wWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZvbnQ7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZm9udCB2YWx1ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGVhY2hMYXlvdXQobGF5ZXIsIChsYXlvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXlvdXRbJ3RleHQtZm9udCddKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0Wyd0ZXh0LWZvbnQnXSA9IG1pZ3JhdGVGb250U3RhY2sobGF5b3V0Wyd0ZXh0LWZvbnQnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmV2ZXJzZSBvcmRlciBvZiBzeW1ib2wgbGF5ZXJzLiBUaGlzIGlzIGFuIGltcGVyZmVjdCBtaWdyYXRpb24uXG4gICAgLy9cbiAgICAvLyBUaGUgb3JkZXIgb2YgYSBzeW1ib2wgbGF5ZXIgaW4gdGhlIGxheWVycyBsaXN0IGFmZmVjdHMgdHdvIHRoaW5nczpcbiAgICAvLyAtIGhvdyBpdCBpcyBkcmF3biByZWxhdGl2ZSB0byBvdGhlciBsYXllcnMgKGxpa2Ugb25ld2F5IGFycm93cyBiZWxvdyBicmlkZ2VzKVxuICAgIC8vIC0gdGhlIHBsYWNlbWVudCBwcmlvcml0eSBjb21wYXJlZCB0byBvdGhlciBsYXllcnNcbiAgICAvL1xuICAgIC8vIEl0J3MgaW1wb3NzaWJsZSB0byByZXZlcnNlIHRoZSBwbGFjZW1lbnQgcHJpb3JpdHkgd2l0aG91dCBicmVha2luZyB0aGUgZHJhdyBvcmRlclxuICAgIC8vIGluIHNvbWUgY2FzZXMuIFRoaXMgbWlncmF0aW9uIG9ubHkgcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHN5bWJvbCBsYXllcnMgdGhhdFxuICAgIC8vIGFyZSBhYm92ZSBhbGwgb3RoZXIgdHlwZXMgb2YgbGF5ZXJzLlxuICAgIC8vXG4gICAgLy8gU3ltYm9sIGxheWVycyB0aGF0IGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBtYXAgcHJlc2VydmUgdGhlaXIgcHJpb3JpdHkuXG4gICAgLy8gU3ltYm9sIGxheWVycyB0aGF0IGFyZSBiZWxvdyBhbm90aGVyIHR5cGUgKGxpbmUsIGZpbGwpIG9mIGxheWVyIHByZXNlcnZlIHRoZWlyIGRyYXcgb3JkZXIuXG5cbiAgICBsZXQgZmlyc3RTeW1ib2xMYXllciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHN0eWxlLmxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBsYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICBmaXJzdFN5bWJvbExheWVyID0gaSArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbExheWVycyA9IHN0eWxlLmxheWVycy5zcGxpY2UoZmlyc3RTeW1ib2xMYXllcik7XG4gICAgc3ltYm9sTGF5ZXJzLnJldmVyc2UoKTtcbiAgICBzdHlsZS5sYXllcnMgPSBzdHlsZS5sYXllcnMuY29uY2F0KHN5bWJvbExheWVycyk7XG5cbiAgICByZXR1cm4gc3R5bGU7XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAob3V0cHV0OiBhbnksIC4uLmlucHV0czogQXJyYXk8YW55Pikge1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBpbnB1dCkge1xuICAgICAgICAgICAgb3V0cHV0W2tdID0gaW5wdXRba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFBhcnNpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3Ioa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzaW5nRXJyb3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcblxuLyoqXG4gKiBUcmFja3MgYGxldGAgYmluZGluZ3MgZHVyaW5nIGV4cHJlc3Npb24gcGFyc2luZy5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNjb3BlIHtcbiAgICBwYXJlbnQ6ID9TY29wZTtcbiAgICBiaW5kaW5nczoge1tfOiBzdHJpbmddOiBFeHByZXNzaW9ufTtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBTY29wZSwgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiA9IFtdKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGV4cHJlc3Npb25dIG9mIGJpbmRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW25hbWVdID0gZXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbmNhdChiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NvcGUodGhpcywgYmluZGluZ3MpO1xuICAgIH1cblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBFeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbbmFtZV0pIHsgcmV0dXJuIHRoaXMuYmluZGluZ3NbbmFtZV07IH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7IHJldHVybiB0aGlzLnBhcmVudC5nZXQobmFtZSk7IH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9IG5vdCBmb3VuZCBpbiBzY29wZS5gKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW25hbWVdKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuaGFzKG5hbWUpIDogZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY29wZTtcbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIE51bGxUeXBlVCA9IHsga2luZDogJ251bGwnIH07XG5leHBvcnQgdHlwZSBOdW1iZXJUeXBlVCA9IHsga2luZDogJ251bWJlcicgfTtcbmV4cG9ydCB0eXBlIFN0cmluZ1R5cGVUID0geyBraW5kOiAnc3RyaW5nJyB9O1xuZXhwb3J0IHR5cGUgQm9vbGVhblR5cGVUID0geyBraW5kOiAnYm9vbGVhbicgfTtcbmV4cG9ydCB0eXBlIENvbG9yVHlwZVQgPSB7IGtpbmQ6ICdjb2xvcicgfTtcbmV4cG9ydCB0eXBlIE9iamVjdFR5cGVUID0geyBraW5kOiAnb2JqZWN0JyB9O1xuZXhwb3J0IHR5cGUgVmFsdWVUeXBlVCA9IHsga2luZDogJ3ZhbHVlJyB9O1xuZXhwb3J0IHR5cGUgRXJyb3JUeXBlVCA9IHsga2luZDogJ2Vycm9yJyB9O1xuZXhwb3J0IHR5cGUgQ29sbGF0b3JUeXBlVCA9IHsga2luZDogJ2NvbGxhdG9yJyB9O1xuZXhwb3J0IHR5cGUgRm9ybWF0dGVkVHlwZVQgPSB7IGtpbmQ6ICdmb3JtYXR0ZWQnIH07XG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlVHlwZVQgPSB7IGtpbmQ6ICdyZXNvbHZlZEltYWdlJyB9O1xuXG5leHBvcnQgdHlwZSBFdmFsdWF0aW9uS2luZCA9ICdjb25zdGFudCcgfCAnc291cmNlJyB8ICdjYW1lcmEnIHwgJ2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCB0eXBlIFR5cGUgPVxuICAgIE51bGxUeXBlVCB8XG4gICAgTnVtYmVyVHlwZVQgfFxuICAgIFN0cmluZ1R5cGVUIHxcbiAgICBCb29sZWFuVHlwZVQgfFxuICAgIENvbG9yVHlwZVQgfFxuICAgIE9iamVjdFR5cGVUIHxcbiAgICBWYWx1ZVR5cGVUIHxcbiAgICBBcnJheVR5cGUgfCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgRXJyb3JUeXBlVCB8XG4gICAgQ29sbGF0b3JUeXBlVCB8XG4gICAgRm9ybWF0dGVkVHlwZVQgfFxuICAgIFJlc29sdmVkSW1hZ2VUeXBlVFxuXG5leHBvcnQgdHlwZSBBcnJheVR5cGUgPSB7XG4gICAga2luZDogJ2FycmF5JyxcbiAgICBpdGVtVHlwZTogVHlwZSxcbiAgICBOOiA/bnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIE5hdGl2ZVR5cGUgPSAnbnVtYmVyJyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nIHwgJ251bGwnIHwgJ2FycmF5JyB8ICdvYmplY3QnXG5cbmV4cG9ydCBjb25zdCBOdWxsVHlwZSA9IHtraW5kOiAnbnVsbCd9O1xuZXhwb3J0IGNvbnN0IE51bWJlclR5cGUgPSB7a2luZDogJ251bWJlcid9O1xuZXhwb3J0IGNvbnN0IFN0cmluZ1R5cGUgPSB7a2luZDogJ3N0cmluZyd9O1xuZXhwb3J0IGNvbnN0IEJvb2xlYW5UeXBlID0ge2tpbmQ6ICdib29sZWFuJ307XG5leHBvcnQgY29uc3QgQ29sb3JUeXBlID0ge2tpbmQ6ICdjb2xvcid9O1xuZXhwb3J0IGNvbnN0IE9iamVjdFR5cGUgPSB7a2luZDogJ29iamVjdCd9O1xuZXhwb3J0IGNvbnN0IFZhbHVlVHlwZSA9IHtraW5kOiAndmFsdWUnfTtcbmV4cG9ydCBjb25zdCBFcnJvclR5cGUgPSB7a2luZDogJ2Vycm9yJ307XG5leHBvcnQgY29uc3QgQ29sbGF0b3JUeXBlID0ge2tpbmQ6ICdjb2xsYXRvcid9O1xuZXhwb3J0IGNvbnN0IEZvcm1hdHRlZFR5cGUgPSB7a2luZDogJ2Zvcm1hdHRlZCd9O1xuZXhwb3J0IGNvbnN0IFJlc29sdmVkSW1hZ2VUeXBlID0ge2tpbmQ6ICdyZXNvbHZlZEltYWdlJ307XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShpdGVtVHlwZTogVHlwZSwgTjogP251bWJlcik6IEFycmF5VHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2FycmF5JyxcbiAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgIE5cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcodHlwZTogVHlwZSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRvU3RyaW5nKHR5cGUuaXRlbVR5cGUpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHR5cGUuTiA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgYGFycmF5PCR7aXRlbVR5cGV9LCAke3R5cGUuTn0+YCA6XG4gICAgICAgICAgICB0eXBlLml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScgPyAnYXJyYXknIDogYGFycmF5PCR7aXRlbVR5cGV9PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZDtcbiAgICB9XG59XG5cbmNvbnN0IHZhbHVlTWVtYmVyVHlwZXMgPSBbXG4gICAgTnVsbFR5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIENvbG9yVHlwZSxcbiAgICBGb3JtYXR0ZWRUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgYXJyYXkoVmFsdWVUeXBlKSxcbiAgICBSZXNvbHZlZEltYWdlVHlwZVxuXTtcblxuLyoqXG4gKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICogZXJyb3IgbWVzc2FnZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICBpZiAodC5raW5kID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIEVycm9yIGlzIGEgc3VidHlwZSBvZiBldmVyeSB0eXBlXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpZiAodC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAoKHQuTiA9PT0gMCAmJiB0Lml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScpIHx8ICFjaGVja1N1YnR5cGUoZXhwZWN0ZWQuaXRlbVR5cGUsIHQuaXRlbVR5cGUpKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiBleHBlY3RlZC5OICE9PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5OID09PSB0Lk4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gdC5raW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlclR5cGUgb2YgdmFsdWVNZW1iZXJUeXBlcykge1xuICAgICAgICAgICAgaWYgKCFjaGVja1N1YnR5cGUobWVtYmVyVHlwZSwgdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0b1N0cmluZyhleHBlY3RlZCl9IGJ1dCBmb3VuZCAke3RvU3RyaW5nKHQpfSBpbnN0ZWFkLmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHlwZShwcm92aWRlZDogVHlwZSwgYWxsb3dlZFR5cGVzOiBBcnJheTxUeXBlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhbGxvd2VkVHlwZXMuc29tZSh0ID0+IHQua2luZCA9PT0gcHJvdmlkZWQua2luZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTmF0aXZlVHlwZShwcm92aWRlZDogYW55LCBhbGxvd2VkVHlwZXM6IEFycmF5PE5hdGl2ZVR5cGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5zb21lKHQgPT4ge1xuICAgICAgICBpZiAodCA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQgPT09IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvdmlkZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQgJiYgIUFycmF5LmlzQXJyYXkocHJvdmlkZWQpICYmIHR5cGVvZiBwcm92aWRlZCA9PT0gJ29iamVjdCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdCA9PT0gdHlwZW9mIHByb3ZpZGVkO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhcnNlQ1NTQ29sb3J9IGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuLyoqXG4gKiBBbiBSR0JBIGNvbG9yIHZhbHVlLiBDcmVhdGUgaW5zdGFuY2VzIGZyb20gY29sb3Igc3RyaW5ncyB1c2luZyB0aGUgc3RhdGljXG4gKiBtZXRob2QgYENvbG9yLnBhcnNlYC4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgUkdCIGNoYW5uZWwgdmFsdWVzIGluIHRoZSByYW5nZVxuICogYFswLCAxXWAsIHByZW11bHRpcGxpZWQgYnkgQS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gciBUaGUgcmVkIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gZyBUaGUgZ3JlZW4gY2hhbm5lbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiIFRoZSBibHVlIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgYWxwaGEgY2hhbm5lbC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbG9yIHtcbiAgICByOiBudW1iZXI7XG4gICAgZzogbnVtYmVyO1xuICAgIGI6IG51bWJlcjtcbiAgICBhOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMuciA9IHI7XG4gICAgICAgIHRoaXMuZyA9IGc7XG4gICAgICAgIHRoaXMuYiA9IGI7XG4gICAgICAgIHRoaXMuYSA9IGE7XG4gICAgfVxuXG4gICAgc3RhdGljIGJsYWNrOiBDb2xvcjtcbiAgICBzdGF0aWMgd2hpdGU6IENvbG9yO1xuICAgIHN0YXRpYyB0cmFuc3BhcmVudDogQ29sb3I7XG4gICAgc3RhdGljIHJlZDogQ29sb3I7XG4gICAgc3RhdGljIGJsdWU6IENvbG9yO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCByZXR1cm5zIGEgYENvbG9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBIGBDb2xvcmAgaW5zdGFuY2UsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBjb2xvciBzdHJpbmcuXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKGlucHV0Pzogc3RyaW5nIHwgQ29sb3IgfCBudWxsKTogQ29sb3IgfCB2b2lkIHtcbiAgICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJnYmEgPSBwYXJzZUNTU0NvbG9yKGlucHV0KTtcbiAgICAgICAgaWYgKCFyZ2JhKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgICAgIHJnYmFbMF0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsxXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzJdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbM11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIFJHQkEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29sb3IgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBSR0JBIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwdXJwbGUgPSBuZXcgQ29sb3IucGFyc2UoJ3B1cnBsZScpO1xuICAgICAqIHB1cnBsZS50b1N0cmluZzsgLy8gPSBcInJnYmEoMTI4LDAsMTI4LDEpXCJcbiAgICAgKiB2YXIgdHJhbnNsdWNlbnRHcmVlbiA9IG5ldyBDb2xvci5wYXJzZSgncmdiYSgyNiwgMjA3LCAyNiwgLjczKScpO1xuICAgICAqIHRyYW5zbHVjZW50R3JlZW4udG9TdHJpbmcoKTsgLy8gPSBcInJnYmEoMjYsMjA3LDI2LDAuNzMpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbciwgZywgYiwgYV0gPSB0aGlzLnRvQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIGByZ2JhKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9LCR7YX0pYDtcbiAgICB9XG5cbiAgICB0b0FycmF5KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGIsIGF9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGEgPT09IDAgPyBbMCwgMCwgMCwgMF0gOiBbXG4gICAgICAgICAgICByICogMjU1IC8gYSxcbiAgICAgICAgICAgIGcgKiAyNTUgLyBhLFxuICAgICAgICAgICAgYiAqIDI1NSAvIGEsXG4gICAgICAgICAgICBhXG4gICAgICAgIF07XG4gICAgfVxufVxuXG5Db2xvci5ibGFjayA9IG5ldyBDb2xvcigwLCAwLCAwLCAxKTtcbkNvbG9yLndoaXRlID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuQ29sb3IudHJhbnNwYXJlbnQgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG5Db2xvci5yZWQgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5Db2xvci5ibHVlID0gbmV3IENvbG9yKDAsIDAsIDEsIDEpO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvcjtcbiIsIi8vIEBmbG93XG5cbi8vIEZsb3cgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIEludGwgY3JpYmJlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTI3MFxuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgQ29sbGF0b3I6IENsYXNzPEludGwkQ29sbGF0b3I+XG59O1xuXG5kZWNsYXJlIGNsYXNzIEludGwkQ29sbGF0b3Ige1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogQ29sbGF0b3JPcHRpb25zXG4gICAgKTogSW50bCRDb2xsYXRvcjtcblxuICAgIHN0YXRpYyAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IENvbGxhdG9yT3B0aW9uc1xuICAgICk6IEludGwkQ29sbGF0b3I7XG5cbiAgICBjb21wYXJlIChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlcjtcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgQ29sbGF0b3JPcHRpb25zID0ge1xuICAgIGxvY2FsZU1hdGNoZXI/OiAnbG9va3VwJyB8ICdiZXN0IGZpdCcsXG4gICAgdXNhZ2U/OiAnc29ydCcgfCAnc2VhcmNoJyxcbiAgICBzZW5zaXRpdml0eT86ICdiYXNlJyB8ICdhY2NlbnQnIHwgJ2Nhc2UnIHwgJ3ZhcmlhbnQnLFxuICAgIGlnbm9yZVB1bmN0dWF0aW9uPzogYm9vbGVhbixcbiAgICBudW1lcmljPzogYm9vbGVhbixcbiAgICBjYXNlRmlyc3Q/OiAndXBwZXInIHwgJ2xvd2VyJyB8ICdmYWxzZSdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3Ige1xuICAgIGxvY2FsZTogc3RyaW5nIHwgbnVsbDtcbiAgICBzZW5zaXRpdml0eTogJ2Jhc2UnIHwgJ2FjY2VudCcgfCAnY2FzZScgfCAndmFyaWFudCc7XG4gICAgY29sbGF0b3I6IEludGwkQ29sbGF0b3I7XG5cbiAgICBjb25zdHJ1Y3RvcihjYXNlU2Vuc2l0aXZlOiBib29sZWFuLCBkaWFjcml0aWNTZW5zaXRpdmU6IGJvb2xlYW4sIGxvY2FsZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAoY2FzZVNlbnNpdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBkaWFjcml0aWNTZW5zaXRpdmUgPyAndmFyaWFudCcgOiAnY2FzZSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBkaWFjcml0aWNTZW5zaXRpdmUgPyAnYWNjZW50JyA6ICdiYXNlJztcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgdGhpcy5jb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSxcbiAgICAgICAgICAgIHtzZW5zaXRpdml0eTogdGhpcy5zZW5zaXRpdml0eSwgdXNhZ2U6ICdzZWFyY2gnfSk7XG4gICAgfVxuXG4gICAgY29tcGFyZShsaHM6IHN0cmluZywgcmhzOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvci5jb21wYXJlKGxocywgcmhzKTtcbiAgICB9XG5cbiAgICByZXNvbHZlZExvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICAvLyBXZSBjcmVhdGUgYSBDb2xsYXRvciB3aXRob3V0IFwidXNhZ2U6IHNlYXJjaFwiIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudFxuICAgICAgICAvLyB0aGUgc2VhcmNoIG9wdGlvbnMgZW5jb2RlZCBpbiBvdXIgcmVzdWx0IChlLmcuIFwiZW4tdS1jby1zZWFyY2hcIilcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSlcbiAgICAgICAgICAgIC5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXR0ZWRTZWN0aW9uIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgaW1hZ2U6IFJlc29sdmVkSW1hZ2UgfCBudWxsO1xuICAgIHNjYWxlOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbDtcbiAgICB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHRleHQ6IHN0cmluZywgaW1hZ2U6IFJlc29sdmVkSW1hZ2UgfCBudWxsLCBzY2FsZTogbnVtYmVyIHwgbnVsbCwgZm9udFN0YWNrOiBzdHJpbmcgfCBudWxsLCB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5mb250U3RhY2sgPSBmb250U3RhY2s7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybWF0dGVkIHtcbiAgICBzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbj4pIHtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHNlY3Rpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBGb3JtYXR0ZWQge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZChbbmV3IEZvcm1hdHRlZFNlY3Rpb24odW5mb3JtYXR0ZWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpXSk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlY3Rpb25zLnNvbWUoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQubGVuZ3RoICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvbi5pbWFnZSAmJiBzZWN0aW9uLmltYWdlLm5hbWUubGVuZ3RoICE9PSAwKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZhY3RvcnkodGV4dDogRm9ybWF0dGVkIHwgc3RyaW5nKTogRm9ybWF0dGVkIHtcbiAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25zLm1hcChzZWN0aW9uID0+IHNlY3Rpb24udGV4dCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IEFycmF5PG1peGVkPiA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKFtcImltYWdlXCIsIHNlY3Rpb24uaW1hZ2UubmFtZV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlY3Rpb24udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IG1peGVkIH0gPSB7fTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnRTdGFjaykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbXCJ0ZXh0LWZvbnRcIl0gPSBbXCJsaXRlcmFsXCIsIHNlY3Rpb24uZm9udFN0YWNrLnNwbGl0KCcsJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1wiZm9udC1zY2FsZVwiXSA9IHNlY3Rpb24uc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi50ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1widGV4dC1jb2xvclwiXSA9IChbXCJyZ2JhXCJdOiBBcnJheTxtaXhlZD4pLmNvbmNhdChzZWN0aW9uLnRleHRDb2xvci50b0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkSW1hZ2VPcHRpb25zID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdmFpbGFibGU6IGJvb2xlYW5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc29sdmVkSW1hZ2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhdmFpbGFibGU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZEltYWdlT3B0aW9ucykge1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlID0gb3B0aW9ucy5hdmFpbGFibGU7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhuYW1lOiBzdHJpbmcpOiBSZXNvbHZlZEltYWdlIHwgbnVsbCB7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7IC8vIHRyZWF0IGVtcHR5IHZhbHVlcyBhcyBubyBpbWFnZVxuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkSW1hZ2Uoe25hbWUsIGF2YWlsYWJsZTogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbXCJpbWFnZVwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4vdHlwZXMvY29sbGF0b3IuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcbmltcG9ydCB7TnVsbFR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE9iamVjdFR5cGUsIFZhbHVlVHlwZSwgQ29sbGF0b3JUeXBlLCBGb3JtYXR0ZWRUeXBlLCBSZXNvbHZlZEltYWdlVHlwZSwgYXJyYXl9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJHQkEocjogbWl4ZWQsIGc6IG1peGVkLCBiOiBtaXhlZCwgYT86IG1peGVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCEoXG4gICAgICAgIHR5cGVvZiByID09PSAnbnVtYmVyJyAmJiByID49IDAgJiYgciA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGcgPT09ICdudW1iZXInICYmIGcgPj0gMCAmJiBnIDw9IDI1NSAmJlxuICAgICAgICB0eXBlb2YgYiA9PT0gJ251bWJlcicgJiYgYiA+PSAwICYmIGIgPD0gMjU1XG4gICAgKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBhID09PSAnbnVtYmVyJyA/IFtyLCBnLCBiLCBhXSA6IFtyLCBnLCBiXTtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7dmFsdWUuam9pbignLCAnKX1dOiAncicsICdnJywgYW5kICdiJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LmA7XG4gICAgfVxuXG4gICAgaWYgKCEoXG4gICAgICAgIHR5cGVvZiBhID09PSAndW5kZWZpbmVkJyB8fCAodHlwZW9mIGEgPT09ICdudW1iZXInICYmIGEgPj0gMCAmJiBhIDw9IDEpXG4gICAgKSkge1xuICAgICAgICByZXR1cm4gYEludmFsaWQgcmdiYSB2YWx1ZSBbJHtbciwgZywgYiwgYV0uam9pbignLCAnKX1dOiAnYScgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgVmFsdWUgPSBudWxsIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IENvbG9yIHwgQ29sbGF0b3IgfCBGb3JtYXR0ZWQgfCBSZXNvbHZlZEltYWdlIHwgJFJlYWRPbmx5QXJyYXk8VmFsdWU+IHwgeyArW3N0cmluZ106IFZhbHVlIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsdWUobWl4ZWQ6IG1peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKG1peGVkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1peGVkKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShtaXhlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKHZhbHVlOiBWYWx1ZSk6IFR5cGUge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTnVsbFR5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmdUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW5UeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gTnVtYmVyVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGF0b3IpIHtcbiAgICAgICAgcmV0dXJuIENvbGxhdG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiBGb3JtYXR0ZWRUeXBlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgIHJldHVybiBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgbGV0IGl0ZW1UeXBlOiBUeXBlIHwgdHlwZW9mIHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0eXBlT2YoaXRlbSk7XG4gICAgICAgICAgICBpZiAoIWl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gdCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IFZhbHVlVHlwZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheShpdGVtVHlwZSB8fCBWYWx1ZVR5cGUsIGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpO1xuICAgICAgICByZXR1cm4gT2JqZWN0VHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTogVmFsdWUpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yIHx8IHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IHtDb2xvciwgQ29sbGF0b3J9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtpc1ZhbHVlLCB0eXBlT2YsIENvbG9yfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSAgZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5cbmNsYXNzIExpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHZhbHVlOiBWYWx1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIHZhbHVlOiBWYWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCdsaXRlcmFsJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbHVlKGFyZ3NbMV0pKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYGludmFsaWQgdmFsdWVgKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChhcmdzWzFdOiBhbnkpO1xuICAgICAgICBsZXQgdHlwZSA9IHR5cGVPZih2YWx1ZSk7XG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBpbmZlciB0aGUgaXRlbSB0eXBlIGlmIHBvc3NpYmxlIGZvciB6ZXJvLWxlbmd0aCBhcnJheXNcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlLk4gPT09IDAgJiZcbiAgICAgICAgICAgIGV4cGVjdGVkICYmXG4gICAgICAgICAgICBleHBlY3RlZC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHlwZSA9IGV4cGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHR5cGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdhcnJheScgfHwgdGhpcy50eXBlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gW1wibGl0ZXJhbFwiLCB0aGlzLnZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgIC8vIENvbnN0YW50LWZvbGRpbmcgY2FuIGdlbmVyYXRlIExpdGVyYWwgZXhwcmVzc2lvbnMgdGhhdCB5b3VcbiAgICAgICAgICAgIC8vIGNvdWxkbid0IGFjdHVhbGx5IGdlbmVyYXRlIHdpdGggYSBcImxpdGVyYWxcIiBleHByZXNzaW9uLFxuICAgICAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBpbXBsZW1lbnQgYW4gZXF1aXZhbGVudCBzZXJpYWxpemF0aW9uIGhlcmVcbiAgICAgICAgICAgIHJldHVybiBbXCJyZ2JhXCJdLmNvbmNhdCh0aGlzLnZhbHVlLnRvQXJyYXkoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICAgICAgLy8gU2FtZSBhcyBDb2xvclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc2VyaWFsaXplKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy52YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXRlcmFsO1xuIiwiLy8gQGZsb3dcblxuY2xhc3MgUnVudGltZUVycm9yIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICdFeHByZXNzaW9uRXZhbHVhdGlvbkVycm9yJztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSdW50aW1lRXJyb3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7XG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIGNoZWNrU3VidHlwZSxcbiAgICB0b1N0cmluZyxcbiAgICBhcnJheVxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgc3RyaW5nOiBTdHJpbmdUeXBlLFxuICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICBvYmplY3Q6IE9iamVjdFR5cGVcbn07XG5cbmNsYXNzIEFzc2VydGlvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgIGxldCB0eXBlO1xuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgbGV0IGl0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBhcmdzWzFdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgISh0eXBlIGluIHR5cGVzKSB8fCB0eXBlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBpdGVtIHR5cGUgYXJndW1lbnQgb2YgXCJhcnJheVwiIG11c3QgYmUgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuJywgMSk7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0eXBlc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gVmFsdWVUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgTjtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1syXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGFyZ3NbMl0gIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdIDwgMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSAhPT0gTWF0aC5mbG9vcihhcmdzWzJdKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBsZW5ndGggYXJndW1lbnQgdG8gXCJhcnJheVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwnLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTiA9IGFyZ3NbMl07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0eXBlID0gYXJyYXkoaXRlbVR5cGUsIE4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0eXBlLCBwYXJzZWQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5hcmdzW2ldLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGNoZWNrU3VidHlwZSh0aGlzLnR5cGUsIHR5cGVPZih2YWx1ZSkpO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdGhpcy5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlICR7dG9TdHJpbmcodGhpcy50eXBlKX0sIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZih2YWx1ZSkpfSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy5ldmVyeShhcmcgPT4gYXJnLm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdHlwZS5raW5kXTtcbiAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0eXBlLml0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGl0ZW1UeXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICBpdGVtVHlwZS5raW5kID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goaXRlbVR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgTiA9IHR5cGUuTjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE4gPT09ICdudW1iZXInIHx8IHRoaXMuYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChOKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQuY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXNzZXJ0aW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtOdW1iZXJUeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIGFycmF5LCBTdHJpbmdUeXBlLCBDb2xvclR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkLCB7Rm9ybWF0dGVkU2VjdGlvbn0gZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB7dG9TdHJpbmcsIHR5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uID0ge1xuICAgIC8vIENvbnRlbnQgb2YgYSBzZWN0aW9uIG1heSBiZSBJbWFnZSBleHByZXNzaW9uIG9yIG90aGVyXG4gICAgLy8gdHlwZSBvZiBleHByZXNzaW9uIHRoYXQgaXMgY29lcmNhYmxlIHRvICdzdHJpbmcnLlxuICAgIGNvbnRlbnQ6IEV4cHJlc3Npb24sXG4gICAgc2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIGZvbnQ6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIHRleHRDb2xvcjogRXhwcmVzc2lvbiB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEZvcm1hdHRlZFR5cGU7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0QXJnID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpcnN0QXJnKSAmJiB0eXBlb2YgZmlyc3RBcmcgPT09ICdvYmplY3QnKSAge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gaW1hZ2Ugb3IgdGV4dCBzZWN0aW9uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICBsZXQgbmV4dFRva2VuTWF5QmVPYmplY3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYXJncy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IChhcmdzW2ldOiBhbnkpO1xuXG4gICAgICAgICAgICBpZiAobmV4dFRva2VuTWF5QmVPYmplY3QgJiYgdHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgICAgICAgbmV4dFRva2VuTWF5QmVPYmplY3QgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGxldCBzY2FsZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1snZm9udC1zY2FsZSddKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gY29udGV4dC5wYXJzZShhcmdbJ2ZvbnQtc2NhbGUnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBmb250ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnWyd0ZXh0LWZvbnQnXSkge1xuICAgICAgICAgICAgICAgICAgICBmb250ID0gY29udGV4dC5wYXJzZShhcmdbJ3RleHQtZm9udCddLCAxLCBhcnJheShTdHJpbmdUeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9udCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHRleHRDb2xvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1sndGV4dC1jb2xvciddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvciA9IGNvbnRleHQucGFyc2UoYXJnWyd0ZXh0LWNvbG9yJ10sIDEsIENvbG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dENvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RXhwcmVzc2lvbiA9IHNlY3Rpb25zW3NlY3Rpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGxhc3RFeHByZXNzaW9uLnNjYWxlID0gc2NhbGU7XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24uZm9udCA9IGZvbnQ7XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24udGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBraW5kID0gY29udGVudC50eXBlLmtpbmQ7XG4gICAgICAgICAgICAgICAgaWYgKGtpbmQgIT09ICdzdHJpbmcnICYmIGtpbmQgIT09ICd2YWx1ZScgJiYga2luZCAhPT0gJ251bGwnICYmIGtpbmQgIT09ICdyZXNvbHZlZEltYWdlJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEZvcm1hdHRlZCB0ZXh0IHR5cGUgbXVzdCBiZSAnc3RyaW5nJywgJ3ZhbHVlJywgJ2ltYWdlJyBvciAnbnVsbCcuYCk7XG5cbiAgICAgICAgICAgICAgICBuZXh0VG9rZW5NYXlCZU9iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7Y29udGVudCwgc2NhbGU6IG51bGwsIGZvbnQ6IG51bGwsIHRleHRDb2xvcjogbnVsbH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKHNlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlU2VjdGlvbiA9IHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkQ29udGVudCA9IHNlY3Rpb24uY29udGVudC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgaWYgKHR5cGVPZihldmFsdWF0ZWRDb250ZW50KSA9PT0gUmVzb2x2ZWRJbWFnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZFNlY3Rpb24oJycsIGV2YWx1YXRlZENvbnRlbnQsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZFNlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKGV2YWx1YXRlZENvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLnNjYWxlID8gc2VjdGlvbi5zY2FsZS5ldmFsdWF0ZShjdHgpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5mb250ID8gc2VjdGlvbi5mb250LmV2YWx1YXRlKGN0eCkuam9pbignLCcpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi50ZXh0Q29sb3IgPyBzZWN0aW9uLnRleHRDb2xvci5ldmFsdWF0ZShjdHgpIDogbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZCh0aGlzLnNlY3Rpb25zLm1hcChldmFsdWF0ZVNlY3Rpb24pKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBmbihzZWN0aW9uLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLnNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnQpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLmZvbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi50ZXh0Q29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhlIGNvbWJpbmF0b3JpYyBzZXQgb2YgYWxsIGNoaWxkcmVuXG4gICAgICAgIC8vIFVzdWFsbHksIHRoaXMudGV4dCB3aWxsIGJlIHVuZGVmaW5lZCBhbnl3YXlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLmNvbnRlbnQuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWydmb250LXNjYWxlJ10gPSBzZWN0aW9uLnNjYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uZm9udCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3RleHQtZm9udCddID0gc2VjdGlvbi5mb250LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1sndGV4dC1jb2xvciddID0gc2VjdGlvbi50ZXh0Q29sb3Iuc2VyaWFsaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtSZXNvbHZlZEltYWdlVHlwZSwgU3RyaW5nVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE5vIGltYWdlIG5hbWUgcHJvdmlkZWQuYCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUV4cHJlc3Npb24obmFtZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRJbWFnZU5hbWUgPSB0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBSZXNvbHZlZEltYWdlLmZyb21TdHJpbmcoZXZhbHVhdGVkSW1hZ2VOYW1lKTtcbiAgICAgICAgaWYgKHZhbHVlICYmIGN0eC5hdmFpbGFibGVJbWFnZXMpIHZhbHVlLmF2YWlsYWJsZSA9IGN0eC5hdmFpbGFibGVJbWFnZXMuaW5kZXhPZihldmFsdWF0ZWRJbWFnZU5hbWUpID4gLTE7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgLy8gVGhlIG91dHB1dCBvZiBpbWFnZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbWFnZXMgaW4gdGhlIGV2YWx1YXRpb24gY29udGV4dFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIFZhbHVlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHtDb2xvciwgdG9TdHJpbmcgYXMgdmFsdWVUb1N0cmluZywgdmFsaWRhdGVSR0JBfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBGb3JtYXRFeHByZXNzaW9uIGZyb20gJy4uL2RlZmluaXRpb25zL2Zvcm1hdC5qcyc7XG5pbXBvcnQgSW1hZ2VFeHByZXNzaW9uIGZyb20gJy4uL2RlZmluaXRpb25zL2ltYWdlLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jb25zdCB0eXBlcyA9IHtcbiAgICAndG8tYm9vbGVhbic6IEJvb2xlYW5UeXBlLFxuICAgICd0by1jb2xvcic6IENvbG9yVHlwZSxcbiAgICAndG8tbnVtYmVyJzogTnVtYmVyVHlwZSxcbiAgICAndG8tc3RyaW5nJzogU3RyaW5nVHlwZVxufTtcblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGVycm9yLWNvYWxlc2NpbmcgY29lcmNpb24gZXhwcmVzc2lvbnMgXCJ0by1udW1iZXJcIixcbiAqIFwidG8tY29sb3JcIi4gIFNpbmNlIHRoZXNlIGNvZXJjaW9ucyBjYW4gZmFpbCBhdCBydW50aW1lLCB0aGV5IGFjY2VwdCBtdWx0aXBsZVxuICogYXJndW1lbnRzLCBvbmx5IGV2YWx1YXRpbmcgb25lIGF0IGEgdGltZSB1bnRpbCBvbmUgc3VjY2VlZHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29lcmNpb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGFzc2VydCh0eXBlc1tuYW1lXSwgbmFtZSk7XG5cbiAgICAgICAgaWYgKChuYW1lID09PSAndG8tYm9vbGVhbicgfHwgbmFtZSA9PT0gJ3RvLXN0cmluZycpICYmIGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbbmFtZV07XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29lcmNpb24odHlwZSwgcGFyc2VkKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGxldCBpbnB1dDtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGN0eC5wYXJzZUNvbG9yKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDMgfHwgaW5wdXQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBgSW52YWxpZCByYmdhIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoaW5wdXQpfTogZXhwZWN0ZWQgYW4gYXJyYXkgY29udGFpbmluZyBlaXRoZXIgdGhyZWUgb3IgZm91ciBudW1lcmljIHZhbHVlcy5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZVJHQkEoaW5wdXRbMF0sIGlucHV0WzFdLCBpbnB1dFsyXSwgaW5wdXRbM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IoKGlucHV0WzBdOiBhbnkpIC8gMjU1LCAoaW5wdXRbMV06IGFueSkgLyAyNTUsIChpbnB1dFsyXTogYW55KSAvIDI1NSwgKGlucHV0WzNdOiBhbnkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IgfHwgYENvdWxkIG5vdCBwYXJzZSBjb2xvciBmcm9tIHZhbHVlICcke3R5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IFN0cmluZyhKU09OLnN0cmluZ2lmeShpbnB1dCkpfSdgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSB0byBudW1iZXIuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBleHBsaWNpdCAndG8tZm9ybWF0dGVkJyBidXQgdGhpcyBjb2VyY2lvbiBjYW4gYmUgaW1wbGljaXRseVxuICAgICAgICAgICAgLy8gY3JlYXRlZCBieSBwcm9wZXJ0aWVzIHRoYXQgZXhwZWN0IHRoZSAnZm9ybWF0dGVkJyB0eXBlLlxuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoYXJnID0+IGFyZy5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnZm9ybWF0dGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKFt7Y29udGVudDogdGhpcy5hcmdzWzBdLCBzY2FsZTogbnVsbCwgZm9udDogbnVsbCwgdGV4dENvbG9yOiBudWxsfV0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VFeHByZXNzaW9uKHRoaXMuYXJnc1swXSkuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW2B0by0ke3RoaXMudHlwZS5raW5kfWBdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZXJjaW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIHtHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlLCBGZWF0dXJlU3RhdGV9IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuXG5jb25zdCBnZW9tZXRyeVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5jbGFzcyBFdmFsdWF0aW9uQ29udGV4dCB7XG4gICAgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcztcbiAgICBmZWF0dXJlOiA/RmVhdHVyZTtcbiAgICBmZWF0dXJlU3RhdGU6ID9GZWF0dXJlU3RhdGU7XG4gICAgZm9ybWF0dGVkU2VjdGlvbjogP0Zvcm1hdHRlZFNlY3Rpb247XG4gICAgYXZhaWxhYmxlSW1hZ2VzOiA/QXJyYXk8c3RyaW5nPjtcbiAgICBjYW5vbmljYWw6ID9DYW5vbmljYWxUaWxlSUQ7XG5cbiAgICBfcGFyc2VDb2xvckNhY2hlOiB7W186IHN0cmluZ106ID9Db2xvcn07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxzID0gKG51bGw6IGFueSk7XG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmVhdHVyZVN0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtYXR0ZWRTZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGFyc2VDb2xvckNhY2hlID0ge307XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSW1hZ2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBudWxsO1xuICAgIH1cblxuICAgIGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdpZCcgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZW9tZXRyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyB0eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGUgPT09ICdudW1iZXInID8gZ2VvbWV0cnlUeXBlc1t0aGlzLmZlYXR1cmUudHlwZV0gOiB0aGlzLmZlYXR1cmUudHlwZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2VvbWV0cnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgJ2dlb21ldHJ5JyBpbiB0aGlzLmZlYXR1cmUgPyB0aGlzLmZlYXR1cmUuZ2VvbWV0cnkgOiBudWxsO1xuICAgIH1cblxuICAgIGNhbm9uaWNhbElEKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWw7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiB0aGlzLmZlYXR1cmUucHJvcGVydGllcyB8fCB7fTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbG9yKGlucHV0OiBzdHJpbmcpOiA/Q29sb3Ige1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcGFyc2VDb2xvckNhY2hlW2lucHV0XTtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICAgIGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF0gPSBDb2xvci5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2YWx1YXRpb25Db250ZXh0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt0b1N0cmluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJ5fSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFZhcmFyZ3MgPSB7fCB0eXBlOiBUeXBlIHx9O1xudHlwZSBTaWduYXR1cmUgPSBBcnJheTxUeXBlPiB8IFZhcmFyZ3M7XG50eXBlIEV2YWx1YXRlID0gKEV2YWx1YXRpb25Db250ZXh0LCBBcnJheTxFeHByZXNzaW9uPikgPT4gVmFsdWU7XG50eXBlIERlZmluaXRpb24gPSBbVHlwZSwgU2lnbmF0dXJlLCBFdmFsdWF0ZV0gfFxuICAgIHt8dHlwZTogVHlwZSwgb3ZlcmxvYWRzOiBBcnJheTxbU2lnbmF0dXJlLCBFdmFsdWF0ZV0+fH07XG5cbmNsYXNzIENvbXBvdW5kRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBUeXBlO1xuICAgIF9ldmFsdWF0ZTogRXZhbHVhdGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBzdGF0aWMgZGVmaW5pdGlvbnM6IHtbXzogc3RyaW5nXTogRGVmaW5pdGlvbiB9O1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlLCBldmFsdWF0ZTogRXZhbHVhdGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlID0gZXZhbHVhdGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUoY3R4LCB0aGlzLmFyZ3MpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5hbWVdLmNvbmNhdCh0aGlzLmFyZ3MubWFwKGFyZyA9PiBhcmcuc2VyaWFsaXplKCkpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgY29uc3Qgb3A6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zW29wXTtcbiAgICAgICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBleHByZXNzaW9uIFwiJHtvcH1cIi4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyBjaGVjayBhcmd1bWVudCB0eXBlcyBhZ2FpbnN0IGVhY2ggc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIGRlZmluaXRpb25bMF0gOiBkZWZpbml0aW9uLnR5cGU7XG5cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlT3ZlcmxvYWRzID0gQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSA/XG4gICAgICAgICAgICBbW2RlZmluaXRpb25bMV0sIGRlZmluaXRpb25bMl1dXSA6XG4gICAgICAgICAgICBkZWZpbml0aW9uLm92ZXJsb2FkcztcblxuICAgICAgICBjb25zdCBvdmVybG9hZHMgPSBhdmFpbGFibGVPdmVybG9hZHMuZmlsdGVyKChbc2lnbmF0dXJlXSkgPT4gKFxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSB8fCAvLyB2YXJhZ3NcbiAgICAgICAgICAgIHNpZ25hdHVyZS5sZW5ndGggPT09IGFyZ3MubGVuZ3RoIC0gMSAvLyBjb3JyZWN0IHBhcmFtIGNvdW50XG4gICAgICAgICkpO1xuXG4gICAgICAgIGxldCBzaWduYXR1cmVDb250ZXh0OiBQYXJzaW5nQ29udGV4dCA9IChudWxsOiBhbnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhcmFtcywgZXZhbHVhdGVdIG9mIG92ZXJsb2Fkcykge1xuICAgICAgICAgICAgLy8gVXNlIGEgZnJlc2ggY29udGV4dCBmb3IgZWFjaCBhdHRlbXB0ZWQgc2lnbmF0dXJlIHNvIHRoYXQsIGlmXG4gICAgICAgICAgICAvLyB3ZSBldmVudHVhbGx5IHN1Y2NlZWQsIHdlIGhhdmVuJ3QgcG9sbHV0ZWQgYGNvbnRleHQuZXJyb3JzYC5cbiAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQgPSBuZXcgUGFyc2luZ0NvbnRleHQoY29udGV4dC5yZWdpc3RyeSwgY29udGV4dC5wYXRoLCBudWxsLCBjb250ZXh0LnNjb3BlKTtcblxuICAgICAgICAgICAgLy8gRmlyc3QgcGFyc2UgYWxsIHRoZSBhcmdzLCBwb3RlbnRpYWxseSBjb2VyY2luZyB0byB0aGVcbiAgICAgICAgICAgIC8vIHR5cGVzIGV4cGVjdGVkIGJ5IHRoaXMgb3ZlcmxvYWQuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzOiBBcnJheTxFeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICAgICAgbGV0IGFyZ1BhcnNlRmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpIC0gMV0gOlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudHlwZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHNpZ25hdHVyZUNvbnRleHQucGFyc2UoYXJnLCAxICsgcGFyc2VkQXJncy5sZW5ndGgsIGV4cGVjdGVkVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnUGFyc2VGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyc2VkQXJncy5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnUGFyc2VGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBjb2VyY2UgYXJncyBvZiB0aGlzIG92ZXJsb2FkIHRvIGV4cGVjdGVkIHR5cGUsIG1vdmVcbiAgICAgICAgICAgICAgICAvLyBvbiB0byBuZXh0IG9uZS5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSBwYXJzZWRBcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVDb250ZXh0LmVycm9yKGBFeHBlY3RlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7cGFyc2VkQXJncy5sZW5ndGh9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZWRBcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBwYXJhbXNbaV0gOiBwYXJhbXMudHlwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBwYXJzZWRBcmdzW2ldO1xuICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuY29uY2F0KGkgKyAxKS5jaGVja1N1YnR5cGUoZXhwZWN0ZWQsIGFyZy50eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNpZ25hdHVyZUNvbnRleHQuZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRFeHByZXNzaW9uKG9wLCB0eXBlLCBldmFsdWF0ZSwgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoIXNpZ25hdHVyZUNvbnRleHQgfHwgc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgaWYgKG92ZXJsb2Fkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goLi4uc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBvdmVybG9hZHMubGVuZ3RoID8gb3ZlcmxvYWRzIDogYXZhaWxhYmxlT3ZlcmxvYWRzO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGV4cGVjdGVkXG4gICAgICAgICAgICAgICAgLm1hcCgoW3BhcmFtc10pID0+IHN0cmluZ2lmeVNpZ25hdHVyZShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgfCAnKTtcblxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVHlwZXMgPSBbXTtcbiAgICAgICAgICAgIC8vIEZvciBlcnJvciBtZXNzYWdlLCByZS1wYXJzZSBhcmd1bWVudHMgd2l0aG91dCB0cnlpbmcgdG9cbiAgICAgICAgICAgIC8vIGFwcGx5IGFueSBjb2VyY2lvbnNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgMSArIGFjdHVhbFR5cGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVzLnB1c2godG9TdHJpbmcocGFyc2VkLnR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBvZiB0eXBlICR7c2lnbmF0dXJlc30sIGJ1dCBmb3VuZCAoJHthY3R1YWxUeXBlcy5qb2luKCcsICcpfSkgaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyByZWdpc3RlcihcbiAgICAgICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeSxcbiAgICAgICAgZGVmaW5pdGlvbnM6IHtbXzogc3RyaW5nXTogRGVmaW5pdGlvbiB9XG4gICAgKSB7XG4gICAgICAgIGFzc2VydCghQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zKTtcbiAgICAgICAgQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkZWZpbml0aW9ucykge1xuICAgICAgICAgICAgcmVnaXN0cnlbbmFtZV0gPSBDb21wb3VuZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSkge1xuICAgICAgICByZXR1cm4gYCgke3NpZ25hdHVyZS5tYXAodG9TdHJpbmcpLmpvaW4oJywgJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAoJHt0b1N0cmluZyhzaWduYXR1cmUudHlwZSl9Li4uKWA7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb3VuZEV4cHJlc3Npb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1N0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBDb2xsYXRvciBmcm9tICcuLi90eXBlcy9jb2xsYXRvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBjYXNlU2Vuc2l0aXZlOiBFeHByZXNzaW9uO1xuICAgIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBFeHByZXNzaW9uLCBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENvbGxhdG9yVHlwZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlID0gZGlhY3JpdGljU2Vuc2l0aXZlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gY29udGV4dC5wYXJzZShcbiAgICAgICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpYWNyaXRpY1NlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddLCAxLCBCb29sZWFuVHlwZSk7XG4gICAgICAgIGlmICghZGlhY3JpdGljU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3JFeHByZXNzaW9uKGNhc2VTZW5zaXRpdmUsIGRpYWNyaXRpY1NlbnNpdGl2ZSwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3IodGhpcy5jYXNlU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5jYXNlU2Vuc2l0aXZlKTtcbiAgICAgICAgZm4odGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIC8vIFRlY2huaWNhbGx5IHRoZSBzZXQgb2YgcG9zc2libGUgb3V0cHV0cyBpcyB0aGUgY29tYmluYXRvcmljIHNldCBvZiBDb2xsYXRvcnMgcHJvZHVjZWRcbiAgICAgICAgLy8gYnkgYWxsIHBvc3NpYmxlIG91dHB1dHMgb2YgbG9jYWxlL2Nhc2VTZW5zaXRpdmUvZGlhY3JpdGljU2Vuc2l0aXZlXG4gICAgICAgIC8vIEJ1dCBmb3IgdGhlIHByaW1hcnkgdXNlIG9mIENvbGxhdG9ycyBpbiBjb21wYXJpc29uIG9wZXJhdG9ycywgd2UgaWdub3JlIHRoZSBDb2xsYXRvcidzXG4gICAgICAgIC8vIHBvc3NpYmxlIG91dHB1dHMgYW55d2F5LCBzbyB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBsZWF2aW5nIHRoaXMgZmFsc2UgZm9yIG5vdy5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICBvcHRpb25zWydjYXNlLXNlbnNpdGl2ZSddID0gdGhpcy5jYXNlU2Vuc2l0aXZlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPSB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBvcHRpb25zWydsb2NhbGUnXSA9IHRoaXMubG9jYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJjb2xsYXRvclwiLCBvcHRpb25zXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2lzVmFsdWV9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHtCb29sZWFuVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTiwgR2VvSlNPTlBvbHlnb24sIEdlb0pTT05NdWx0aVBvbHlnb259IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbnR5cGUgR2VvSlNPTlBvbHlnb25zID18IEdlb0pTT05Qb2x5Z29uIHwgR2VvSlNPTk11bHRpUG9seWdvbjtcblxuLy8gbWluWCwgbWluWSwgbWF4WCwgbWF4WVxudHlwZSBCQm94ID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5jb25zdCBFWFRFTlQgPSA4MTkyO1xuXG5mdW5jdGlvbiB1cGRhdGVCQm94KGJib3g6IEJCb3gsIGNvb3JkOiBQb2ludCkge1xuICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBjb29yZFswXSk7XG4gICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIGNvb3JkWzFdKTtcbiAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgY29vcmRbMF0pO1xuICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBjb29yZFsxXSk7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWWZyb21MYXQobGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCAtICgxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSkpKSAvIDM2MDtcbn1cblxuZnVuY3Rpb24gYm94V2l0aGluQm94KGJib3gxOiBCQm94LCBiYm94MjogQkJveCkge1xuICAgIGlmIChiYm94MVswXSA8PSBiYm94MlswXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsyXSA+PSBiYm94MlsyXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsxXSA8PSBiYm94MlsxXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVszXSA+PSBiYm94MlszXSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlQ29vcmRpbmF0ZXMocCwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCB4ID0gbWVyY2F0b3JYZnJvbUxuZyhwWzBdKTtcbiAgICBjb25zdCB5ID0gbWVyY2F0b3JZZnJvbUxhdChwWzFdKTtcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcbiAgICByZXR1cm4gW01hdGgucm91bmQoeCAqIHRpbGVzQXRab29tICogRVhURU5UKSwgTWF0aC5yb3VuZCh5ICogdGlsZXNBdFpvb20gKiBFWFRFTlQpXTtcbn1cblxuZnVuY3Rpb24gb25Cb3VuZGFyeShwLCBwMSwgcDIpIHtcbiAgICBjb25zdCB4MSA9IHBbMF0gLSBwMVswXTtcbiAgICBjb25zdCB5MSA9IHBbMV0gLSBwMVsxXTtcbiAgICBjb25zdCB4MiA9IHBbMF0gLSBwMlswXTtcbiAgICBjb25zdCB5MiA9IHBbMV0gLSBwMlsxXTtcbiAgICByZXR1cm4gKHgxICogeTIgLSB4MiAqIHkxID09PSAwKSAmJiAoeDEgKiB4MiA8PSAwKSAmJiAoeTEgKiB5MiA8PSAwKTtcbn1cblxuZnVuY3Rpb24gcmF5SW50ZXJzZWN0KHAsIHAxLCBwMikge1xuICAgIHJldHVybiAoKHAxWzFdID4gcFsxXSkgIT09IChwMlsxXSA+IHBbMV0pKSAmJiAocFswXSA8IChwMlswXSAtIHAxWzBdKSAqIChwWzFdIC0gcDFbMV0pIC8gKHAyWzFdIC0gcDFbMV0pICsgcDFbMF0pO1xufVxuXG4vLyByYXkgY2FzdGluZyBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBpZiBwb2ludCBpcyBpbiBwb2x5Z29uXG5mdW5jdGlvbiBwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHJpbmdzKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcmluZ3NbaV07XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW4yID0gcmluZy5sZW5ndGg7IGogPCBsZW4yIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBpZiAob25Cb3VuZGFyeShwb2ludCwgcmluZ1tqXSwgcmluZ1tqICsgMV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmF5SW50ZXJzZWN0KHBvaW50LCByaW5nW2pdLCByaW5nW2ogKyAxXSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuZnVuY3Rpb24gcG9pbnRXaXRoaW5Qb2x5Z29ucyhwb2ludCwgcG9seWdvbnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGVycCh2MSwgdjIpIHtcbiAgICByZXR1cm4gKHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdKTtcbn1cblxuLy8gY2hlY2sgaWYgcDEgYW5kIHAyIGFyZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2YgbGluZSBzZWdtZW50IHExLT5xMlxuZnVuY3Rpb24gIHR3b1NpZGVkKHAxLCBwMiwgcTEsIHEyKSB7XG4gICAgLy8gcTEtPnAxICh4MSwgeTEpLCBxMS0+cDIgKHgyLCB5MiksIHExLT5xMiAoeDMsIHkzKVxuICAgIGNvbnN0IHgxID0gcDFbMF0gLSBxMVswXTtcbiAgICBjb25zdCB5MSA9IHAxWzFdIC0gcTFbMV07XG4gICAgY29uc3QgeDIgPSBwMlswXSAtIHExWzBdO1xuICAgIGNvbnN0IHkyID0gcDJbMV0gLSBxMVsxXTtcbiAgICBjb25zdCB4MyA9IHEyWzBdIC0gcTFbMF07XG4gICAgY29uc3QgeTMgPSBxMlsxXSAtIHExWzFdO1xuICAgIGNvbnN0IGRldDEgPSAoeDEgKiB5MyAtIHgzICogeTEpO1xuICAgIGNvbnN0IGRldDIgPSAgKHgyICogeTMgLSB4MyAqIHkyKTtcbiAgICBpZiAoKGRldDEgPiAwICYmIGRldDIgPCAwKSB8fCAoZGV0MSA8IDAgJiYgZGV0MiA+IDApKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBhLCBiIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQxLCBjIGFuZCBkIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQyXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0TGluZShhLCBiLCBjLCBkKSB7XG4gICAgLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGFyZSBwYXJhbGxlbCBvciBub3RcbiAgICAvLyBwcmVjb25kaXRpb24gaXMgZW5kIHBvaW50IGEsIGIgaXMgaW5zaWRlIHBvbHlnb24sIGlmIGxpbmUgYS0+YiBpc1xuICAgIC8vIHBhcmFsbGVsIHRvIHBvbHlnb24gZWRnZSBjLT5kLCB0aGVuIGEtPmIgd29uJ3QgaW50ZXJzZWN0IHdpdGggYy0+ZFxuICAgIGNvbnN0IHZlY3RvclAgPSBbYlswXSAtIGFbMF0sIGJbMV0gLSBhWzFdXTtcbiAgICBjb25zdCB2ZWN0b3JRID0gW2RbMF0gLSBjWzBdLCBkWzFdIC0gY1sxXV07XG4gICAgaWYgKHBlcnAodmVjdG9yUSwgdmVjdG9yUCkgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIElmIGxpbmVzIGFyZSBpbnRlcnNlY3Rpbmcgd2l0aCBlYWNoIG90aGVyLCB0aGUgcmVsYXRpdmUgbG9jYXRpb24gc2hvdWxkIGJlOlxuICAgIC8vIGEgYW5kIGIgbGllIGluIGRpZmZlcmVudCBzaWRlcyBvZiBzZWdtZW50IGMtPmRcbiAgICAvLyBjIGFuZCBkIGxpZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2Ygc2VnbWVudCBhLT5iXG4gICAgaWYgKHR3b1NpZGVkKGEsIGIsIGMsIGQpICYmIHR3b1NpZGVkKGMsIGQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RQb2x5Z29uKHAxLCBwMiwgcG9seWdvbikge1xuICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBldmVyeSBlZGdlIG9mIHRoZSByaW5nXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmluZy5sZW5ndGggLSAxOyArK2opIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW50ZXJzZWN0TGluZShwMSwgcDIsIHJpbmdbal0sIHJpbmdbaiArIDFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZVN0cmluZ1dpdGhpblBvbHlnb24obGluZSwgcG9seWdvbikge1xuICAgIC8vIEZpcnN0LCBjaGVjayBpZiBnZW9tZXRyeSBwb2ludHMgb2YgbGluZSBzZWdtZW50cyBhcmUgYWxsIGluc2lkZSBwb2x5Z29uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICghcG9pbnRXaXRoaW5Qb2x5Z29uKGxpbmVbaV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIGNoZWNrIGlmIHRoZXJlIGlzIGxpbmUgc2VnbWVudCBpbnRlcnNlY3RpbmcgcG9seWdvbiBlZGdlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpZiAobGluZUludGVyc2VjdFBvbHlnb24obGluZVtpXSwgbGluZVtpICsgMV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29ucyhsaW5lLCBwb2x5Z29ucykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb24oY29vcmRpbmF0ZXMsIGJib3gsIGNhbm9uaWNhbCkge1xuICAgIGNvbnN0IHBvbHlnb24gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY29vcmQgPSBnZXRUaWxlQ29vcmRpbmF0ZXMoY29vcmRpbmF0ZXNbaV1bal0sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICB1cGRhdGVCQm94KGJib3gsIGNvb3JkKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChjb29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcG9seWdvbi5wdXNoKHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcG9seWdvbjtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb25zKGNvb3JkaW5hdGVzLCBiYm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCBwb2x5Z29ucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IGdldFRpbGVQb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBiYm94LCBjYW5vbmljYWwpO1xuICAgICAgICBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgIH1cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvaW50KHAsIGJib3gsIHBvbHlCQm94LCB3b3JsZFNpemUpIHtcbiAgICBpZiAocFswXSA8IHBvbHlCQm94WzBdIHx8IHBbMF0gPiBwb2x5QkJveFsyXSkge1xuICAgICAgICBjb25zdCBoYWxmV29ybGRTaXplID0gd29ybGRTaXplICogMC41O1xuICAgICAgICBsZXQgc2hpZnQgPSAocFswXSAtIHBvbHlCQm94WzBdID4gaGFsZldvcmxkU2l6ZSkgPyAtd29ybGRTaXplIDogKHBvbHlCQm94WzBdIC0gcFswXSA+IGhhbGZXb3JsZFNpemUpID8gd29ybGRTaXplIDogMDtcbiAgICAgICAgaWYgKHNoaWZ0ID09PSAwKSB7XG4gICAgICAgICAgICBzaGlmdCA9IChwWzBdIC0gcG9seUJCb3hbMl0gPiBoYWxmV29ybGRTaXplKSA/IC13b3JsZFNpemUgOiAocG9seUJCb3hbMl0gLSBwWzBdID4gaGFsZldvcmxkU2l6ZSkgPyB3b3JsZFNpemUgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHBbMF0gKz0gc2hpZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUJCb3goYmJveCwgcCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0QkJveChiYm94KSB7XG4gICAgYmJveFswXSA9IGJib3hbMV0gPSBJbmZpbml0eTtcbiAgICBiYm94WzJdID0gYmJveFszXSA9IC1JbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvaW50cyhnZW9tZXRyeSwgcG9pbnRCQm94LCBwb2x5QkJveCwgY2Fub25pY2FsKSB7XG4gICAgY29uc3Qgd29ybGRTaXplID0gTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogRVhURU5UO1xuICAgIGNvbnN0IHNoaWZ0cyA9IFtjYW5vbmljYWwueCAqIEVYVEVOVCwgY2Fub25pY2FsLnkgKiBFWFRFTlRdO1xuICAgIGNvbnN0IHRpbGVQb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBvaW50cyBvZiBnZW9tZXRyeSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZVBvaW50KHAsIHBvaW50QkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB0aWxlUG9pbnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVQb2ludHM7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVMaW5lcyhnZW9tZXRyeSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCB3b3JsZFNpemUgPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueikgKiBFWFRFTlQ7XG4gICAgY29uc3Qgc2hpZnRzID0gW2Nhbm9uaWNhbC54ICogRVhURU5ULCBjYW5vbmljYWwueSAqIEVYVEVOVF07XG4gICAgY29uc3QgdGlsZUxpbmVzID0gW107XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgbGluZSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZUJCb3gobGluZUJCb3gsIHApO1xuICAgICAgICAgICAgdGlsZUxpbmUucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aWxlTGluZXMucHVzaCh0aWxlTGluZSk7XG4gICAgfVxuICAgIGlmIChsaW5lQkJveFsyXSAtIGxpbmVCQm94WzBdIDw9IHdvcmxkU2l6ZSAvIDIpIHtcbiAgICAgICAgcmVzZXRCQm94KGxpbmVCQm94KTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIGxpbmUpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2ludChwLCBsaW5lQkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVMaW5lcztcbn1cblxuZnVuY3Rpb24gcG9pbnRzV2l0aGluUG9seWdvbnMoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgcG9seWdvbkdlb21ldHJ5OiBHZW9KU09OUG9seWdvbnMpIHtcbiAgICBjb25zdCBwb2ludEJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbihwb2ludCwgdGlsZVBvbHlnb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb25HZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbnMgPSBnZXRUaWxlUG9seWdvbnMocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbnMocG9pbnQsIHRpbGVQb2x5Z29ucykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIHBvbHlnb25HZW9tZXRyeTogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgY29uc3QgbGluZUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZUxpbmVzID0gZ2V0VGlsZUxpbmVzKGN0eC5nZW9tZXRyeSgpLCBsaW5lQkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KGxpbmVCQm94LCBwb2x5QkJveCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGlsZUxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHRpbGVQb2x5Z29uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgdGlsZVBvbHlnb25zID0gZ2V0VGlsZVBvbHlnb25zKHBvbHlnb25HZW9tZXRyeS5jb29yZGluYXRlcywgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lcyA9IGdldFRpbGVMaW5lcyhjdHguZ2VvbWV0cnkoKSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBpZiAoIWJveFdpdGhpbkJveChsaW5lQkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgaWYgKCFsaW5lU3RyaW5nV2l0aGluUG9seWdvbnMobGluZSwgdGlsZVBvbHlnb25zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5jbGFzcyBXaXRoaW4gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGdlb2pzb246IEdlb0pTT05cbiAgICBnZW9tZXRyaWVzOiBHZW9KU09OUG9seWdvbnM7XG5cbiAgICBjb25zdHJ1Y3RvcihnZW9qc29uOiBHZW9KU09OLCBnZW9tZXRyaWVzOiBHZW9KU09OUG9seWdvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgIHRoaXMuZ2VvanNvbiA9IGdlb2pzb247XG4gICAgICAgIHRoaXMuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgaWYgKGlzVmFsdWUoYXJnc1sxXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb24gPSAoYXJnc1sxXTogT2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChnZW9qc29uLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdlb2pzb24uZmVhdHVyZXNbaV0uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXRoaW4oZ2VvanNvbiwgZ2VvanNvbi5mZWF0dXJlc1tpXS5nZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdlb2pzb24udHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdlb2pzb24uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aGluKGdlb2pzb24sIGdlb2pzb24uZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvanNvbi50eXBlICA9PT0gJ1BvbHlnb24nIHx8IGdlb2pzb24udHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhpbihnZW9qc29uLCBnZW9qc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyB2YWxpZCBnZW9qc29uIG9iamVjdCB0aGF0IGNvbnRhaW5zIHBvbHlnb24gZ2VvbWV0cnkgdHlwZS5gKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChjdHguZ2VvbWV0cnkoKSAhPSBudWxsICYmIGN0eC5jYW5vbmljYWxJRCgpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRzV2l0aGluUG9seWdvbnMoY3R4LCB0aGlzLmdlb21ldHJpZXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eCwgdGhpcy5nZW9tZXRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gW1wid2l0aGluXCIsIHRoaXMuZ2VvanNvbl07XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFdpdGhpbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBXaXRoaW4gZnJvbSAnLi9kZWZpbml0aW9ucy93aXRoaW4uanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5cbmZ1bmN0aW9uIGlzRmVhdHVyZUNvbnN0YW50KGU6IEV4cHJlc3Npb24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoZS5uYW1lID09PSAnZ2V0JyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnZmVhdHVyZS1zdGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLm5hbWUgPT09ICdoYXMnICYmIGUuYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ3Byb3BlcnRpZXMnIHx8XG4gICAgICAgICAgICBlLm5hbWUgPT09ICdnZW9tZXRyeS10eXBlJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnaWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eZmlsdGVyLS8udGVzdChlLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIFdpdGhpbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoYXJnKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNTdGF0ZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZTogRXhwcmVzc2lvbiwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmIHByb3BlcnRpZXMuaW5kZXhPZihlLm5hbWUpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICYmICFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoYXJnLCBwcm9wZXJ0aWVzKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7aXNGZWF0dXJlQ29uc3RhbnQsIGlzR2xvYmFsUHJvcGVydHlDb25zdGFudCwgaXNTdGF0ZUNvbnN0YW50fTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbmNsYXNzIFZhciBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgYm91bmRFeHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGJvdW5kRXhwcmVzc2lvbi50eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmJvdW5kRXhwcmVzc2lvbiA9IGJvdW5kRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIgfHwgdHlwZW9mIGFyZ3NbMV0gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghY29udGV4dC5zY29wZS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIHZhcmlhYmxlIFwiJHtuYW1lfVwiLiBNYWtlIHN1cmUgXCIke25hbWV9XCIgaGFzIGJlZW4gYm91bmQgaW4gYW4gZW5jbG9zaW5nIFwibGV0XCIgZXhwcmVzc2lvbiBiZWZvcmUgdXNpbmcgaXQuYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFZhcihuYW1lLCBjb250ZXh0LnNjb3BlLmdldChuYW1lKSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcInZhclwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmFyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFNjb3BlIGZyb20gJy4vc2NvcGUuanMnO1xuaW1wb3J0IHtjaGVja1N1YnR5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL3BhcnNpbmdfZXJyb3IuanMnO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9kZWZpbml0aW9ucy9saXRlcmFsLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9kZWZpbml0aW9ucy9hc3NlcnRpb24uanMnO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29lcmNpb24uanMnO1xuaW1wb3J0IEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9kZWZpbml0aW9ucy9jb2xsYXRvci5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vZGVmaW5pdGlvbnMvd2l0aGluLmpzJztcbmltcG9ydCB7aXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50LCBpc0ZlYXR1cmVDb25zdGFudH0gZnJvbSAnLi9pc19jb25zdGFudC5qcyc7XG5pbXBvcnQgVmFyIGZyb20gJy4vZGVmaW5pdGlvbnMvdmFyLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIEV4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBTdGF0ZSBhc3NvY2lhdGVkIHBhcnNpbmcgYXQgYSBnaXZlbiBwb2ludCBpbiBhbiBleHByZXNzaW9uIHRyZWUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYXJzaW5nQ29udGV4dCB7XG4gICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeTtcbiAgICBwYXRoOiBBcnJheTxudW1iZXI+O1xuICAgIGtleTogc3RyaW5nO1xuICAgIHNjb3BlOiBTY29wZTtcbiAgICBlcnJvcnM6IEFycmF5PFBhcnNpbmdFcnJvcj47XG5cbiAgICAvLyBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24uIFByb3ZpZGVkIG9ubHkgdG8gYWxsb3cgRXhwcmVzc2lvblxuICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBpbmZlciBhcmd1bWVudCB0eXBlczogRXhwcmVzc2lvbiNwYXJzZSgpIG5lZWQgbm90XG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHBhcnNlZCBleHByZXNzaW9uIG1hdGNoZXNcbiAgICAvLyBgZXhwZWN0ZWRUeXBlYC5cbiAgICBleHBlY3RlZFR5cGU6ID9UeXBlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnksXG4gICAgICAgIHBhdGg6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICAgICAgZXhwZWN0ZWRUeXBlOiA/VHlwZSxcbiAgICAgICAgc2NvcGU6IFNjb3BlID0gbmV3IFNjb3BlKCksXG4gICAgICAgIGVycm9yczogQXJyYXk8UGFyc2luZ0Vycm9yPiA9IFtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5rZXkgPSBwYXRoLm1hcChwYXJ0ID0+IGBbJHtwYXJ0fV1gKS5qb2luKCcnKTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgdGhpcy5leHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGV4cHIgdGhlIEpTT04gZXhwcmVzc2lvbiB0byBwYXJzZVxuICAgICAqIEBwYXJhbSBpbmRleCB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaW5kZXggaWYgdGhpcyBleHByZXNzaW9uIGlzIGFuIGFyZ3VtZW50IG9mIGEgcGFyZW50IGV4cHJlc3Npb24gdGhhdCdzIGJlaW5nIHBhcnNlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMub21pdFR5cGVBbm5vdGF0aW9ucyBzZXQgdHJ1ZSB0byBvbWl0IGluZmVycmVkIHR5cGUgYW5ub3RhdGlvbnMuICBDYWxsZXIgYmV3YXJlOiB3aXRoIHRoaXMgb3B0aW9uIHNldCwgdGhlIHBhcnNlZCBleHByZXNzaW9uJ3MgdHlwZSB3aWxsIE5PVCBzYXRpc2Z5IGBleHBlY3RlZFR5cGVgIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHdyYXBwZWQgaW4gYW4gaW5mZXJyZWQgYW5ub3RhdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBhcnNlKFxuICAgICAgICBleHByOiBtaXhlZCxcbiAgICAgICAgaW5kZXg/OiBudW1iZXIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT86ID9UeXBlLFxuICAgICAgICBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPixcbiAgICAgICAgb3B0aW9uczoge3R5cGVBbm5vdGF0aW9uPzogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0J30gPSB7fVxuICAgICk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25jYXQoaW5kZXgsIGV4cGVjdGVkVHlwZSwgYmluZGluZ3MpLl9wYXJzZShleHByLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2UoZXhwciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgX3BhcnNlKGV4cHI6IG1peGVkLCBvcHRpb25zOiB7dHlwZUFubm90YXRpb24/OiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnfSk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGV4cHIgPT09IG51bGwgfHwgdHlwZW9mIGV4cHIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBleHByID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGV4cHIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBleHByID0gWydsaXRlcmFsJywgZXhwcl07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhbm5vdGF0ZShwYXJzZWQsIHR5cGUsIHR5cGVBbm5vdGF0aW9uOiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZUFubm90YXRpb24gPT09ICdhc3NlcnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odHlwZSwgW3BhcnNlZF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQW5ub3RhdGlvbiA9PT0gJ2NvZXJjZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvZXJjaW9uKHR5cGUsIFtwYXJzZWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFtdXS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3AgPSBleHByWzBdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBFeHByZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG9wfSBpbnN0ZWFkLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBFeHByID0gdGhpcy5yZWdpc3RyeVtvcF07XG4gICAgICAgICAgICBpZiAoRXhwcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBFeHByLnBhcnNlKGV4cHIsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cGVjdGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuZXhwZWN0ZWRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBwYXJzZWQudHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGV4cGVjdCBhIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBvciBhcnJheSBidXQgaGF2ZSBhIHZhbHVlLCB3cmFwIGl0IGluIGFuIGFzc2VydGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBjb2xvciBvciBmb3JtYXR0ZWQgc3RyaW5nLCBidXQgaGF2ZSBhIHN0cmluZyBvciB2YWx1ZSwgd3JhcCBpdCBpbiBhIGNvZXJjaW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvIHN0YXRpYyB0eXBlLWNoZWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBiZWhhdmlvcnMgYXJlIG92ZXJyaWRhYmxlIGZvcjpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFRoZSBcImNvYWxlc2NlXCIgb3BlcmF0b3IsIHdoaWNoIG5lZWRzIHRvIG9taXQgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFN0cmluZy12YWx1ZWQgcHJvcGVydGllcyAoZS5nLiBgdGV4dC1maWVsZGApLCB3aGVyZSBjb2VyY2lvbiBpcyBtb3JlIGNvbnZlbmllbnQgdGhhbiBhc3NlcnRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ3N0cmluZycgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ251bWJlcicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2Jvb2xlYW4nIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdvYmplY3QnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScpICYmIGFjdHVhbC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdhc3NlcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ2NvbG9yJyB8fCBleHBlY3RlZC5raW5kID09PSAnZm9ybWF0dGVkJyB8fCBleHBlY3RlZC5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpICYmIChhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJyB8fCBhY3R1YWwua2luZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdjb2VyY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYWN0dWFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBleHByZXNzaW9uJ3MgYXJndW1lbnRzIGFyZSBhbGwgbGl0ZXJhbHMsIHdlIGNhbiBldmFsdWF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGltbWVkaWF0ZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBsaXRlcmFsIHZhbHVlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcnNlZC9jb21waWxlZCByZXN1bHQuIEV4cHJlc3Npb25zIHRoYXQgZXhwZWN0IGFuIGltYWdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIG5vdCBiZSByZXNvbHZlZCBoZXJlIHNvIHdlIGNhbiBsYXRlciBnZXQgdGhlIGF2YWlsYWJsZSBpbWFnZXMuXG4gICAgICAgICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgKHBhcnNlZC50eXBlLmtpbmQgIT09ICdyZXNvbHZlZEltYWdlJykgJiYgaXNDb25zdGFudChwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVjID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBuZXcgTGl0ZXJhbChwYXJzZWQudHlwZSwgcGFyc2VkLmV2YWx1YXRlKGVjKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7b3B9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgJ3VuZGVmaW5lZCcgdmFsdWUgaW52YWxpZC4gVXNlIG51bGwgaW5zdGVhZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFtcImxpdGVyYWxcIiwgey4uLn1dIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXksIGJ1dCBmb3VuZCAke3R5cGVvZiBleHByfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBjb250ZXh0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHRoZSBzdWJleHByZXNzaW9uIGF0XG4gICAgICogaW5kZXggYGluZGV4YCwgb3B0aW9uYWxseSBhcHBlbmRpbmcgdG8gJ2xldCcgYmluZGluZyBtYXAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYGVycm9yc2AgcHJvcGVydHksIGludGVuZGVkIGZvciBjb2xsZWN0aW5nIGVycm9ycyB3aGlsZVxuICAgICAqIHBhcnNpbmcsIGlzIGNvcGllZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY2xvbmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uY2F0KGluZGV4OiBudW1iZXIsIGV4cGVjdGVkVHlwZT86ID9UeXBlLCBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPikge1xuICAgICAgICBjb25zdCBwYXRoID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHRoaXMucGF0aC5jb25jYXQoaW5kZXgpIDogdGhpcy5wYXRoO1xuICAgICAgICBjb25zdCBzY29wZSA9IGJpbmRpbmdzID8gdGhpcy5zY29wZS5jb25jYXQoYmluZGluZ3MpIDogdGhpcy5zY29wZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzaW5nQ29udGV4dChcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVzaCBhIHBhcnNpbmcgKG9yIHR5cGUgY2hlY2tpbmcpIGVycm9yIGludG8gdGhlIGB0aGlzLmVycm9yc2BcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ga2V5cyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IgYXQgYSBjaGlsZFxuICAgICAqIG9mIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gYXQgYHRoaXMua2V5YC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGVycm9yKGVycm9yOiBzdHJpbmcsIC4uLmtleXM6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7dGhpcy5rZXl9JHtrZXlzLm1hcChrID0+IGBbJHtrfV1gKS5qb2luKCcnKX1gO1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBQYXJzaW5nRXJyb3Ioa2V5LCBlcnJvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gICAgICogZXJyb3IgbWVzc2FnZSBhbmQgYWxzbyBwdXNoZXMgaXQgdG8gYHRoaXMuZXJyb3JzYC5cbiAgICAgKi9cbiAgICBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBjaGVja1N1YnR5cGUoZXhwZWN0ZWQsIHQpO1xuICAgICAgICBpZiAoZXJyb3IpIHRoaXMuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzaW5nQ29udGV4dDtcblxuZnVuY3Rpb24gaXNDb25zdGFudChleHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbi5ib3VuZEV4cHJlc3Npb24pO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLm5hbWUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbGxhdG9yRXhwcmVzc2lvbikge1xuICAgICAgICAvLyBBbHRob3VnaCB0aGUgcmVzdWx0cyBvZiBhIENvbGxhdG9yIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZ2VuZXJhbGx5IHNob3VsZG4ndCBjaGFuZ2UgYmV0d2VlbiBleGVjdXRpb25zLCB3ZSBjYW4ndCBzZXJpYWxpemUgdGhlbVxuICAgICAgICAvLyBhcyBjb25zdGFudCBleHByZXNzaW9ucyBiZWNhdXNlIHJlc3VsdHMgY2hhbmdlIGJhc2VkIG9uIGVudmlyb25tZW50LlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgV2l0aGluKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1R5cGVBbm5vdGF0aW9uID0gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvZXJjaW9uIHx8XG4gICAgICAgIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBc3NlcnRpb247XG5cbiAgICBsZXQgY2hpbGRyZW5Db25zdGFudCA9IHRydWU7XG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoY2hpbGQgPT4ge1xuICAgICAgICAvLyBXZSBjYW4gX2FsbW9zdF8gYXNzdW1lIHRoYXQgaWYgYGV4cHJlc3Npb25zYCBjaGlsZHJlbiBhcmUgY29uc3RhbnQsXG4gICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gZXZhbHVhdGVkIHRvIExpdGVyYWwgdmFsdWVzIHdoZW4gdGhleVxuICAgICAgICAvLyB3ZXJlIHBhcnNlZC4gIFR5cGUgYW5ub3RhdGlvbnMgYXJlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgdGhleSBtaWdodFxuICAgICAgICAvLyBoYXZlIGJlZW4gaW5mZXJyZWQgYW5kIGFkZGVkIGFmdGVyIGEgY2hpbGQgd2FzIHBhcnNlZC5cblxuICAgICAgICAvLyBTbyB3ZSByZWN1cnNlIGludG8gaXNDb25zdGFudCgpIGZvciB0aGUgY2hpbGRyZW4gb2YgdHlwZSBhbm5vdGF0aW9ucyxcbiAgICAgICAgLy8gYnV0IG90aGVyd2lzZSBzaW1wbHkgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBMaXRlcmFscy5cbiAgICAgICAgaWYgKGlzVHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuQ29uc3RhbnQgPSBjaGlsZHJlbkNvbnN0YW50ICYmIGlzQ29uc3RhbnQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGRyZW5Db25zdGFudCA9IGNoaWxkcmVuQ29uc3RhbnQgJiYgY2hpbGQgaW5zdGFuY2VvZiBMaXRlcmFsO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFjaGlsZHJlbkNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGZWF0dXJlQ29uc3RhbnQoZXhwcmVzc2lvbikgJiZcbiAgICAgICAgaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGV4cHJlc3Npb24sIFsnem9vbScsICdoZWF0bWFwLWRlbnNpdHknLCAnbGluZS1wcm9ncmVzcycsICdza3ktcmFkaWFsLXByb2dyZXNzJywgJ2FjY3VtdWxhdGVkJywgJ2lzLXN1cHBvcnRlZC1zY3JpcHQnXSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4vcnVudGltZV9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG5leHBvcnQgdHlwZSBTdG9wcyA9IEFycmF5PFtudW1iZXIsIEV4cHJlc3Npb25dPjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdG9wIDw9IGlucHV0LCBvciAwIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhzdG9wczogQXJyYXk8bnVtYmVyPiwgaW5wdXQ6IG51bWJlcikge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0b3BzLmxlbmd0aCAtIDE7XG4gICAgbGV0IGxvd2VySW5kZXggPSAwO1xuICAgIGxldCB1cHBlckluZGV4ID0gbGFzdEluZGV4O1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWUsIG5leHRWYWx1ZTtcblxuICAgIHdoaWxlIChsb3dlckluZGV4IDw9IHVwcGVySW5kZXgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gTWF0aC5mbG9vcigobG93ZXJJbmRleCArIHVwcGVySW5kZXgpIC8gMik7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleF07XG4gICAgICAgIG5leHRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPD0gaW5wdXQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IGxhc3RJbmRleCB8fCBpbnB1dCA8IG5leHRWYWx1ZSkgeyAvLyBTZWFyY2ggY29tcGxldGVcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb3dlckluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgPiBpbnB1dCkge1xuICAgICAgICAgICAgdXBwZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKCdJbnB1dCBpcyBub3QgYSBudW1iZXIuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL3N0b3BzLmpzJztcblxuaW1wb3J0IHR5cGUge1N0b3BzfSBmcm9tICcuLi9zdG9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIFN0ZXAgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgbGFiZWxzOiBBcnJheTxudW1iZXI+O1xuICAgIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIHN0b3BzOiBTdG9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2xhYmVsLCBleHByZXNzaW9uXSBvZiBzdG9wcykge1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dHMucHVzaChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIDEgPCA0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYXJncy5sZW5ndGggLSAxKSAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHN0b3BzOiBTdG9wcyA9IFtdO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaSA9PT0gMSA/IC1JbmZpbml0eSA6IGFyZ3NbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbEtleSA9IGk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUtleSA9IGkgKyAxO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwic3RlcFwiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3BzLmxlbmd0aCAmJiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVswXSA+PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwic3RlcFwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgdmFsdWVLZXksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBzdG9wcy5wdXNoKFtsYWJlbCwgcGFyc2VkXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFN0ZXAob3V0cHV0VHlwZSwgaW5wdXQsIHN0b3BzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMubGFiZWxzO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRzO1xuXG4gICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgaWYgKHZhbHVlIDw9IGxhYmVsc1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3BDb3VudCA9IGxhYmVscy5sZW5ndGg7XG4gICAgICAgIGlmICh2YWx1ZSA+PSBsYWJlbHNbc3RvcENvdW50IC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzW3N0b3BDb3VudCAtIDFdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8obGFiZWxzLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBvdXRwdXRzW2luZGV4XS5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShvdXQgPT4gb3V0Lm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wic3RlcFwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMubGFiZWxzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLm91dHB1dHNbaV0uc2VyaWFsaXplKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3RlcDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxuICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1JcbiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBQb3J0ZWQgZnJvbSBXZWJraXRcbiAqIGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVuay9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmhcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXRCZXppZXI7XG5cbmZ1bmN0aW9uIFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgaW1wbGljaXQgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHMgYXJlICgwLDApIGFuZCAoMSwxKS5cbiAgICB0aGlzLmN4ID0gMy4wICogcDF4O1xuICAgIHRoaXMuYnggPSAzLjAgKiAocDJ4IC0gcDF4KSAtIHRoaXMuY3g7XG4gICAgdGhpcy5heCA9IDEuMCAtIHRoaXMuY3ggLSB0aGlzLmJ4O1xuXG4gICAgdGhpcy5jeSA9IDMuMCAqIHAxeTtcbiAgICB0aGlzLmJ5ID0gMy4wICogKHAyeSAtIHAxeSkgLSB0aGlzLmN5O1xuICAgIHRoaXMuYXkgPSAxLjAgLSB0aGlzLmN5IC0gdGhpcy5ieTtcblxuICAgIHRoaXMucDF4ID0gcDF4O1xuICAgIHRoaXMucDF5ID0gcDJ5O1xuICAgIHRoaXMucDJ4ID0gcDJ4O1xuICAgIHRoaXMucDJ5ID0gcDJ5O1xufVxuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgcmV0dXJuICgodGhpcy5heCAqIHQgKyB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVkgPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgodGhpcy5heSAqIHQgKyB0aGlzLmJ5KSAqIHQgKyB0aGlzLmN5KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoMy4wICogdGhpcy5heCAqIHQgKyAyLjAgKiB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgaWYgKHR5cGVvZiBlcHNpbG9uID09PSAndW5kZWZpbmVkJykgZXBzaWxvbiA9IDFlLTY7XG5cbiAgICB2YXIgdDAsIHQxLCB0MiwgeDIsIGk7XG5cbiAgICAvLyBGaXJzdCB0cnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgLS0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgIGZvciAodDIgPSB4LCBpID0gMDsgaSA8IDg7IGkrKykge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpIC0geDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgdDIgPSB0MiAtIHgyIC8gZDI7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiaXNlY3Rpb24gbWV0aG9kIGZvciByZWxpYWJpbGl0eS5cbiAgICB0MCA9IDAuMDtcbiAgICB0MSA9IDEuMDtcbiAgICB0MiA9IHg7XG5cbiAgICBpZiAodDIgPCB0MCkgcmV0dXJuIHQwO1xuICAgIGlmICh0MiA+IHQxKSByZXR1cm4gdDE7XG5cbiAgICB3aGlsZSAodDAgPCB0MSkge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIgLSB4KSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICBpZiAoeCA+IHgyKSB7XG4gICAgICAgICAgICB0MCA9IHQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHQyID0gKHQxIC0gdDApICogMC41ICsgdDA7XG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZS5cbiAgICByZXR1cm4gdDI7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3IuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihmcm9tOiBDb2xvciwgdG86IENvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICBudW1iZXIoZnJvbS5yLCB0by5yLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uZywgdG8uZywgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5hLCB0by5hLCB0KVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmcm9tOiBBcnJheTxudW1iZXI+LCB0bzogQXJyYXk8bnVtYmVyPiwgdDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb20ubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIoZCwgdG9baV0sIHQpO1xuICAgIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3IuanMnO1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZU51bWJlcn0gZnJvbSAnLi9pbnRlcnBvbGF0ZS5qcyc7XG5cbnR5cGUgTEFCQ29sb3IgPSB7XG4gICAgbDogbnVtYmVyLFxuICAgIGE6IG51bWJlcixcbiAgICBiOiBudW1iZXIsXG4gICAgYWxwaGE6IG51bWJlclxufTtcblxudHlwZSBIQ0xDb2xvciA9IHtcbiAgICBoOiBudW1iZXIsXG4gICAgYzogbnVtYmVyLFxuICAgIGw6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFhuID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFluID0gMSxcbiAgICBabiA9IDEuMDg4ODMwLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDEsXG4gICAgZGVnMnJhZCA9IE1hdGguUEkgLyAxODAsXG4gICAgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7XG5cbi8vIFV0aWxpdGllc1xuZnVuY3Rpb24geHl6MmxhYih0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7XG59XG5cbmZ1bmN0aW9uIGxhYjJ4eXoodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIHh5ejJyZ2IoeDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeDogbnVtYmVyKSB7XG4gICAgeCAvPSAyNTU7XG4gICAgcmV0dXJuIHggPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG59XG5cbi8vIExBQlxuZnVuY3Rpb24gcmdiVG9MYWIocmdiQ29sb3I6IENvbG9yKTogTEFCQ29sb3Ige1xuICAgIGNvbnN0IGIgPSByZ2IyeHl6KHJnYkNvbG9yLnIpLFxuICAgICAgICBhID0gcmdiMnh5eihyZ2JDb2xvci5nKSxcbiAgICAgICAgbCA9IHJnYjJ4eXoocmdiQ29sb3IuYiksXG4gICAgICAgIHggPSB4eXoybGFiKCgwLjQxMjQ1NjQgKiBiICsgMC4zNTc1NzYxICogYSArIDAuMTgwNDM3NSAqIGwpIC8gWG4pLFxuICAgICAgICB5ID0geHl6MmxhYigoMC4yMTI2NzI5ICogYiArIDAuNzE1MTUyMiAqIGEgKyAwLjA3MjE3NTAgKiBsKSAvIFluKSxcbiAgICAgICAgeiA9IHh5ejJsYWIoKDAuMDE5MzMzOSAqIGIgKyAwLjExOTE5MjAgKiBhICsgMC45NTAzMDQxICogbCkgLyBabik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsOiAxMTYgKiB5IC0gMTYsXG4gICAgICAgIGE6IDUwMCAqICh4IC0geSksXG4gICAgICAgIGI6IDIwMCAqICh5IC0geiksXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGFiVG9SZ2IobGFiQ29sb3I6IExBQkNvbG9yKTogQ29sb3Ige1xuICAgIGxldCB5ID0gKGxhYkNvbG9yLmwgKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTihsYWJDb2xvci5hKSA/IHkgOiB5ICsgbGFiQ29sb3IuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKGxhYkNvbG9yLmIpID8geSA6IHkgLSBsYWJDb2xvci5iIC8gMjAwO1xuICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7XG4gICAgeCA9IFhuICogbGFiMnh5eih4KTtcbiAgICB6ID0gWm4gKiBsYWIyeHl6KHopO1xuICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgIHh5ejJyZ2IoMy4yNDA0NTQyICogeCAtIDEuNTM3MTM4NSAqIHkgLSAwLjQ5ODUzMTQgKiB6KSwgLy8gRDY1IC0+IHNSR0JcbiAgICAgICAgeHl6MnJnYigtMC45NjkyNjYwICogeCArIDEuODc2MDEwOCAqIHkgKyAwLjA0MTU1NjAgKiB6KSxcbiAgICAgICAgeHl6MnJnYigwLjA1NTY0MzQgKiB4IC0gMC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopLFxuICAgICAgICBsYWJDb2xvci5hbHBoYVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGFiKGZyb206IExBQkNvbG9yLCB0bzogTEFCQ29sb3IsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGw6IGludGVycG9sYXRlTnVtYmVyKGZyb20ubCwgdG8ubCwgdCksXG4gICAgICAgIGE6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYSwgdG8uYSwgdCksXG4gICAgICAgIGI6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYiwgdG8uYiwgdCksXG4gICAgICAgIGFscGhhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmFscGhhLCB0by5hbHBoYSwgdClcbiAgICB9O1xufVxuXG4vLyBIQ0xcbmZ1bmN0aW9uIHJnYlRvSGNsKHJnYkNvbG9yOiBDb2xvcik6IEhDTENvbG9yIHtcbiAgICBjb25zdCB7bCwgYSwgYn0gPSByZ2JUb0xhYihyZ2JDb2xvcik7XG4gICAgY29uc3QgaCA9IE1hdGguYXRhbjIoYiwgYSkgKiByYWQyZGVnO1xuICAgIHJldHVybiB7XG4gICAgICAgIGg6IGggPCAwID8gaCArIDM2MCA6IGgsXG4gICAgICAgIGM6IE1hdGguc3FydChhICogYSArIGIgKiBiKSxcbiAgICAgICAgbCxcbiAgICAgICAgYWxwaGE6IHJnYkNvbG9yLmFcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoY2xUb1JnYihoY2xDb2xvcjogSENMQ29sb3IpOiBDb2xvciB7XG4gICAgY29uc3QgaCA9IGhjbENvbG9yLmggKiBkZWcycmFkLFxuICAgICAgICBjID0gaGNsQ29sb3IuYyxcbiAgICAgICAgbCA9IGhjbENvbG9yLmw7XG4gICAgcmV0dXJuIGxhYlRvUmdiKHtcbiAgICAgICAgbCxcbiAgICAgICAgYTogTWF0aC5jb3MoaCkgKiBjLFxuICAgICAgICBiOiBNYXRoLnNpbihoKSAqIGMsXG4gICAgICAgIGFscGhhOiBoY2xDb2xvci5hbHBoYVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUh1ZShhOiBudW1iZXIsIGI6IG51bWJlciwgdDogbnVtYmVyKSB7XG4gICAgY29uc3QgZCA9IGIgLSBhO1xuICAgIHJldHVybiBhICsgdCAqIChkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVIY2woZnJvbTogSENMQ29sb3IsIHRvOiBIQ0xDb2xvciwgdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogaW50ZXJwb2xhdGVIdWUoZnJvbS5oLCB0by5oLCB0KSxcbiAgICAgICAgYzogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5jLCB0by5jLCB0KSxcbiAgICAgICAgbDogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5sLCB0by5sLCB0KSxcbiAgICAgICAgYWxwaGE6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYWxwaGEsIHRvLmFscGhhLCB0KVxuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBsYWIgPSB7XG4gICAgZm9yd2FyZDogcmdiVG9MYWIsXG4gICAgcmV2ZXJzZTogbGFiVG9SZ2IsXG4gICAgaW50ZXJwb2xhdGU6IGludGVycG9sYXRlTGFiXG59O1xuXG5leHBvcnQgY29uc3QgaGNsID0ge1xuICAgIGZvcndhcmQ6IHJnYlRvSGNsLFxuICAgIHJldmVyc2U6IGhjbFRvUmdiLFxuICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZUhjbFxufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBVbml0QmV6aWVyIGZyb20gJ0BtYXBib3gvdW5pdGJlemllcic7XG5cbmltcG9ydCAqIGFzIGludGVycG9sYXRlIGZyb20gJy4uLy4uL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IHt0b1N0cmluZywgTnVtYmVyVHlwZSwgQ29sb3JUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL3N0b3BzLmpzJztcbmltcG9ydCB7aGNsLCBsYWJ9IGZyb20gJy4uLy4uL3V0aWwvY29sb3Jfc3BhY2VzLmpzJztcblxuaW1wb3J0IHR5cGUge1N0b3BzfSBmcm9tICcuLi9zdG9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIEludGVycG9sYXRpb25UeXBlID1cbiAgICB7IG5hbWU6ICdsaW5lYXInIH0gfFxuICAgIHsgbmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogbnVtYmVyIH0gfFxuICAgIHsgbmFtZTogJ2N1YmljLWJlemllcicsIGNvbnRyb2xQb2ludHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIH07XG5cbmNsYXNzIEludGVycG9sYXRlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJztcbiAgICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBvcGVyYXRvcjogJ2ludGVycG9sYXRlJyB8ICdpbnRlcnBvbGF0ZS1oY2wnIHwgJ2ludGVycG9sYXRlLWxhYicsIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIGludGVycG9sYXRpb24uYmFzZSwgbG93ZXIsIHVwcGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICB0ID0gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbnRlcnBvbGF0aW9uLmNvbnRyb2xQb2ludHM7XG4gICAgICAgICAgICBjb25zdCB1YiA9IG5ldyBVbml0QmV6aWVyKGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pO1xuICAgICAgICAgICAgdCA9IHViLnNvbHZlKGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgMSwgbG93ZXIsIHVwcGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgbGV0IFtvcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIC4uLnJlc3RdID0gYXJncztcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW50ZXJwb2xhdGlvbikgfHwgaW50ZXJwb2xhdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBpbnRlcnBvbGF0aW9uIHR5cGUgZXhwcmVzc2lvbi5gLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGludGVycG9sYXRpb25bMV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBvbmVudGlhbCBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGEgbnVtZXJpYyBiYXNlLmAsIDEsIDEpO1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgICAgICAgIGJhc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xQb2ludHMgPSBpbnRlcnBvbGF0aW9uLnNsaWNlKDEpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHMubGVuZ3RoICE9PSA0IHx8XG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50cy5zb21lKHQgPT4gdHlwZW9mIHQgIT09ICdudW1iZXInIHx8IHQgPCAwIHx8IHQgPiAxKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0N1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLicsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdjdWJpYy1iZXppZXInLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHM6IChjb250cm9sUG9pbnRzOiBhbnkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlICR7U3RyaW5nKGludGVycG9sYXRpb25bMF0pfWAsIDEsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gMSA8IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhcmdzLmxlbmd0aCAtIDEpICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gY29udGV4dC5wYXJzZShpbnB1dCwgMiwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHN0b3BzOiBTdG9wcyA9IFtdO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGlmIChvcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWhjbCcgfHwgb3BlcmF0b3IgPT09ICdpbnRlcnBvbGF0ZS1sYWInKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gQ29sb3JUeXBlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByZXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0W2kgKyAxXTtcblxuICAgICAgICAgICAgY29uc3QgbGFiZWxLZXkgPSBpICsgMztcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gaSArIDQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3BzLmxlbmd0aCAmJiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVswXSA+PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UodmFsdWUsIHZhbHVlS2V5LCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgc3RvcHMucHVzaChbbGFiZWwsIHBhcnNlZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG91dHB1dFR5cGUua2luZCAhPT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIG91dHB1dFR5cGUua2luZCAhPT0gJ2NvbG9yJyAmJlxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICBvdXRwdXRUeXBlLmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICAgICBvdXRwdXRUeXBlLml0ZW1UeXBlLmtpbmQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dFR5cGUuTiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVHlwZSAke3RvU3RyaW5nKG91dHB1dFR5cGUpfSBpcyBub3QgaW50ZXJwb2xhdGFibGUuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRlKG91dHB1dFR5cGUsIChvcGVyYXRvcjogYW55KSwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIHN0b3BzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMubGFiZWxzO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRzO1xuXG4gICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgaWYgKHZhbHVlIDw9IGxhYmVsc1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3BDb3VudCA9IGxhYmVscy5sZW5ndGg7XG4gICAgICAgIGlmICh2YWx1ZSA+PSBsYWJlbHNbc3RvcENvdW50IC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzW3N0b3BDb3VudCAtIDFdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8obGFiZWxzLCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGxvd2VyID0gbGFiZWxzW2luZGV4XTtcbiAgICAgICAgY29uc3QgdXBwZXIgPSBsYWJlbHNbaW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgdCA9IEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uLCB2YWx1ZSwgbG93ZXIsIHVwcGVyKTtcblxuICAgICAgICBjb25zdCBvdXRwdXRMb3dlciA9IG91dHB1dHNbaW5kZXhdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIGNvbnN0IG91dHB1dFVwcGVyID0gb3V0cHV0c1tpbmRleCArIDFdLmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICdpbnRlcnBvbGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW50ZXJwb2xhdGVbdGhpcy50eXBlLmtpbmQudG9Mb3dlckNhc2UoKV06IGFueSkob3V0cHV0TG93ZXIsIG91dHB1dFVwcGVyLCB0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWhjbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBoY2wucmV2ZXJzZShoY2wuaW50ZXJwb2xhdGUoaGNsLmZvcndhcmQob3V0cHV0TG93ZXIpLCBoY2wuZm9yd2FyZChvdXRwdXRVcHBlciksIHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsYWIucmV2ZXJzZShsYWIuaW50ZXJwb2xhdGUobGFiLmZvcndhcmQob3V0cHV0TG93ZXIpLCBsYWIuZm9yd2FyZChvdXRwdXRVcHBlciksIHQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShvdXQgPT4gb3V0Lm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGxldCBpbnRlcnBvbGF0aW9uO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wibGluZWFyXCJdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbi5uYW1lID09PSAnZXhwb25lbnRpYWwnKSB7XG4gICAgICAgICAgICBpZiAgKHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImxpbmVhclwiXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImV4cG9uZW50aWFsXCIsIHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJjdWJpYy1iZXppZXJcIiBdLmNvbmNhdCh0aGlzLmludGVycG9sYXRpb24uY29udHJvbFBvaW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW3RoaXMub3BlcmF0b3IsIGludGVycG9sYXRpb24sIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsc1tpXSxcbiAgICAgICAgICAgICAgICB0aGlzLm91dHB1dHNbaV0uc2VyaWFsaXplKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSByYXRpbyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gZXhwb25lbnRpYWwgZnVuY3Rpb25cbiAqIHN0b3BzLlxuICogSG93IGl0IHdvcmtzOiBUd28gY29uc2VjdXRpdmUgc3RvcCB2YWx1ZXMgZGVmaW5lIGEgKHNjYWxlZCBhbmQgc2hpZnRlZCkgZXhwb25lbnRpYWwgZnVuY3Rpb24gYGYoeCkgPSBhICogYmFzZV54ICsgYmAsIHdoZXJlIGBiYXNlYCBpcyB0aGUgdXNlci1zcGVjaWZpZWQgYmFzZSxcbiAqIGFuZCBgYWAgYW5kIGBiYCBhcmUgY29uc3RhbnRzIGFmZm9yZGluZyBzdWZmaWNpZW50IGRlZ3JlZXMgb2YgZnJlZWRvbSB0byBmaXRcbiAqIHRoZSBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gc3RvcHMuXG4gKlxuICogSGVyZSdzIGEgYml0IG9mIGFsZ2VicmEgdGhhdCBsZXRzIHVzIGNvbXB1dGUgYGYoeClgIGRpcmVjdGx5IGZyb20gdGhlIHN0b3BcbiAqIHZhbHVlcyB3aXRob3V0IGV4cGxpY2l0bHkgc29sdmluZyBmb3IgYGFgIGFuZCBgYmA6XG4gKlxuICogRmlyc3Qgc3RvcCB2YWx1ZTogYGYoeDApID0geTAgPSBhICogYmFzZV54MCArIGJgXG4gKiBTZWNvbmQgc3RvcCB2YWx1ZTogYGYoeDEpID0geTEgPSBhICogYmFzZV54MSArIGJgXG4gKiA9PiBgeTEgLSB5MCA9IGEoYmFzZV54MSAtIGJhc2VeeDApYFxuICogPT4gYGEgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKWBcbiAqXG4gKiBEZXNpcmVkIHZhbHVlOiBgZih4KSA9IHkgPSBhICogYmFzZV54ICsgYmBcbiAqID0+IGBmKHgpID0geTAgKyBhICogKGJhc2VeeCAtIGJhc2VeeDApYFxuICpcbiAqIEZyb20gdGhlIGFib3ZlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgYGFgIGluIGBhICogKGJhc2VeeCAtIGJhc2VeeDApYCBhbmQgZG8gYVxuICogbGl0dGxlIGFsZ2VicmE6XG4gKiBgYGBcbiAqIGEgKiAoYmFzZV54IC0gYmFzZV54MCkgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKSAqIChiYXNlXnggLSBiYXNlXngwKVxuICogICAgICAgICAgICAgICAgICAgICA9ICh5MSAtIHkwKSAqIChiYXNlXnggLSBiYXNlXngwKSAvIChiYXNlXngxIC0gYmFzZV54MClcbiAqIGBgYFxuICpcbiAqIElmIHdlIGxldCBgKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgYmFzZV54MClgLCB0aGVuIHdlIGhhdmVcbiAqIGBmKHgpID0geTAgKyAoeTEgLSB5MCkgKiByYXRpb2AuICBJbiBvdGhlciB3b3JkcywgYHJhdGlvYCBtYXkgYmUgdHJlYXRlZCBhc1xuICogYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiB0aGUgdHdvIHN0b3BzJyBvdXRwdXQgdmFsdWVzLlxuICpcbiAqIChOb3RlOiBhIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtIGZvciBgcmF0aW9gLFxuICogYChiYXNlXih4LXgwKSAtIDEpIC8gKGJhc2VeKHgxLXgwKSAtIDEpIGAsIGlzIGVxdWl2YWxlbnQsIGJ1dCByZXF1aXJlcyBmZXdlclxuICogZXhwZW5zaXZlIGBNYXRoLnBvdygpYCBvcGVyYXRpb25zLilcbiAqXG4gKiBAcHJpdmF0ZVxuKi9cbmZ1bmN0aW9uIGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgYmFzZSwgbG93ZXJWYWx1ZSwgdXBwZXJWYWx1ZSkge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB1cHBlclZhbHVlIC0gbG93ZXJWYWx1ZTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGlucHV0IC0gbG93ZXJWYWx1ZTtcblxuICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoYmFzZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgLyBkaWZmZXJlbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5wb3coYmFzZSwgcHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgZGlmZmVyZW5jZSkgLSAxKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVycG9sYXRlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge2NoZWNrU3VidHlwZSwgVmFsdWVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgQ29hbGVzY2UgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihcIkV4cGVjdGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIGlmIChleHBlY3RlZFR5cGUgJiYgZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBleHBlY3RlZFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UoYXJnLCAxICsgcGFyc2VkQXJncy5sZW5ndGgsIG91dHB1dFR5cGUsIHVuZGVmaW5lZCwge3R5cGVBbm5vdGF0aW9uOiAnb21pdCd9KTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgcGFyc2VkQXJncy5wdXNoKHBhcnNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KG91dHB1dFR5cGUpO1xuXG4gICAgICAgIC8vIEFib3ZlLCB3ZSBwYXJzZSBhcmd1bWVudHMgd2l0aG91dCBpbmZlcnJlZCB0eXBlIGFubm90YXRpb24gc28gdGhhdFxuICAgICAgICAvLyB0aGV5IGRvbid0IHByb2R1Y2UgYSBydW50aW1lIGVycm9yIGZvciBgbnVsbGAgaW5wdXQsIHdoaWNoIHdvdWxkXG4gICAgICAgIC8vIHByZWVtcHQgdGhlIGRlc2lyZWQgbnVsbC1jb2FsZXNjaW5nIGJlaGF2aW9yLlxuICAgICAgICAvLyBUaHVzLCBpZiBhbnkgb2Ygb3VyIGFyZ3VtZW50cyB3b3VsZCBoYXZlIG5lZWRlZCBhbiBhbm5vdGF0aW9uLCB3ZVxuICAgICAgICAvLyBuZWVkIHRvIHdyYXAgdGhlIGVuY2xvc2luZyBjb2FsZXNjZSBleHByZXNzaW9uIHdpdGggaXQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgbmVlZHNBbm5vdGF0aW9uID0gZXhwZWN0ZWRUeXBlICYmXG4gICAgICAgICAgICBwYXJzZWRBcmdzLnNvbWUoYXJnID0+IGNoZWNrU3VidHlwZShleHBlY3RlZFR5cGUsIGFyZy50eXBlKSk7XG5cbiAgICAgICAgcmV0dXJuIG5lZWRzQW5ub3RhdGlvbiA/XG4gICAgICAgICAgICBuZXcgQ29hbGVzY2UoVmFsdWVUeXBlLCBwYXJzZWRBcmdzKSA6XG4gICAgICAgICAgICBuZXcgQ29hbGVzY2UoKG91dHB1dFR5cGU6IGFueSksIHBhcnNlZEFyZ3MpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGxldCBhcmdDb3VudCA9IDA7XG4gICAgICAgIGxldCByZXF1ZXN0ZWRJbWFnZU5hbWU7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgYXJnQ291bnQrKztcbiAgICAgICAgICAgIHJlc3VsdCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCByZXF1ZXN0ZWQgaW1hZ2UgaW4gYSBjb2FsZXNjZSBzdGF0ZW1lbnRcbiAgICAgICAgICAgIC8vIGlmIGNvYWxlc2NlIGNhbid0IGZpbmQgYSB2YWxpZCBpbWFnZSwgd2UgcmV0dXJuIHRoZSBmaXJzdCBpbWFnZSBuYW1lIHNvIHN0eWxlaW1hZ2VtaXNzaW5nIGNhbiBmaXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UgJiYgIXJlc3VsdC5hdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RlZEltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbWFnZU5hbWUgPSByZXN1bHQubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnQ291bnQgPT09IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVxdWVzdGVkSW1hZ2VOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGFyZyA9PiBhcmcub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJjb2FsZXNjZVwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2FsZXNjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbmNsYXNzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPjtcbiAgICByZXN1bHQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+LCByZXN1bHQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gcmVzdWx0LnR5cGU7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSBbXS5jb25jYXQoYmluZGluZ3MpO1xuICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgIGZuKGJpbmRpbmdbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGZuKHRoaXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYXJnc1tpXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBzdHJpbmcsIGJ1dCBmb3VuZCAke3R5cGVvZiBuYW1lfSBpbnN0ZWFkLmAsIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL1teYS16QS1aMC05X10vLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVmFyaWFibGUgbmFtZXMgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgJ18nLmAsIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRleHQucGFyc2UoYXJnc1tpICsgMV0sIGkgKyAxKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBiaW5kaW5ncy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgY29udGV4dC5leHBlY3RlZFR5cGUsIGJpbmRpbmdzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGV0KGJpbmRpbmdzLCByZXN1bHQpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibGV0XCJdO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBleHByXSBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2gobmFtZSwgZXhwci5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMucmVzdWx0LnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMZXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2FycmF5LCBWYWx1ZVR5cGUsIE51bWJlclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZSwgQXJyYXlUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VmFsdWV9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmNsYXNzIEF0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbmRleDogRXhwcmVzc2lvbjtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGluZGV4OiBFeHByZXNzaW9uLCBpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDMpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBhcnJheShjb250ZXh0LmV4cGVjdGVkVHlwZSB8fCBWYWx1ZVR5cGUpKTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdDogQXJyYXlUeXBlID0gKGlucHV0LnR5cGU6IGFueSk7XG4gICAgICAgIHJldHVybiBuZXcgQXQodC5pdGVtVHlwZSwgaW5kZXgsIGlucHV0KTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKCh0aGlzLmluZGV4LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IEFycmF5PFZhbHVlPik7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPCAwLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPiAke2FycmF5Lmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBNYXRoLmZsb29yKGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZm91bmQgJHtpbmRleH0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheVtpbmRleF07XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmluZGV4KTtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcImF0XCIsIHRoaXMuaW5kZXguc2VyaWFsaXplKCksIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGUsIE51bGxUeXBlLCB0b1N0cmluZywgTnVtYmVyVHlwZSwgaXNWYWxpZFR5cGUsIGlzVmFsaWROYXRpdmVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgSW4gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG5lZWRsZTogRXhwcmVzc2lvbjtcbiAgICBoYXlzdGFjazogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5lZWRsZTogRXhwcmVzc2lvbiwgaGF5c3RhY2s6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgIHRoaXMubmVlZGxlID0gbmVlZGxlO1xuICAgICAgICB0aGlzLmhheXN0YWNrID0gaGF5c3RhY2s7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5lZWRsZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcblxuICAgICAgICBjb25zdCBoYXlzdGFjayA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgVmFsdWVUeXBlKTtcblxuICAgICAgICBpZiAoIW5lZWRsZSB8fCAhaGF5c3RhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFR5cGUobmVlZGxlLnR5cGUsIFtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgTnVsbFR5cGUsIFZhbHVlVHlwZV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyhuZWVkbGUudHlwZSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSW4obmVlZGxlLCBoYXlzdGFjayk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBuZWVkbGUgPSAodGhpcy5uZWVkbGUuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSAodGhpcy5oYXlzdGFjay5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuXG4gICAgICAgIGlmICghaGF5c3RhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKG5lZWRsZSwgWydib29sZWFuJywgJ3N0cmluZycsICdudW1iZXInLCAnbnVsbCddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YobmVlZGxlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKGhheXN0YWNrLCBbJ3N0cmluZycsICdhcnJheSddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaGF5c3RhY2spKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPj0gMDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMubmVlZGxlKTtcbiAgICAgICAgZm4odGhpcy5oYXlzdGFjayk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1wiaW5cIiwgdGhpcy5uZWVkbGUuc2VyaWFsaXplKCksIHRoaXMuaGF5c3RhY2suc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW47XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGUsIE51bGxUeXBlLCB0b1N0cmluZywgTnVtYmVyVHlwZSwgaXNWYWxpZFR5cGUsIGlzVmFsaWROYXRpdmVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgSW5kZXhPZiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmVlZGxlOiBFeHByZXNzaW9uO1xuICAgIGhheXN0YWNrOiBFeHByZXNzaW9uO1xuICAgIGZyb21JbmRleDogP0V4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihuZWVkbGU6IEV4cHJlc3Npb24sIGhheXN0YWNrOiBFeHByZXNzaW9uLCBmcm9tSW5kZXg/OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IE51bWJlclR5cGU7XG4gICAgICAgIHRoaXMubmVlZGxlID0gbmVlZGxlO1xuICAgICAgICB0aGlzLmhheXN0YWNrID0gaGF5c3RhY2s7XG4gICAgICAgIHRoaXMuZnJvbUluZGV4ID0gZnJvbUluZGV4O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAyIHx8ICBhcmdzLmxlbmd0aCA+PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMyBvciA0IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmVlZGxlID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuXG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBWYWx1ZVR5cGUpO1xuXG4gICAgICAgIGlmICghbmVlZGxlIHx8ICFoYXlzdGFjaykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghaXNWYWxpZFR5cGUobmVlZGxlLnR5cGUsIFtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgTnVsbFR5cGUsIFZhbHVlVHlwZV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyhuZWVkbGUudHlwZSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzNdLCAzLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgIGlmICghZnJvbUluZGV4KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhPZihuZWVkbGUsIGhheXN0YWNrLCBmcm9tSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleE9mKG5lZWRsZSwgaGF5c3RhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBuZWVkbGUgPSAodGhpcy5uZWVkbGUuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSAodGhpcy5oYXlzdGFjay5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUobmVlZGxlLCBbJ2Jvb2xlYW4nLCAnc3RyaW5nJywgJ251bWJlcicsICdudWxsJ10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihuZWVkbGUpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUoaGF5c3RhY2ssIFsnc3RyaW5nJywgJ2FycmF5J10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihoYXlzdGFjaykpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZnJvbUluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tSW5kZXggPSAodGhpcy5mcm9tSW5kZXguZXZhbHVhdGUoY3R4KTogbnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSwgZnJvbUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLm5lZWRsZSk7XG4gICAgICAgIGZuKHRoaXMuaGF5c3RhY2spO1xuICAgICAgICBpZiAodGhpcy5mcm9tSW5kZXgpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuZnJvbUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZyb21JbmRleCAhPSBudWxsICYmIHRoaXMuZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMuZnJvbUluZGV4LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIFtcImluZGV4LW9mXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpLCBmcm9tSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJpbmRleC1vZlwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbmRleE9mO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB7VmFsdWVUeXBlLCB0eXBlIFR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbi8vIE1hcCBpbnB1dCBsYWJlbCB2YWx1ZXMgdG8gb3V0cHV0IGV4cHJlc3Npb24gaW5kZXhcbnR5cGUgQ2FzZXMgPSB7W251bWJlciB8IHN0cmluZ106IG51bWJlcn07XG5cbmNsYXNzIE1hdGNoIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbnB1dFR5cGU6IFR5cGU7XG5cbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBjYXNlczogQ2FzZXM7XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG4gICAgb3RoZXJ3aXNlOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXRUeXBlOiBUeXBlLCBvdXRwdXRUeXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgY2FzZXM6IENhc2VzLCBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPiwgb3RoZXJ3aXNlOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuaW5wdXRUeXBlID0gaW5wdXRUeXBlO1xuICAgICAgICB0aGlzLnR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuY2FzZXMgPSBjYXNlcztcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggJSAyICE9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICBsZXQgaW5wdXRUeXBlO1xuICAgICAgICBsZXQgb3V0cHV0VHlwZTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYXNlcyA9IHt9O1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbHMgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW2kgKyAxXTtcblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxhYmVscykpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMgPSBbbGFiZWxzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGFiZWxDb250ZXh0ID0gY29udGV4dC5jb25jYXQoaSk7XG4gICAgICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSBicmFuY2ggbGFiZWwuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2YgbGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBCcmFuY2ggbGFiZWxzIG11c3QgYmUgbnVtYmVycyBvciBzdHJpbmdzLmApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJyAmJiBNYXRoLmFicyhsYWJlbCkgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBCcmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlcnMgbm8gbGFyZ2VyIHRoYW4gJHtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0uYCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicgJiYgTWF0aC5mbG9vcihsYWJlbCkgIT09IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYE51bWVyaWMgYnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXIgdmFsdWVzLmApO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IHR5cGVPZihsYWJlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYWJlbENvbnRleHQuY2hlY2tTdWJ0eXBlKGlucHV0VHlwZSwgdHlwZU9mKGxhYmVsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXNlc1tTdHJpbmcobGFiZWwpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcignQnJhbmNoIGxhYmVscyBtdXN0IGJlIHVuaXF1ZS4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlc1tTdHJpbmcobGFiZWwpXSA9IG91dHB1dHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCBpLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHJlc3VsdC50eXBlO1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgb3RoZXJ3aXNlID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmICghb3RoZXJ3aXNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBhc3NlcnQoaW5wdXRUeXBlICYmIG91dHB1dFR5cGUpO1xuXG4gICAgICAgIGlmIChpbnB1dC50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiYgY29udGV4dC5jb25jYXQoMSkuY2hlY2tTdWJ0eXBlKChpbnB1dFR5cGU6IGFueSksIGlucHV0LnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTWF0Y2goKGlucHV0VHlwZTogYW55KSwgKG91dHB1dFR5cGU6IGFueSksIGlucHV0LCBjYXNlcywgb3V0cHV0cywgb3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gKHR5cGVPZihpbnB1dCkgPT09IHRoaXMuaW5wdXRUeXBlICYmIHRoaXMub3V0cHV0c1t0aGlzLmNhc2VzW2lucHV0XV0pIHx8IHRoaXMub3RoZXJ3aXNlO1xuICAgICAgICByZXR1cm4gb3V0cHV0LmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgdGhpcy5vdXRwdXRzLmZvckVhY2goZm4pO1xuICAgICAgICBmbih0aGlzLm90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShvdXQgPT4gb3V0Lm91dHB1dERlZmluZWQoKSkgJiYgdGhpcy5vdGhlcndpc2Uub3V0cHV0RGVmaW5lZCgpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibWF0Y2hcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgLy8gU29ydCBzbyBzZXJpYWxpemF0aW9uIGhhcyBhbiBhcmJpdHJhcnkgZGVmaW5lZCBvcmRlciwgZXZlbiB0aG91Z2hcbiAgICAgICAgLy8gYnJhbmNoIG9yZGVyIGRvZXNuJ3QgYWZmZWN0IGV2YWx1YXRpb25cbiAgICAgICAgY29uc3Qgc29ydGVkTGFiZWxzID0gT2JqZWN0LmtleXModGhpcy5jYXNlcykuc29ydCgpO1xuXG4gICAgICAgIC8vIEdyb3VwIGJyYW5jaGVzIGJ5IHVuaXF1ZSBtYXRjaCBleHByZXNzaW9uIHRvIHN1cHBvcnQgY29uZGVuc2VkXG4gICAgICAgIC8vIHNlcmlhbGl6YXRpb25zIG9mIHRoZSBmb3JtIFtjYXNlMSwgY2FzZTIsIC4uLl0gLT4gbWF0Y2hFeHByZXNzaW9uXG4gICAgICAgIGNvbnN0IGdyb3VwZWRCeU91dHB1dDogQXJyYXk8W251bWJlciwgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPl0+ID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dExvb2t1cDoge1tpbmRleDogbnVtYmVyXTogbnVtYmVyfSA9IHt9OyAvLyBsb29rdXAgaW5kZXggaW50byBncm91cGVkQnlPdXRwdXQgZm9yIGEgZ2l2ZW4gb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBzb3J0ZWRMYWJlbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gb3V0cHV0TG9va3VwW3RoaXMuY2FzZXNbbGFiZWxdXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyBvdXRwdXQsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBncm91cGVkIGxpc3RcbiAgICAgICAgICAgICAgICBvdXRwdXRMb29rdXBbdGhpcy5jYXNlc1tsYWJlbF1dID0gZ3JvdXBlZEJ5T3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXQucHVzaChbdGhpcy5jYXNlc1tsYWJlbF0sIFtsYWJlbF1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgc2VlbiB0aGlzIGV4cHJlc3Npb24gYmVmb3JlLCBhZGQgdGhlIGxhYmVsIHRvIHRoYXQgb3V0cHV0J3MgZ3JvdXBcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXRbb3V0cHV0SW5kZXhdWzFdLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29lcmNlTGFiZWwgPSAobGFiZWwpID0+IHRoaXMuaW5wdXRUeXBlLmtpbmQgPT09ICdudW1iZXInID8gTnVtYmVyKGxhYmVsKSA6IGxhYmVsO1xuXG4gICAgICAgIGZvciAoY29uc3QgW291dHB1dEluZGV4LCBsYWJlbHNdIG9mIGdyb3VwZWRCeU91dHB1dCkge1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGEgc2luZ2xlIGxhYmVsIG1hdGNoZXMgdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChjb2VyY2VMYWJlbChsYWJlbHNbMF0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgbGl0ZXJhbCBsYWJlbHMgcG9pbnRpbmcgdG8gdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChsYWJlbHMubWFwKGNvZXJjZUxhYmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW291dHB1dEluZGV4XS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3RoZXJ3aXNlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRjaDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtCb29sZWFuVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbnR5cGUgQnJhbmNoZXMgPSBBcnJheTxbRXhwcmVzc2lvbiwgRXhwcmVzc2lvbl0+O1xuXG5jbGFzcyBDYXNlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIGJyYW5jaGVzOiBCcmFuY2hlcztcbiAgICBvdGhlcndpc2U6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBicmFuY2hlczogQnJhbmNoZXMsIG90aGVyd2lzZTogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmJyYW5jaGVzID0gYnJhbmNoZXM7XG4gICAgICAgIHRoaXMub3RoZXJ3aXNlID0gb3RoZXJ3aXNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogP1R5cGU7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmFuY2hlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBCb29sZWFuVHlwZSk7XG4gICAgICAgICAgICBpZiAoIXRlc3QpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGJyYW5jaGVzLnB1c2goW3Rlc3QsIHJlc3VsdF0pO1xuXG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCByZXN1bHQudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG90aGVyd2lzZSA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoIW90aGVyd2lzZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXNzZXJ0KG91dHB1dFR5cGUpO1xuICAgICAgICByZXR1cm4gbmV3IENhc2UoKG91dHB1dFR5cGU6IGFueSksIGJyYW5jaGVzLCBvdGhlcndpc2UpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGVzdCwgZXhwcmVzc2lvbl0gb2YgdGhpcy5icmFuY2hlcykge1xuICAgICAgICAgICAgaWYgKHRlc3QuZXZhbHVhdGUoY3R4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub3RoZXJ3aXNlLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0ZXN0LCBleHByZXNzaW9uXSBvZiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICBmbih0ZXN0KTtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGZuKHRoaXMub3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5icmFuY2hlcy5ldmVyeSgoW18sIG91dF0pID0+IG91dC5vdXRwdXREZWZpbmVkKCkpICYmIHRoaXMub3RoZXJ3aXNlLm91dHB1dERlZmluZWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJjYXNlXCJdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhc2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1ZhbHVlVHlwZSwgTnVtYmVyVHlwZSwgU3RyaW5nVHlwZSwgYXJyYXksIHRvU3RyaW5nLCBpc1ZhbGlkVHlwZSwgaXNWYWxpZE5hdGl2ZVR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBTbGljZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgYmVnaW5JbmRleDogRXhwcmVzc2lvbjtcbiAgICBlbmRJbmRleDogP0V4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgYmVnaW5JbmRleDogRXhwcmVzc2lvbiwgZW5kSW5kZXg/OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5iZWdpbkluZGV4ID0gYmVnaW5JbmRleDtcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4O1xuXG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDIgfHwgIGFyZ3MubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAzIG9yIDQgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgY29uc3QgYmVnaW5JbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgTnVtYmVyVHlwZSk7XG5cbiAgICAgICAgaWYgKCFpbnB1dCB8fCAhYmVnaW5JbmRleCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZShpbnB1dC50eXBlLCBbYXJyYXkoVmFsdWVUeXBlKSwgU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7dG9TdHJpbmcoaW5wdXQudHlwZSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFlbmRJbmRleCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGlucHV0LnR5cGUsIGlucHV0LCBiZWdpbkluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGlucHV0LnR5cGUsIGlucHV0LCBiZWdpbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSAodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuICAgICAgICBjb25zdCBiZWdpbkluZGV4ID0gKHRoaXMuYmVnaW5JbmRleC5ldmFsdWF0ZShjdHgpOiBudW1iZXIpO1xuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUoaW5wdXQsIFsnc3RyaW5nJywgJ2FycmF5J10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKGlucHV0KSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSAodGhpcy5lbmRJbmRleC5ldmFsdWF0ZShjdHgpOiBudW1iZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnNsaWNlKGJlZ2luSW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnB1dC5zbGljZShiZWdpbkluZGV4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICBmbih0aGlzLmJlZ2luSW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCkge1xuICAgICAgICAgICAgZm4odGhpcy5lbmRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCAhPSBudWxsICYmIHRoaXMuZW5kSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmVuZEluZGV4LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIFtcInNsaWNlXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCksIHRoaXMuYmVnaW5JbmRleC5zZXJpYWxpemUoKSwgZW5kSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJzbGljZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpLCB0aGlzLmJlZ2luSW5kZXguc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2xpY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3RvU3RyaW5nLCBWYWx1ZVR5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9hc3NlcnRpb24uanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbnR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gJz09JyB8ICchPScgfCAnPCcgfCAnPicgfCAnPD0nIHwgJz49JyA7XG5cbmZ1bmN0aW9uIGlzQ29tcGFyYWJsZVR5cGUob3A6IENvbXBhcmlzb25PcGVyYXRvciwgdHlwZTogVHlwZSkge1xuICAgIGlmIChvcCA9PT0gJz09JyB8fCBvcCA9PT0gJyE9Jykge1xuICAgICAgICAvLyBlcXVhbGl0eSBvcGVyYXRvclxuICAgICAgICByZXR1cm4gdHlwZS5raW5kID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bGwnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3JkZXJpbmcgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSA9PT0gYjsgfVxuZnVuY3Rpb24gbmVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSAhPT0gYjsgfVxuZnVuY3Rpb24gbHQoY3R4LCBhLCBiKSB7IHJldHVybiBhIDwgYjsgfVxuZnVuY3Rpb24gZ3QoY3R4LCBhLCBiKSB7IHJldHVybiBhID4gYjsgfVxuZnVuY3Rpb24gbHRlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPD0gYjsgfVxuZnVuY3Rpb24gZ3RlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPj0gYjsgfVxuXG5mdW5jdGlvbiBlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPT09IDA7IH1cbmZ1bmN0aW9uIG5lcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiAhZXFDb2xsYXRlKGN0eCwgYSwgYiwgYyk7IH1cbmZ1bmN0aW9uIGx0Q29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA8IDA7IH1cbmZ1bmN0aW9uIGd0Q29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA+IDA7IH1cbmZ1bmN0aW9uIGx0ZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpIDw9IDA7IH1cbmZ1bmN0aW9uIGd0ZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID49IDA7IH1cblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBpbXBsZW1lbnRpbmcgdGhlIHNpZ25hdHVyZXM6XG4gKiAtIChULCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKFQsIHZhbHVlLCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKHZhbHVlLCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqXG4gKiBGb3IgaW5lcXVhbGl0aWVzLCBUIG11c3QgYmUgZWl0aGVyIHZhbHVlLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yID09LyE9LCBpdFxuICogY2FuIGFsc28gYmUgYm9vbGVhbiBvciBudWxsLlxuICpcbiAqIEVxdWFsaXR5IHNlbWFudGljcyBhcmUgZXF1aXZhbGVudCB0byBKYXZhc2NyaXB0J3Mgc3RyaWN0IGVxdWFsaXR5ICg9PT0vIT09KVxuICogLS0gaS5lLiwgd2hlbiB0aGUgYXJndW1lbnRzJyB0eXBlcyBkb24ndCBtYXRjaCwgPT0gZXZhbHVhdGVzIHRvIGZhbHNlLCAhPSB0b1xuICogdHJ1ZS5cbiAqXG4gKiBXaGVuIHR5cGVzIGRvbid0IG1hdGNoIGluIGFuIG9yZGVyaW5nIGNvbXBhcmlzb24sIGEgcnVudGltZSBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZUNvbXBhcmlzb24ob3A6IENvbXBhcmlzb25PcGVyYXRvciwgY29tcGFyZUJhc2ljLCBjb21wYXJlV2l0aENvbGxhdG9yKSB7XG4gICAgY29uc3QgaXNPcmRlckNvbXBhcmlzb24gPSBvcCAhPT0gJz09JyAmJiBvcCAhPT0gJyE9JztcblxuICAgIHJldHVybiBjbGFzcyBDb21wYXJpc29uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgICAgIHR5cGU6IFR5cGU7XG4gICAgICAgIGxoczogRXhwcmVzc2lvbjtcbiAgICAgICAgcmhzOiBFeHByZXNzaW9uO1xuICAgICAgICBjb2xsYXRvcjogP0V4cHJlc3Npb247XG4gICAgICAgIGhhc1VudHlwZWRBcmd1bWVudDogYm9vbGVhbjtcblxuICAgICAgICBjb25zdHJ1Y3RvcihsaHM6IEV4cHJlc3Npb24sIHJoczogRXhwcmVzc2lvbiwgY29sbGF0b3I6ID9FeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBCb29sZWFuVHlwZTtcbiAgICAgICAgICAgIHRoaXMubGhzID0gbGhzO1xuICAgICAgICAgICAgdGhpcy5yaHMgPSByaHM7XG4gICAgICAgICAgICB0aGlzLmNvbGxhdG9yID0gY29sbGF0b3I7XG4gICAgICAgICAgICB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCA9IGxocy50eXBlLmtpbmQgPT09ICd2YWx1ZScgfHwgcmhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzICYmIGFyZ3MubGVuZ3RoICE9PSA0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gb3IgdGhyZWUgYXJndW1lbnRzLmApO1xuXG4gICAgICAgICAgICBjb25zdCBvcDogQ29tcGFyaXNvbk9wZXJhdG9yID0gKGFyZ3NbMF06IGFueSk7XG5cbiAgICAgICAgICAgIGxldCBsaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxocykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoIWlzQ29tcGFyYWJsZVR5cGUob3AsIGxocy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbmNhdCgxKS5lcnJvcihgXCIke29wfVwiIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICcke3RvU3RyaW5nKGxocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJocyA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmhzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICghaXNDb21wYXJhYmxlVHlwZShvcCwgcmhzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29uY2F0KDIpLmVycm9yKGBcIiR7b3B9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7dG9TdHJpbmcocmhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSByaHMudHlwZS5raW5kICYmXG4gICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJlxuICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBDYW5ub3QgY29tcGFyZSB0eXBlcyAnJHt0b1N0cmluZyhsaHMudHlwZSl9JyBhbmQgJyR7dG9TdHJpbmcocmhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09yZGVyQ29tcGFyaXNvbikge1xuICAgICAgICAgICAgICAgIC8vIHR5cGluZyBydWxlcyBzcGVjaWZpYyB0byBsZXNzL2dyZWF0ZXIgdGhhbiBvcGVyYXRvcnNcbiAgICAgICAgICAgICAgICBpZiAobGhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJyAmJiByaHMudHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSwgVClcbiAgICAgICAgICAgICAgICAgICAgbGhzID0gbmV3IEFzc2VydGlvbihyaHMudHlwZSwgW2xoc10pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJiByaHMudHlwZS5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIChULCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmhzID0gbmV3IEFzc2VydGlvbihsaHMudHlwZSwgW3Joc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbGxhdG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJlxuICAgICAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAndmFsdWUnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBDYW5ub3QgdXNlIGNvbGxhdG9yIHRvIGNvbXBhcmUgbm9uLXN0cmluZyB0eXBlcy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sbGF0b3IgPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIENvbGxhdG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xsYXRvcikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvbihsaHMsIHJocywgY29sbGF0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICAgICAgY29uc3QgbGhzID0gdGhpcy5saHMuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHJocyA9IHRoaXMucmhzLmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgICAgIGlmIChpc09yZGVyQ29tcGFyaXNvbiAmJiB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGx0ID0gdHlwZU9mKGxocyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnQgPSB0eXBlT2YocmhzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHR5cGUgaXMgc3RyaW5nIG9yIG51bWJlciwgYW5kIGVxdWFsXG4gICAgICAgICAgICAgICAgaWYgKGx0LmtpbmQgIT09IHJ0LmtpbmQgfHwgIShsdC5raW5kID09PSAnc3RyaW5nJyB8fCBsdC5raW5kID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgYXJndW1lbnRzIGZvciBcIiR7b3B9XCIgdG8gYmUgKHN0cmluZywgc3RyaW5nKSBvciAobnVtYmVyLCBudW1iZXIpLCBidXQgZm91bmQgKCR7bHQua2luZH0sICR7cnQua2luZH0pIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvciAmJiAhaXNPcmRlckNvbXBhcmlzb24gJiYgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsdCA9IHR5cGVPZihsaHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ0ID0gdHlwZU9mKHJocyk7XG4gICAgICAgICAgICAgICAgaWYgKGx0LmtpbmQgIT09ICdzdHJpbmcnIHx8IHJ0LmtpbmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQmFzaWMoY3R4LCBsaHMsIHJocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvciA/XG4gICAgICAgICAgICAgICAgY29tcGFyZVdpdGhDb2xsYXRvcihjdHgsIGxocywgcmhzLCB0aGlzLmNvbGxhdG9yLmV2YWx1YXRlKGN0eCkpIDpcbiAgICAgICAgICAgICAgICBjb21wYXJlQmFzaWMoY3R4LCBsaHMsIHJocyk7XG4gICAgICAgIH1cblxuICAgICAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxocyk7XG4gICAgICAgICAgICBmbih0aGlzLnJocyk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvcikge1xuICAgICAgICAgICAgICAgIGZuKHRoaXMuY29sbGF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtvcF07XG4gICAgICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgRXF1YWxzID0gbWFrZUNvbXBhcmlzb24oJz09JywgZXEsIGVxQ29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTm90RXF1YWxzID0gbWFrZUNvbXBhcmlzb24oJyE9JywgbmVxLCBuZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBMZXNzVGhhbiA9IG1ha2VDb21wYXJpc29uKCc8JywgbHQsIGx0Q29sbGF0ZSk7XG5leHBvcnQgY29uc3QgR3JlYXRlclRoYW4gPSBtYWtlQ29tcGFyaXNvbignPicsIGd0LCBndENvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IExlc3NUaGFuT3JFcXVhbCA9IG1ha2VDb21wYXJpc29uKCc8PScsIGx0ZXEsIGx0ZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBHcmVhdGVyVGhhbk9yRXF1YWwgPSBtYWtlQ29tcGFyaXNvbignPj0nLCBndGVxLCBndGVxQ29sbGF0ZSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1N0cmluZ1R5cGUsIE51bWJlclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgTnVtYmVyRm9ybWF0OiBDbGFzczxJbnRsJE51bWJlckZvcm1hdD5cbn07XG5cbmRlY2xhcmUgY2xhc3MgSW50bCROdW1iZXJGb3JtYXQge1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgc3RhdGljIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgZm9ybWF0KGE6IG51bWJlcik6IHN0cmluZztcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHtcbiAgICBzdHlsZT86ICdkZWNpbWFsJyB8ICdjdXJyZW5jeScgfCAncGVyY2VudCc7XG4gICAgY3VycmVuY3k/OiBudWxsIHwgc3RyaW5nO1xuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0cz86IG51bGwgfCBzdHJpbmc7XG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzPzogbnVsbCB8IHN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlckZvcm1hdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbnVtYmVyOiBFeHByZXNzaW9uO1xuICAgIGxvY2FsZTogRXhwcmVzc2lvbiB8IG51bGw7ICAgLy8gQkNQIDQ3IGxhbmd1YWdlIHRhZ1xuICAgIGN1cnJlbmN5OiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gSVNPIDQyMTcgY3VycmVuY3kgY29kZSwgcmVxdWlyZWQgaWYgc3R5bGU9Y3VycmVuY3lcbiAgICBtaW5GcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGw7IC8vIERlZmF1bHQgMFxuICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gRGVmYXVsdCAzXG5cbiAgICBjb25zdHJ1Y3RvcihudW1iZXI6IEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSBTdHJpbmdUeXBlO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY3VycmVuY3kgPSBjdXJyZW5jeTtcbiAgICAgICAgdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID0gbWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGNvbnN0IG51bWJlciA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghbnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMl06IGFueSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE51bWJlckZvcm1hdCBvcHRpb25zIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LmApO1xuXG4gICAgICAgIGxldCBsb2NhbGUgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbG9jYWxlJ10pIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbG9jYWxlJ10sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbmN5ID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2N1cnJlbmN5J10pIHtcbiAgICAgICAgICAgIGN1cnJlbmN5ID0gY29udGV4dC5wYXJzZShvcHRpb25zWydjdXJyZW5jeSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghY3VycmVuY3kpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1pbkZyYWN0aW9uRGlnaXRzID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSkge1xuICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1pbkZyYWN0aW9uRGlnaXRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhGcmFjdGlvbkRpZ2l0cyA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10pIHtcbiAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzID0gY29udGV4dC5wYXJzZShvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtYXhGcmFjdGlvbkRpZ2l0cykgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE51bWJlckZvcm1hdChudW1iZXIsIGxvY2FsZSwgY3VycmVuY3ksIG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IFtdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLmN1cnJlbmN5ID8gXCJjdXJyZW5jeVwiIDogXCJkZWNpbWFsXCIsXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3kgPyB0aGlzLmN1cnJlbmN5LmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID8gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyA/IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh0aGlzLm51bWJlci5ldmFsdWF0ZShjdHgpKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMubnVtYmVyKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxvY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVuY3kpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuY3VycmVuY3kpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBmbih0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgZm4odGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgb3B0aW9uc1snbG9jYWxlJ10gPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeSkge1xuICAgICAgICAgICAgb3B0aW9uc1snY3VycmVuY3knXSA9IHRoaXMuY3VycmVuY3kuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSA9IHRoaXMubWluRnJhY3Rpb25EaWdpdHMuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4RnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSA9IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcIm51bWJlci1mb3JtYXRcIiwgdGhpcy5udW1iZXIuc2VyaWFsaXplKCksIG9wdGlvbnNdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZSwgdG9TdHJpbmd9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIExlbmd0aCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBOdW1iZXJUeXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDEgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnB1dC50eXBlLmtpbmQgIT09ICdhcnJheScgJiYgaW5wdXQudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlLmtpbmQgIT09ICd2YWx1ZScpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCAke3RvU3RyaW5nKGlucHV0LnR5cGUpfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVuZ3RoKGlucHV0KTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaW5wdXQpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImxlbmd0aFwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMZW5ndGg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIHR5cGUgVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIEVycm9yVHlwZSxcbiAgICBDb2xsYXRvclR5cGUsXG4gICAgYXJyYXksXG4gICAgdG9TdHJpbmcgYXMgdHlwZVRvU3RyaW5nXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHt0eXBlT2YsIENvbG9yLCB2YWxpZGF0ZVJHQkEsIHRvU3RyaW5nIGFzIHZhbHVlVG9TdHJpbmd9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4uL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCBMZXQgZnJvbSAnLi9sZXQuanMnO1xuaW1wb3J0IFZhciBmcm9tICcuL3Zhci5qcyc7XG5pbXBvcnQgTGl0ZXJhbCBmcm9tICcuL2xpdGVyYWwuanMnO1xuaW1wb3J0IEFzc2VydGlvbiBmcm9tICcuL2Fzc2VydGlvbi5qcyc7XG5pbXBvcnQgQ29lcmNpb24gZnJvbSAnLi9jb2VyY2lvbi5qcyc7XG5pbXBvcnQgQXQgZnJvbSAnLi9hdC5qcyc7XG5pbXBvcnQgSW4gZnJvbSAnLi9pbi5qcyc7XG5pbXBvcnQgSW5kZXhPZiBmcm9tICcuL2luZGV4X29mLmpzJztcbmltcG9ydCBNYXRjaCBmcm9tICcuL21hdGNoLmpzJztcbmltcG9ydCBDYXNlIGZyb20gJy4vY2FzZS5qcyc7XG5pbXBvcnQgU2xpY2UgZnJvbSAnLi9zbGljZS5qcyc7XG5pbXBvcnQgU3RlcCBmcm9tICcuL3N0ZXAuanMnO1xuaW1wb3J0IEludGVycG9sYXRlIGZyb20gJy4vaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IENvYWxlc2NlIGZyb20gJy4vY29hbGVzY2UuanMnO1xuaW1wb3J0IHtcbiAgICBFcXVhbHMsXG4gICAgTm90RXF1YWxzLFxuICAgIExlc3NUaGFuLFxuICAgIEdyZWF0ZXJUaGFuLFxuICAgIExlc3NUaGFuT3JFcXVhbCxcbiAgICBHcmVhdGVyVGhhbk9yRXF1YWxcbn0gZnJvbSAnLi9jb21wYXJpc29uLmpzJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9jb2xsYXRvci5qcyc7XG5pbXBvcnQgTnVtYmVyRm9ybWF0IGZyb20gJy4vbnVtYmVyX2Zvcm1hdC5qcyc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuL2Zvcm1hdC5qcyc7XG5pbXBvcnQgSW1hZ2VFeHByZXNzaW9uIGZyb20gJy4vaW1hZ2UuanMnO1xuaW1wb3J0IExlbmd0aCBmcm9tICcuL2xlbmd0aC5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vd2l0aGluLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhcmFyZ3N9IGZyb20gJy4uL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5cbmNvbnN0IGV4cHJlc3Npb25zOiBFeHByZXNzaW9uUmVnaXN0cnkgPSB7XG4gICAgLy8gc3BlY2lhbCBmb3Jtc1xuICAgICc9PSc6IEVxdWFscyxcbiAgICAnIT0nOiBOb3RFcXVhbHMsXG4gICAgJz4nOiBHcmVhdGVyVGhhbixcbiAgICAnPCc6IExlc3NUaGFuLFxuICAgICc+PSc6IEdyZWF0ZXJUaGFuT3JFcXVhbCxcbiAgICAnPD0nOiBMZXNzVGhhbk9yRXF1YWwsXG4gICAgJ2FycmF5JzogQXNzZXJ0aW9uLFxuICAgICdhdCc6IEF0LFxuICAgICdib29sZWFuJzogQXNzZXJ0aW9uLFxuICAgICdjYXNlJzogQ2FzZSxcbiAgICAnY29hbGVzY2UnOiBDb2FsZXNjZSxcbiAgICAnY29sbGF0b3InOiBDb2xsYXRvckV4cHJlc3Npb24sXG4gICAgJ2Zvcm1hdCc6IEZvcm1hdEV4cHJlc3Npb24sXG4gICAgJ2ltYWdlJzogSW1hZ2VFeHByZXNzaW9uLFxuICAgICdpbic6IEluLFxuICAgICdpbmRleC1vZic6IEluZGV4T2YsXG4gICAgJ2ludGVycG9sYXRlJzogSW50ZXJwb2xhdGUsXG4gICAgJ2ludGVycG9sYXRlLWhjbCc6IEludGVycG9sYXRlLFxuICAgICdpbnRlcnBvbGF0ZS1sYWInOiBJbnRlcnBvbGF0ZSxcbiAgICAnbGVuZ3RoJzogTGVuZ3RoLFxuICAgICdsZXQnOiBMZXQsXG4gICAgJ2xpdGVyYWwnOiBMaXRlcmFsLFxuICAgICdtYXRjaCc6IE1hdGNoLFxuICAgICdudW1iZXInOiBBc3NlcnRpb24sXG4gICAgJ251bWJlci1mb3JtYXQnOiBOdW1iZXJGb3JtYXQsXG4gICAgJ29iamVjdCc6IEFzc2VydGlvbixcbiAgICAnc2xpY2UnOiBTbGljZSxcbiAgICAnc3RlcCc6IFN0ZXAsXG4gICAgJ3N0cmluZyc6IEFzc2VydGlvbixcbiAgICAndG8tYm9vbGVhbic6IENvZXJjaW9uLFxuICAgICd0by1jb2xvcic6IENvZXJjaW9uLFxuICAgICd0by1udW1iZXInOiBDb2VyY2lvbixcbiAgICAndG8tc3RyaW5nJzogQ29lcmNpb24sXG4gICAgJ3Zhcic6IFZhcixcbiAgICAnd2l0aGluJzogV2l0aGluXG59O1xuXG5mdW5jdGlvbiByZ2JhKGN0eCwgW3IsIGcsIGIsIGFdKSB7XG4gICAgciA9IHIuZXZhbHVhdGUoY3R4KTtcbiAgICBnID0gZy5ldmFsdWF0ZShjdHgpO1xuICAgIGIgPSBiLmV2YWx1YXRlKGN0eCk7XG4gICAgY29uc3QgYWxwaGEgPSBhID8gYS5ldmFsdWF0ZShjdHgpIDogMTtcbiAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlUkdCQShyLCBnLCBiLCBhbHBoYSk7XG4gICAgaWYgKGVycm9yKSB0aHJvdyBuZXcgUnVudGltZUVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gbmV3IENvbG9yKHIgLyAyNTUgKiBhbHBoYSwgZyAvIDI1NSAqIGFscGhhLCBiIC8gMjU1ICogYWxwaGEsIGFscGhhKTtcbn1cblxuZnVuY3Rpb24gaGFzKGtleSwgb2JqKSB7XG4gICAgcmV0dXJuIGtleSBpbiBvYmo7XG59XG5cbmZ1bmN0aW9uIGdldChrZXksIG9iaikge1xuICAgIGNvbnN0IHYgPSBvYmpba2V5XTtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHY7XG59XG5cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaCh2LCBhLCBpLCBqKSB7XG4gICAgd2hpbGUgKGkgPD0gaikge1xuICAgICAgICBjb25zdCBtID0gKGkgKyBqKSA+PiAxO1xuICAgICAgICBpZiAoYVttXSA9PT0gdilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYVttXSA+IHYpXG4gICAgICAgICAgICBqID0gbSAtIDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGkgPSBtICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB2YXJhcmdzKHR5cGU6IFR5cGUpOiBWYXJhcmdzIHtcbiAgICByZXR1cm4ge3R5cGV9O1xufVxuXG5Db21wb3VuZEV4cHJlc3Npb24ucmVnaXN0ZXIoZXhwcmVzc2lvbnMsIHtcbiAgICAnZXJyb3InOiBbXG4gICAgICAgIEVycm9yVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHsgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcih2LmV2YWx1YXRlKGN0eCkpOyB9XG4gICAgXSxcbiAgICAndHlwZW9mJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB0eXBlVG9TdHJpbmcodHlwZU9mKHYuZXZhbHVhdGUoY3R4KSkpXG4gICAgXSxcbiAgICAndG8tcmdiYSc6IFtcbiAgICAgICAgYXJyYXkoTnVtYmVyVHlwZSwgNCksXG4gICAgICAgIFtDb2xvclR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2LmV2YWx1YXRlKGN0eCkudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAncmdiJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ3JnYmEnOiBbXG4gICAgICAgIENvbG9yVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICByZ2JhXG4gICAgXSxcbiAgICAnaGFzJzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGhhcyhrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdnZXQnOiB7XG4gICAgICAgIHR5cGU6IFZhbHVlVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdmZWF0dXJlLXN0YXRlJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW2tleV0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgY3R4LmZlYXR1cmVTdGF0ZSB8fCB7fSlcbiAgICBdLFxuICAgICdwcm9wZXJ0aWVzJzogW1xuICAgICAgICBPYmplY3RUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2dlb21ldHJ5LXR5cGUnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2VvbWV0cnlUeXBlKClcbiAgICBdLFxuICAgICdpZCc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LmlkKClcbiAgICBdLFxuICAgICd6b29tJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuem9vbVxuICAgIF0sXG4gICAgJ2hlYXRtYXAtZGVuc2l0eSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmhlYXRtYXBEZW5zaXR5IHx8IDBcbiAgICBdLFxuICAgICdsaW5lLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMubGluZVByb2dyZXNzIHx8IDBcbiAgICBdLFxuICAgICdza3ktcmFkaWFsLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuc2t5UmFkaWFsUHJvZ3Jlc3MgfHwgMFxuICAgIF0sXG4gICAgJ2FjY3VtdWxhdGVkJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5hY2N1bXVsYXRlZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN0eC5nbG9iYWxzLmFjY3VtdWxhdGVkXG4gICAgXSxcbiAgICAnKyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJyonOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSAxO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCAqPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICctJzoge1xuICAgICAgICB0eXBlOiBOdW1iZXJUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLSBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2FdKSA9PiAtYS5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICcvJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIC8gYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnJSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAlIGIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJ2xuMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguTE4yXG4gICAgXSxcbiAgICAncGknOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLlBJXG4gICAgXSxcbiAgICAnZSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguRVxuICAgIF0sXG4gICAgJ14nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2IsIGVdKSA9PiBNYXRoLnBvdyhiLmV2YWx1YXRlKGN0eCksIGUuZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdzcXJ0JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFt4XSkgPT4gTWF0aC5zcXJ0KHguZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cxMCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSkgLyBNYXRoLkxOMTBcbiAgICBdLFxuICAgICdsbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cyJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKSAvIE1hdGguTE4yXG4gICAgXSxcbiAgICAnc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5zaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Nvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICd0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXNpbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYWNvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXRhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbWluJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1pbiguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ21heCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5tYXgoLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdhYnMnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFicyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAncm91bmQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gSmF2YXNjcmlwdCdzIE1hdGgucm91bmQoKSByb3VuZHMgdG93YXJkcyArSW5maW5pdHkgZm9yIGhhbGZ3YXlcbiAgICAgICAgICAgIC8vIHZhbHVlcywgZXZlbiB3aGVuIHRoZXkncmUgbmVnYXRpdmUuIEl0J3MgbW9yZSBjb21tb24gdG8gcm91bmRcbiAgICAgICAgICAgIC8vIGF3YXkgZnJvbSAwIChlLmcuLCB0aGlzIGlzIHdoYXQgcHl0aG9uIGFuZCBDKysgZG8pXG4gICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAtTWF0aC5yb3VuZCgtdikgOiBNYXRoLnJvdW5kKHYpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmxvb3InOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmZsb29yKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdjZWlsJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5jZWlsKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdmaWx0ZXItPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguaWQoKSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaGFzJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrXSkgPT4gKGs6IGFueSkudmFsdWUgaW4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMtaWQnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gKGN0eC5pZCgpICE9PSBudWxsICYmIGN0eC5pZCgpICE9PSB1bmRlZmluZWQpXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoU3RyaW5nVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4Lmdlb21ldHJ5VHlwZSgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LmlkKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tc21hbGwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhbiBhcnJheSBsaXRlcmFsXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gKHY6IGFueSkudmFsdWUuaW5kZXhPZihjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1sYXJnZSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGEgYXJyYXkgbGl0ZXJhbCB3aXRoIHZhbHVlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBvZiBhIHNpbmdsZSB0eXBlXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gYmluYXJ5U2VhcmNoKGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdLCAodjogYW55KS52YWx1ZSwgMCwgKHY6IGFueSkudmFsdWUubGVuZ3RoIC0gMSlcbiAgICBdLFxuICAgICdhbGwnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAmJiBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdhbnknOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSB8fCBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJyEnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbQm9vbGVhblR5cGVdLFxuICAgICAgICAoY3R4LCBbYl0pID0+ICFiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdpcy1zdXBwb3J0ZWQtc2NyaXB0JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAvLyBBdCBwYXJzZSB0aW1lIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUsIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSB0aGlzIGV4cHJlc3Npb24gd2l0aCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnRcbiAgICAgICAgKGN0eCwgW3NdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1N1cHBvcnRlZFNjcmlwdCA9IGN0eC5nbG9iYWxzICYmIGN0eC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkU2NyaXB0KHMuZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhWYWx1ZVR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBhcmdzLm1hcChhcmcgPT4gdmFsdWVUb1N0cmluZyhhcmcuZXZhbHVhdGUoY3R4KSkpLmpvaW4oJycpXG4gICAgXSxcbiAgICAncmVzb2x2ZWQtbG9jYWxlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbQ29sbGF0b3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW2NvbGxhdG9yXSkgPT4gY29sbGF0b3IuZXZhbHVhdGUoY3R4KS5yZXNvbHZlZExvY2FsZSgpXG4gICAgXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cHJlc3Npb25zO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBBIHR5cGUgdXNlZCBmb3IgcmV0dXJuaW5nIGFuZCBwcm9wYWdhdGluZyBlcnJvcnMuIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB1bmlvblxuICogcmVwcmVzZW50cyBzdWNjZXNzIGFuZCBjb250YWlucyBhIHZhbHVlLCBhbmQgdGhlIHNlY29uZCByZXByZXNlbnRzIGFuIGVycm9yIGFuZFxuICogY29udGFpbnMgYW4gZXJyb3IgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuICAgIHwge3wgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlOiBUIHx9XG4gICAgfCB7fCByZXN1bHQ6ICdlcnJvcicsIHZhbHVlOiBFIHx9O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzczxULCBFPih2YWx1ZTogVCk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHtyZXN1bHQ6ICdzdWNjZXNzJywgdmFsdWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3I8VCwgRT4odmFsdWU6IEUpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7cmVzdWx0OiAnZXJyb3InLCB2YWx1ZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY1sncHJvcGVydHktdHlwZSddID09PSAnZGF0YS1kcml2ZW4nIHx8IHNwZWNbJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZignem9vbScpID4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ludGVycG9sYXRpb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLmludGVycG9sYXRlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFR5cGUodmFsOiBtaXhlZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgKiBhcyBjb2xvclNwYWNlcyBmcm9tICcuLi91dGlsL2NvbG9yX3NwYWNlcy5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuaW1wb3J0IHtzdXBwb3J0c0ludGVycG9sYXRpb259IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL2V4cHJlc3Npb24vc3RvcHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpIHtcbiAgICBjb25zdCBpc0NvbG9yID0gcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcic7XG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICBjb25zdCBmZWF0dXJlRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgcGFyYW1ldGVycy5wcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvb21EZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCAhZmVhdHVyZURlcGVuZGVudDtcbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IChzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAke3BhcmFtZXRlcnMuY29sb3JTcGFjZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgaW5uZXJGdW47XG4gICAgbGV0IGhhc2hlZFN0b3BzO1xuICAgIGxldCBjYXRlZ29yaWNhbEtleVR5cGU7XG4gICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbjtcblxuICAgICAgICAvLyBGb3IgY2F0ZWdvcmljYWwgZnVuY3Rpb25zLCBnZW5lcmF0ZSBhbiBPYmplY3QgYXMgYSBoYXNobWFwIG9mIHRoZSBzdG9wcyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAgICAgICAgaGFzaGVkU3RvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0b3Agb2YgcGFyYW1ldGVycy5zdG9wcykge1xuICAgICAgICAgICAgaGFzaGVkU3RvcHNbc3RvcFswXV0gPSBzdG9wWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIga2V5IHR5cGUgYmFzZWQgb24gZmlyc3Qgc3RvcCBrZXktLSB1c2VkIHRvIGVuY2ZvcmNlIHN0cmljdCB0eXBlIGNoZWNraW5nIGxhdGVyXG4gICAgICAgIGNhdGVnb3JpY2FsS2V5VHlwZSA9IHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKHpvb21BbmRGZWF0dXJlRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3Qgem9vbVN0b3BzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHBhcmFtZXRlcnMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHBhcmFtZXRlcnMuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB6b29tU3RvcHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0uc3RvcHMucHVzaChbc3RvcFswXS52YWx1ZSwgc3RvcFsxXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB6IG9mIHpvb21TdG9wcykge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHMucHVzaChbZmVhdHVyZUZ1bmN0aW9uc1t6XS56b29tLCBjcmVhdGVGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25zW3pdLCBwcm9wZXJ0eVNwZWMpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyA/XG4gICAgICAgICAgICB7bmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogcGFyYW1ldGVycy5iYXNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmJhc2UgOiAxfSA6IG51bGw7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBwYXJhbWV0ZXJzLnN0b3BzLm1hcChzID0+IHNbMF0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICh7em9vbX0pID0+IGlubmVyRnVuKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgem9vbSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICBldmFsdWF0ZShfLCBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllc1twYXJhbWV0ZXJzLnByb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHZhbHVlLCBoYXNoZWRTdG9wcywgY2F0ZWdvcmljYWxLZXlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgICBpZiAoYiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQsIGhhc2hlZFN0b3BzLCBrZXlUeXBlKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkID0gdHlwZW9mIGlucHV0ID09PSBrZXlUeXBlID8gaGFzaGVkU3RvcHNbaW5wdXRdIDogdW5kZWZpbmVkOyAvLyBFbmZvcmNlIHN0cmljdCB0eXBpbmcgb24gaW5wdXRcbiAgICByZXR1cm4gY29hbGVzY2UoZXZhbHVhdGVkLCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQpIHtcbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGNvbnN0IGJhc2UgPSBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDE7XG5cbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgIGlucHV0ID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGlucHV0LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAoZ2V0VHlwZShpbnB1dCkgIT09IHByb3BlcnR5U3BlYy50eXBlICYmIChwcm9wZXJ0eVNwZWMudHlwZSAhPT0gJ2VudW0nIHx8ICFwcm9wZXJ0eVNwZWMudmFsdWVzW2lucHV0XSkpIHtcbiAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjb2FsZXNjZShpbnB1dCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICogVHdvIGNvbnNlY3V0aXZlIHN0b3AgdmFsdWVzIGRlZmluZSBhIChzY2FsZWQgYW5kIHNoaWZ0ZWQpIGV4cG9uZW50aWFsXG4gKiBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRpb25GYWN0b3IoaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdXBwZXJWYWx1ZSAtIGxvd2VyVmFsdWU7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBpbnB1dCAtIGxvd2VyVmFsdWU7XG5cbiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gZGlmZmVyZW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9kZWZpbml0aW9ucy9zdGVwLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzJztcbmltcG9ydCBMZXQgZnJvbSAnLi9kZWZpbml0aW9ucy9sZXQuanMnO1xuaW1wb3J0IGRlZmluaXRpb25zIGZyb20gJy4vZGVmaW5pdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgaXNDb25zdGFudCBmcm9tICcuL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7c3VjY2VzcywgZXJyb3J9IGZyb20gJy4uL3V0aWwvcmVzdWx0LmpzJztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24sIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sIHN1cHBvcnRzSW50ZXJwb2xhdGlvbn0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQuanMnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlID0ge1xuICAgICt0eXBlOiAxIHwgMiB8IDMgfCAnVW5rbm93bicgfCAnUG9pbnQnIHwgJ011bHRpUG9pbnQnIHwgJ0xpbmVTdHJpbmcnIHwgJ011bHRpTGluZVN0cmluZycgfCAnUG9seWdvbicgfCAnTXVsdGlQb2x5Z29uJyxcbiAgICAraWQ/OiBhbnksXG4gICAgK3Byb3BlcnRpZXM6IHtbXzogc3RyaW5nXTogYW55fSxcbiAgICArcGF0dGVybnM/OiB7W186IHN0cmluZ106IHtcIm1pblwiOiBzdHJpbmcsIFwibWlkXCI6IHN0cmluZywgXCJtYXhcIjogc3RyaW5nfX0sXG4gICAgK2dlb21ldHJ5PzogQXJyYXk8QXJyYXk8UG9pbnQ+PlxufTtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlID0ge1tfOiBzdHJpbmddOiBhbnl9O1xuXG5leHBvcnQgdHlwZSBHbG9iYWxQcm9wZXJ0aWVzID0gJFJlYWRPbmx5PHtcbiAgICB6b29tOiBudW1iZXIsXG4gICAgaGVhdG1hcERlbnNpdHk/OiBudW1iZXIsXG4gICAgbGluZVByb2dyZXNzPzogbnVtYmVyLFxuICAgIHNreVJhZGlhbFByb2dyZXNzPzogbnVtYmVyLFxuICAgIGlzU3VwcG9ydGVkU2NyaXB0PzogKF86IHN0cmluZykgPT4gYm9vbGVhbixcbiAgICBhY2N1bXVsYXRlZD86IFZhbHVlXG59PjtcblxuZXhwb3J0IGNsYXNzIFN0eWxlRXhwcmVzc2lvbiB7XG4gICAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIF9ldmFsdWF0b3I6IEV2YWx1YXRpb25Db250ZXh0O1xuICAgIF9kZWZhdWx0VmFsdWU6IFZhbHVlO1xuICAgIF93YXJuaW5nSGlzdG9yeToge1trZXk6IHN0cmluZ106IGJvb2xlYW59O1xuICAgIF9lbnVtVmFsdWVzOiA/e1tfOiBzdHJpbmddOiBhbnl9O1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgcHJvcGVydHlTcGVjOiA/U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5fd2FybmluZ0hpc3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHByb3BlcnR5U3BlYyA/IGdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eVNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fZW51bVZhbHVlcyA9IHByb3BlcnR5U3BlYyAmJiBwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2VudW0nID8gcHJvcGVydHlTcGVjLnZhbHVlcyA6IG51bGw7XG4gICAgfVxuXG4gICAgZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlU3RhdGUgPSBmZWF0dXJlU3RhdGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5jYW5vbmljYWwgPSBjYW5vbmljYWw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXMgPSBhdmFpbGFibGVJbWFnZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZvcm1hdHRlZFNlY3Rpb24gPSBmb3JtYXR0ZWRTZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gYXZhaWxhYmxlSW1hZ2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbiB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCAhPT0gdmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZW51bVZhbHVlcyAmJiAhKHZhbCBpbiB0aGlzLl9lbnVtVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9uZSBvZiAke09iamVjdC5rZXlzKHRoaXMuX2VudW1WYWx1ZXMpLm1hcCh2ID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKCcsICcpfSwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkodmFsKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fd2FybmluZ0hpc3RvcnlbZS5tZXNzYWdlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhcm5pbmdIaXN0b3J5W2UubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24ubGVuZ3RoID4gMCAmJlxuICAgICAgICB0eXBlb2YgZXhwcmVzc2lvblswXSA9PT0gJ3N0cmluZycgJiYgZXhwcmVzc2lvblswXSBpbiBkZWZpbml0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdHlwZWNoZWNrIHRoZSBnaXZlbiBzdHlsZSBzcGVjIEpTT04gZXhwcmVzc2lvbi4gIElmXG4gKiBvcHRpb25zLmRlZmF1bHRWYWx1ZSBpcyBwcm92aWRlZCwgdGhlbiB0aGUgcmVzdWx0aW5nIFN0eWxlRXhwcmVzc2lvbidzXG4gKiBgZXZhbHVhdGUoKWAgbWV0aG9kIHdpbGwgaGFuZGxlIGVycm9ycyBieSBsb2dnaW5nIGEgd2FybmluZyAob25jZSBwZXJcbiAqIG1lc3NhZ2UpIGFuZCByZXR1cm5pbmcgdGhlIGRlZmF1bHQgdmFsdWUuICBPdGhlcndpc2UsIGl0IHdpbGwgdGhyb3dcbiAqIGV2YWx1YXRpb24gZXJyb3JzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb246IG1peGVkLCBwcm9wZXJ0eVNwZWM6ID9TdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFJlc3VsdDxTdHlsZUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2luZ0NvbnRleHQoZGVmaW5pdGlvbnMsIFtdLCBwcm9wZXJ0eVNwZWMgPyBnZXRFeHBlY3RlZFR5cGUocHJvcGVydHlTcGVjKSA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBGb3Igc3RyaW5nLXZhbHVlZCBwcm9wZXJ0aWVzLCBjb2VyY2UgdG8gc3RyaW5nIGF0IHRoZSB0b3AgbGV2ZWwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlci5wYXJzZShleHByZXNzaW9uLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLFxuICAgICAgICBwcm9wZXJ0eVNwZWMgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdzdHJpbmcnID8ge3R5cGVBbm5vdGF0aW9uOiAnY29lcmNlJ30gOiB1bmRlZmluZWQpO1xuXG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgYXNzZXJ0KHBhcnNlci5lcnJvcnMubGVuZ3RoID4gMCk7XG4gICAgICAgIHJldHVybiBlcnJvcihwYXJzZXIuZXJyb3JzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcyhuZXcgU3R5bGVFeHByZXNzaW9uKHBhcnNlZCwgcHJvcGVydHlTcGVjKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBab29tQ29uc3RhbnRFeHByZXNzaW9uPEtpbmQ6IEV2YWx1YXRpb25LaW5kPiB7XG4gICAga2luZDogS2luZDtcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuO1xuICAgIF9zdHlsZUV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NvbnN0YW50JzogRXZhbHVhdGlvbktpbmQpICYmICFpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBab29tRGVwZW5kZW50RXhwcmVzc2lvbjxLaW5kOiBFdmFsdWF0aW9uS2luZD4ge1xuICAgIGtpbmQ6IEtpbmQ7XG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+O1xuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW47XG5cbiAgICBfc3R5bGVFeHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb247XG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbiwgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+LCBpbnRlcnBvbGF0aW9uVHlwZT86IEludGVycG9sYXRpb25UeXBlKSB7XG4gICAgICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gICAgICAgIHRoaXMuem9vbVN0b3BzID0gem9vbVN0b3BzO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NhbWVyYSc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uVHlwZSA9IGludGVycG9sYXRpb25UeXBlO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQ29uc3RhbnRFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KSA9PiBhbnksXG59XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ3NvdXJjZScsXG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbixcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSA9PiBhbnksXG59O1xuXG5leHBvcnQgdHlwZSBDYW1lcmFFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjYW1lcmEnLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBDb21wb3NpdGVFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW4sXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiA9XG4gICAgfCBDb25zdGFudEV4cHJlc3Npb25cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENhbWVyYUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQsIHByb3BlcnR5U3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBleHByZXNzaW9uID0gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCBwcm9wZXJ0eVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBleHByZXNzaW9uLnZhbHVlLmV4cHJlc3Npb247XG5cbiAgICBjb25zdCBpc0ZlYXR1cmVDb25zdGFudCA9IGlzQ29uc3RhbnQuaXNGZWF0dXJlQ29uc3RhbnQocGFyc2VkKTtcbiAgICBpZiAoIWlzRmVhdHVyZUNvbnN0YW50ICYmICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ2RhdGEgZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNab29tQ29uc3RhbnQgPSBpc0NvbnN0YW50LmlzR2xvYmFsUHJvcGVydHlDb25zdGFudChwYXJzZWQsIFsnem9vbSddKTtcbiAgICBpZiAoIWlzWm9vbUNvbnN0YW50ICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnem9vbSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkJyldKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b29tQ3VydmUgPSBmaW5kWm9vbUN1cnZlKHBhcnNlZCk7XG4gICAgaWYgKCF6b29tQ3VydmUgJiYgIWlzWm9vbUNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbem9vbUN1cnZlXSk7XG4gICAgfSBlbHNlIGlmICh6b29tQ3VydmUgaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSAmJiAhc3VwcG9ydHNJbnRlcnBvbGF0aW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyBwcm9wZXJ0eScpXSk7XG4gICAgfVxuXG4gICAgaWYgKCF6b29tQ3VydmUpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoaXNGZWF0dXJlQ29uc3RhbnQgP1xuICAgICAgICAgICAgKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdjb25zdGFudCcsIGV4cHJlc3Npb24udmFsdWUpOiBDb25zdGFudEV4cHJlc3Npb24pIDpcbiAgICAgICAgICAgIChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignc291cmNlJywgZXhwcmVzc2lvbi52YWx1ZSk6IFNvdXJjZUV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHpvb21DdXJ2ZSBpbnN0YW5jZW9mIEludGVycG9sYXRlID8gem9vbUN1cnZlLmludGVycG9sYXRpb24gOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gc3VjY2Vzcyhpc0ZlYXR1cmVDb25zdGFudCA/XG4gICAgICAgIChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NhbWVyYScsIGV4cHJlc3Npb24udmFsdWUsIHpvb21DdXJ2ZS5sYWJlbHMsIGludGVycG9sYXRpb25UeXBlKTogQ2FtZXJhRXhwcmVzc2lvbikgOlxuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUubGFiZWxzLCBpbnRlcnBvbGF0aW9uVHlwZSk6IENvbXBvc2l0ZUV4cHJlc3Npb24pKTtcbn1cblxuaW1wb3J0IHtpc0Z1bmN0aW9uLCBjcmVhdGVGdW5jdGlvbn0gZnJvbSAnLi4vZnVuY3Rpb24vaW5kZXguanMnO1xuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi92YWx1ZXMuanMnO1xuXG4vLyBzZXJpYWxpemF0aW9uIHdyYXBwZXIgZm9yIG9sZC1zdHlsZSBzdG9wIGZ1bmN0aW9ucyBub3JtYWxpemVkIHRvIHRoZVxuLy8gZXhwcmVzc2lvbiBpbnRlcmZhY2VcbmV4cG9ydCBjbGFzcyBTdHlsZVByb3BlcnR5RnVuY3Rpb248VD4ge1xuICAgIF9wYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPjtcbiAgICBfc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBraW5kOiBFdmFsdWF0aW9uS2luZDtcbiAgICBldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlKSA9PiBhbnk7XG4gICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogPyhpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXI7XG4gICAgem9vbVN0b3BzOiA/QXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5fc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIGV4dGVuZCh0aGlzLCBjcmVhdGVGdW5jdGlvbih0aGlzLl9wYXJhbWV0ZXJzLCB0aGlzLl9zcGVjaWZpY2F0aW9uKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQ6IHtfcGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4sIF9zcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbn0pIHtcbiAgICAgICAgcmV0dXJuICgobmV3IFN0eWxlUHJvcGVydHlGdW5jdGlvbihzZXJpYWxpemVkLl9wYXJhbWV0ZXJzLCBzZXJpYWxpemVkLl9zcGVjaWZpY2F0aW9uKSk6IFN0eWxlUHJvcGVydHlGdW5jdGlvbjxUPik7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShpbnB1dDogU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfcGFyYW1ldGVyczogaW5wdXQuX3BhcmFtZXRlcnMsXG4gICAgICAgICAgICBfc3BlY2lmaWNhdGlvbjogaW5wdXQuX3NwZWNpZmljYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb248VD4odmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTogYW55KTtcblxuICAgIH0gZWxzZSBpZiAoaXNFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gY3JlYXRlUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGluIHZhbGlkYXRpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihleHByZXNzaW9uLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY29uc3RhbnQ6IGFueSA9IHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzcGVjaWZpY2F0aW9uLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0YW50ID0gQ29sb3IucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICgpID0+IGNvbnN0YW50XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBab29tLWRlcGVuZGVudCBleHByZXNzaW9ucyBtYXkgb25seSB1c2UgW1wiem9vbVwiXSBhcyB0aGUgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiXG4vLyBleHByZXNzaW9uIChjb2xsZWN0aXZlbHkgcmVmZXJyZWQgdG8gYXMgYSBcImN1cnZlXCIpLiBUaGUgY3VydmUgbWF5IGJlIHdyYXBwZWQgaW4gb25lIG9yIG1vcmUgXCJsZXRcIiBvclxuLy8gXCJjb2FsZXNjZVwiIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uOiBFeHByZXNzaW9uKTogU3RlcCB8IEludGVycG9sYXRlIHwgUGFyc2luZ0Vycm9yIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMZXQpIHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uLnJlc3VsdCk7XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2FsZXNjZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByZXNzaW9uLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoYXJnKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0ZXAgfHwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEludGVycG9sYXRlKSAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0IGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmXG4gICAgICAgIGV4cHJlc3Npb24uaW5wdXQubmFtZSA9PT0gJ3pvb20nKSB7XG5cbiAgICAgICAgcmVzdWx0ID0gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZFpvb21DdXJ2ZShjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZFJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2hpbGRSZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdCAmJiBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgJiYgY2hpbGRSZXN1bHQgJiYgcmVzdWx0ICE9PSBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ09ubHkgb25lIHpvb20tYmFzZWQgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIHN1YmV4cHJlc3Npb24gbWF5IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW1wb3J0IHtDb2xvclR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIEJvb2xlYW5UeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlLCBhcnJheX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmZ1bmN0aW9uIGdldEV4cGVjdGVkVHlwZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFR5cGUge1xuICAgIGNvbnN0IHR5cGVzID0ge1xuICAgICAgICBjb2xvcjogQ29sb3JUeXBlLFxuICAgICAgICBzdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICAgICAgZW51bTogU3RyaW5nVHlwZSxcbiAgICAgICAgYm9vbGVhbjogQm9vbGVhblR5cGUsXG4gICAgICAgIGZvcm1hdHRlZDogRm9ybWF0dGVkVHlwZSxcbiAgICAgICAgcmVzb2x2ZWRJbWFnZTogUmVzb2x2ZWRJbWFnZVR5cGVcbiAgICB9O1xuXG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gYXJyYXkodHlwZXNbc3BlYy52YWx1ZV0gfHwgVmFsdWVUeXBlLCBzcGVjLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzW3NwZWMudHlwZV07XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFZhbHVlIHtcbiAgICBpZiAoc3BlYy50eXBlID09PSAnY29sb3InICYmIGlzRnVuY3Rpb24oc3BlYy5kZWZhdWx0KSkge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGhlYXRtYXAtY29sb3I6IGl0IHVzZXMgdGhlICdkZWZhdWx0OicgdG8gZGVmaW5lIGFcbiAgICAgICAgLy8gZGVmYXVsdCBjb2xvciByYW1wLCBidXQgY3JlYXRlRXhwcmVzc2lvbiBleHBlY3RzIGEgc2ltcGxlIHZhbHVlIHRvIGZhbGxcbiAgICAgICAgLy8gYmFjayB0byBpbiBjYXNlIG9mIHJ1bnRpbWUgZXJyb3JzXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIGlmIChzcGVjLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnBhcnNlKHNwZWMuZGVmYXVsdCkgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNwZWMuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzcGVjLmRlZmF1bHQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY29udmVydEZ1bmN0aW9uO1xuXG5mdW5jdGlvbiBjb252ZXJ0TGl0ZXJhbCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gWydsaXRlcmFsJywgdmFsdWVdIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGdW5jdGlvbihwYXJhbWV0ZXJzOiBhbnksIHByb3BlcnR5U3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICBsZXQgc3RvcHMgPSBwYXJhbWV0ZXJzLnN0b3BzO1xuICAgIGlmICghc3RvcHMpIHtcbiAgICAgICAgLy8gaWRlbnRpdHkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRJZGVudGl0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBzdG9wcyAmJiB0eXBlb2Ygc3RvcHNbMF1bMF0gPT09ICdvYmplY3QnO1xuICAgIGNvbnN0IGZlYXR1cmVEZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCBwYXJhbWV0ZXJzLnByb3BlcnR5ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgem9vbURlcGVuZGVudCA9IHpvb21BbmRGZWF0dXJlRGVwZW5kZW50IHx8ICFmZWF0dXJlRGVwZW5kZW50O1xuXG4gICAgc3RvcHMgPSBzdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgaWYgKCFmZWF0dXJlRGVwZW5kZW50ICYmIHByb3BlcnR5U3BlYy50b2tlbnMgJiYgdHlwZW9mIHN0b3BbMV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIGNvbnZlcnRUb2tlblN0cmluZyhzdG9wWzFdKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtzdG9wWzBdLCBjb252ZXJ0TGl0ZXJhbChzdG9wWzFdKV07XG4gICAgfSk7XG5cbiAgICBpZiAoem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRab29tQW5kUHJvcGVydHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHN0b3BzKTtcbiAgICB9IGVsc2UgaWYgKHpvb21EZXBlbmRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRab29tRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBzdG9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgc3RvcHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydElkZW50aXR5RnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICBjb25zdCBnZXQgPSBbJ2dldCcsIHBhcmFtZXRlcnMucHJvcGVydHldO1xuXG4gICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGV4cHJlc3Npb25zIGZvciBzdHJpbmctdmFsdWVkIHByb3BlcnRpZXMgZ2V0IGNvZXJjZWQuIFRvIHByZXNlcnZlXG4gICAgICAgIC8vIGxlZ2FjeSBmdW5jdGlvbiBzZW1hbnRpY3MsIGluc2VydCBhbiBleHBsaWNpdCBhc3NlcnRpb24gaW5zdGVhZC5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5U3BlYy50eXBlID09PSAnc3RyaW5nJyA/IFsnc3RyaW5nJywgZ2V0XSA6IGdldDtcbiAgICB9IGVsc2UgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnZW51bScpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdtYXRjaCcsXG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0eVNwZWMudmFsdWVzKSxcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdFxuICAgICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcicgPyAndG8tY29sb3InIDogcHJvcGVydHlTcGVjLnR5cGUsIGdldCwgY29udmVydExpdGVyYWwocGFyYW1ldGVycy5kZWZhdWx0KV07XG4gICAgICAgIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgZXhwcmVzc2lvbi5zcGxpY2UoMSwgMCwgcHJvcGVydHlTcGVjLnZhbHVlLCBwcm9wZXJ0eVNwZWMubGVuZ3RoIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJwb2xhdGVPcGVyYXRvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3dpdGNoIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UpIHtcbiAgICBjYXNlICdoY2wnOiByZXR1cm4gJ2ludGVycG9sYXRlLWhjbCc7XG4gICAgY2FzZSAnbGFiJzogcmV0dXJuICdpbnRlcnBvbGF0ZS1sYWInO1xuICAgIGRlZmF1bHQ6IHJldHVybiAnaW50ZXJwb2xhdGUnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFpvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgc3RvcHMpIHtcbiAgICBjb25zdCBmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzID0ge307XG4gICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSB7fTtcbiAgICBjb25zdCB6b29tU3RvcHMgPSBbXTtcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHN0b3BzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN0b3AgPSBzdG9wc1tzXTtcbiAgICAgICAgY29uc3Qgem9vbSA9IHN0b3BbMF0uem9vbTtcbiAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvblBhcmFtZXRlcnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uUGFyYW1ldGVyc1t6b29tXSA9IHtcbiAgICAgICAgICAgICAgICB6b29tLFxuICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcGFyYW1ldGVycy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBwYXJhbWV0ZXJzLmRlZmF1bHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHNbem9vbV0gPSBbXTtcbiAgICAgICAgICAgIHpvb21TdG9wcy5wdXNoKHpvb20pO1xuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVGdW5jdGlvblN0b3BzW3pvb21dLnB1c2goW3N0b3BbMF0udmFsdWUsIHN0b3BbMV1dKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciB0aGUgem9vbSBkaW1lbnNpb24gb2YgYSB6b29tLWFuZC1wcm9wZXJ0eVxuICAgIC8vIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgZGlyZWN0bHkgZnJvbSB0aGUgc3R5bGUgcHJvcGVydHkgc3BlY2lmaWNhdGlvblxuICAgIC8vIGZvciB3aGljaCBpdCdzIGJlaW5nIHVzZWQ6IGxpbmVhciBmb3IgaW50ZXJwb2xhdGFibGUgcHJvcGVydGllcywgc3RlcFxuICAgIC8vIG90aGVyd2lzZS5cbiAgICBjb25zdCBmdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUoe30sIHByb3BlcnR5U3BlYyk7XG4gICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gW2dldEludGVycG9sYXRlT3BlcmF0b3IocGFyYW1ldGVycyksIFsnbGluZWFyJ10sIFsnem9vbSddXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygem9vbVN0b3BzKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBjb252ZXJ0UHJvcGVydHlGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzW3pdLCBwcm9wZXJ0eVNwZWMsIGZlYXR1cmVGdW5jdGlvblN0b3BzW3pdKTtcbiAgICAgICAgICAgIGFwcGVuZFN0b3BQYWlyKGV4cHJlc3Npb24sIHosIG91dHB1dCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFsnc3RlcCcsIFsnem9vbSddXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygem9vbVN0b3BzKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBjb252ZXJ0UHJvcGVydHlGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzW3pdLCBwcm9wZXJ0eVNwZWMsIGZlYXR1cmVGdW5jdGlvblN0b3BzW3pdKTtcbiAgICAgICAgICAgIGFwcGVuZFN0b3BQYWlyKGV4cHJlc3Npb24sIHosIG91dHB1dCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmaXh1cERlZ2VuZXJhdGVTdGVwQ3VydmUoZXhwcmVzc2lvbik7XG5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZShhLCBiKSB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGE7XG4gICAgaWYgKGIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGI7XG59XG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGNvbnZlcnRMaXRlcmFsKGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpKTtcblxuICAgIC8qXG4gICAgICogU29tZSBmaWVsZHMgd2l0aCB0eXBlOiByZXNvbHZlZEltYWdlIGhhdmUgYW4gdW5kZWZpbmVkIGRlZmF1bHQuXG4gICAgICogQmVjYXVzZSB1bmRlZmluZWQgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgcmVzb2x2ZWRJbWFnZSwgc2V0IGZhbGxiYWNrIHRvXG4gICAgICogYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgdW5kZWZpbmVkIHRvIGVuc3VyZSBvdXRwdXRcbiAgICAgKiBwYXNzZXMgdmFsaWRhdGlvbi5cbiAgICAgKi9cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdyZXNvbHZlZEltYWdlJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgc3RvcHMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0RnVuY3Rpb25UeXBlKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYyk7XG4gICAgY29uc3QgZ2V0ID0gWydnZXQnLCBwYXJhbWV0ZXJzLnByb3BlcnR5XTtcbiAgICBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlb2Ygc3RvcHNbMF1bMF0gPT09ICdib29sZWFuJykge1xuICAgICAgICBhc3NlcnQocGFyYW1ldGVycy5zdG9wcy5sZW5ndGggPiAwICYmIHBhcmFtZXRlcnMuc3RvcHMubGVuZ3RoIDw9IDIpO1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gWydjYXNlJ107XG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wcykge1xuICAgICAgICAgICAgZXhwcmVzc2lvbi5wdXNoKFsnPT0nLCBnZXQsIHN0b3BbMF1dLCBzdG9wWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb24ucHVzaChnZXRGYWxsYmFjayhwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpKTtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbJ21hdGNoJywgZ2V0XTtcbiAgICAgICAgZm9yIChjb25zdCBzdG9wIG9mIHN0b3BzKSB7XG4gICAgICAgICAgICBhcHBlbmRTdG9wUGFpcihleHByZXNzaW9uLCBzdG9wWzBdLCBzdG9wWzFdLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwcmVzc2lvbi5wdXNoKGdldEZhbGxiYWNrKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykpO1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFsnc3RlcCcsIFsnbnVtYmVyJywgZ2V0XV07XG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wcykge1xuICAgICAgICAgICAgYXBwZW5kU3RvcFBhaXIoZXhwcmVzc2lvbiwgc3RvcFswXSwgc3RvcFsxXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4dXBEZWdlbmVyYXRlU3RlcEN1cnZlKGV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5kZWZhdWx0ID09PSB1bmRlZmluZWQgPyBleHByZXNzaW9uIDogW1xuICAgICAgICAgICAgJ2Nhc2UnLFxuICAgICAgICAgICAgWyc9PScsIFsndHlwZW9mJywgZ2V0XSwgJ251bWJlciddLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGNvbnZlcnRMaXRlcmFsKHBhcmFtZXRlcnMuZGVmYXVsdClcbiAgICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFtcbiAgICAgICAgICAgIGdldEludGVycG9sYXRlT3BlcmF0b3IocGFyYW1ldGVycyksXG4gICAgICAgICAgICBiYXNlID09PSAxID8gW1wibGluZWFyXCJdIDogW1wiZXhwb25lbnRpYWxcIiwgYmFzZV0sXG4gICAgICAgICAgICBbXCJudW1iZXJcIiwgZ2V0XVxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wcykge1xuICAgICAgICAgICAgYXBwZW5kU3RvcFBhaXIoZXhwcmVzc2lvbiwgc3RvcFswXSwgc3RvcFsxXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmRlZmF1bHQgPT09IHVuZGVmaW5lZCA/IGV4cHJlc3Npb24gOiBbXG4gICAgICAgICAgICAnY2FzZScsXG4gICAgICAgICAgICBbJz09JywgWyd0eXBlb2YnLCBnZXRdLCAnbnVtYmVyJ10sXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgY29udmVydExpdGVyYWwocGFyYW1ldGVycy5kZWZhdWx0KVxuICAgICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9wZXJ0eSBmdW5jdGlvbiB0eXBlICR7dHlwZX1gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRab29tRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBzdG9wcywgaW5wdXQgPSBbJ3pvb20nXSkge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRGdW5jdGlvblR5cGUocGFyYW1ldGVycywgcHJvcGVydHlTcGVjKTtcbiAgICBsZXQgZXhwcmVzc2lvbjtcbiAgICBsZXQgaXNTdGVwID0gZmFsc2U7XG4gICAgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgZXhwcmVzc2lvbiA9IFsnc3RlcCcsIGlucHV0XTtcbiAgICAgICAgaXNTdGVwID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IFtnZXRJbnRlcnBvbGF0ZU9wZXJhdG9yKHBhcmFtZXRlcnMpLCBiYXNlID09PSAxID8gW1wibGluZWFyXCJdIDogW1wiZXhwb25lbnRpYWxcIiwgYmFzZV0sIGlucHV0XTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB6b29tIGZ1bmN0aW9uIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0b3Agb2Ygc3RvcHMpIHtcbiAgICAgICAgYXBwZW5kU3RvcFBhaXIoZXhwcmVzc2lvbiwgc3RvcFswXSwgc3RvcFsxXSwgaXNTdGVwKTtcbiAgICB9XG5cbiAgICBmaXh1cERlZ2VuZXJhdGVTdGVwQ3VydmUoZXhwcmVzc2lvbik7XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gZml4dXBEZWdlbmVyYXRlU3RlcEN1cnZlKGV4cHJlc3Npb24pIHtcbiAgICAvLyBkZWdlbmVyYXRlIHN0ZXAgY3VydmUgKGkuZS4gYSBjb25zdGFudCBmdW5jdGlvbik6IGFkZCBhIG5vb3Agc3RvcFxuICAgIGlmIChleHByZXNzaW9uWzBdID09PSAnc3RlcCcgJiYgZXhwcmVzc2lvbi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgZXhwcmVzc2lvbi5wdXNoKDApO1xuICAgICAgICBleHByZXNzaW9uLnB1c2goZXhwcmVzc2lvblszXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRTdG9wUGFpcihjdXJ2ZSwgaW5wdXQsIG91dHB1dCwgaXNTdGVwKSB7XG4gICAgLy8gU2tpcCBkdXBsaWNhdGUgc3RvcCB2YWx1ZXMuIFRoZXkgd2VyZSBub3QgdmFsaWRhdGVkIGZvciBmdW5jdGlvbnMsIGJ1dCB0aGV5IGFyZSBmb3IgZXhwcmVzc2lvbnMuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzQxMDdcbiAgICBpZiAoY3VydmUubGVuZ3RoID4gMyAmJiBpbnB1dCA9PT0gY3VydmVbY3VydmUubGVuZ3RoIC0gMl0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBzdGVwIGN1cnZlcyBkb24ndCBnZXQgdGhlIGZpcnN0IGlucHV0IHZhbHVlLCBhcyBpdCBpcyByZWR1bmRhbnQuXG4gICAgaWYgKCEoaXNTdGVwICYmIGN1cnZlLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgICAgY3VydmUucHVzaChpbnB1dCk7XG4gICAgfVxuICAgIGN1cnZlLnB1c2gob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gZ2V0RnVuY3Rpb25UeXBlKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykge1xuICAgIGlmIChwYXJhbWV0ZXJzLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMudHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQocHJvcGVydHlTcGVjLmV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gKHByb3BlcnR5U3BlYy5leHByZXNzaW9uOiBhbnkpLmludGVycG9sYXRlZCA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnO1xuICAgIH1cbn1cblxuLy8gXCJTdHJpbmcgd2l0aCB7bmFtZX0gdG9rZW5cIiA9PiBbXCJjb25jYXRcIiwgXCJTdHJpbmcgd2l0aCBcIiwgW1wiZ2V0XCIsIFwibmFtZVwiXSwgXCIgdG9rZW5cIl1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9rZW5TdHJpbmcoczogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gWydjb25jYXQnXTtcbiAgICBjb25zdCByZSA9IC97KFtee31dKyl9L2c7XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgZm9yIChsZXQgbWF0Y2ggPSByZS5leGVjKHMpOyBtYXRjaCAhPT0gbnVsbDsgbWF0Y2ggPSByZS5leGVjKHMpKSB7XG4gICAgICAgIGNvbnN0IGxpdGVyYWwgPSBzLnNsaWNlKHBvcywgcmUubGFzdEluZGV4IC0gbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgcG9zID0gcmUubGFzdEluZGV4O1xuICAgICAgICBpZiAobGl0ZXJhbC5sZW5ndGggPiAwKSByZXN1bHQucHVzaChsaXRlcmFsKTtcbiAgICAgICAgcmVzdWx0LnB1c2goWydnZXQnLCBtYXRjaFsxXV0pO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIGlmIChwb3MgPCBzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQucHVzaChzLnNsaWNlKHBvcykpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gWyd0by1zdHJpbmcnLCByZXN1bHRbMV1dO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7R2xvYmFsUHJvcGVydGllcywgRmVhdHVyZX0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbnR5cGUgRmlsdGVyRXhwcmVzc2lvbiA9IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGJvb2xlYW47XG5leHBvcnQgdHlwZSBGZWF0dXJlRmlsdGVyID17ZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uLCBuZWVkR2VvbWV0cnk6IGJvb2xlYW59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGaWx0ZXI7XG5leHBvcnQge2lzRXhwcmVzc2lvbkZpbHRlcn07XG5cbmZ1bmN0aW9uIGlzRXhwcmVzc2lvbkZpbHRlcihmaWx0ZXI6IGFueSkge1xuICAgIGlmIChmaWx0ZXIgPT09IHRydWUgfHwgZmlsdGVyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyKSB8fCBmaWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3dpdGNoIChmaWx0ZXJbMF0pIHtcbiAgICBjYXNlICdoYXMnOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA+PSAyICYmIGZpbHRlclsxXSAhPT0gJyRpZCcgJiYgZmlsdGVyWzFdICE9PSAnJHR5cGUnO1xuXG4gICAgY2FzZSAnaW4nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA+PSAzICYmICh0eXBlb2YgZmlsdGVyWzFdICE9PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGZpbHRlclsyXSkpO1xuXG4gICAgY2FzZSAnIWluJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCAhPT0gMyB8fCAoQXJyYXkuaXNBcnJheShmaWx0ZXJbMV0pIHx8IEFycmF5LmlzQXJyYXkoZmlsdGVyWzJdKSk7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGYpICYmIHR5cGVvZiBmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmNvbnN0IGZpbHRlclNwZWMgPSB7XG4gICAgJ3R5cGUnOiAnYm9vbGVhbicsXG4gICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAndHJhbnNpdGlvbic6IGZhbHNlLFxuICAgICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJyxcbiAgICAnZXhwcmVzc2lvbic6IHtcbiAgICAgICAgJ2ludGVycG9sYXRlZCc6IGZhbHNlLFxuICAgICAgICAncGFyYW1ldGVycyc6IFsnem9vbScsICdmZWF0dXJlJ11cbiAgICB9XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSk6IEZlYXR1cmVGaWx0ZXIge1xuICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6ICgpID0+IHRydWUsIG5lZWRHZW9tZXRyeTogZmFsc2V9O1xuICAgIH1cblxuICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gY29udmVydEZpbHRlcihmaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkID0gY3JlYXRlRXhwcmVzc2lvbihmaWx0ZXIsIGZpbHRlclNwZWMpO1xuICAgIGlmIChjb21waWxlZC5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gZ2VvbWV0cnlOZWVkZWQoZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGNvbXBpbGVkLnZhbHVlLmV2YWx1YXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgbmVlZEdlb21ldHJ5fTtcbiAgICB9XG59XG5cbi8vIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc29ydCBudW1iZXJzIGFuZCBzdHJpbmdzXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGdlb21ldHJ5TmVlZGVkKGZpbHRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGZpbHRlclswXSA9PT0gJ3dpdGhpbicpIHJldHVybiB0cnVlO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBmaWx0ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGlmIChnZW9tZXRyeU5lZWRlZChmaWx0ZXJbaW5kZXhdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29udmVydEZpbHRlcihmaWx0ZXI6ID9BcnJheTxhbnk+KTogbWl4ZWQge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBvcCA9IGZpbHRlclswXTtcbiAgICBpZiAoZmlsdGVyLmxlbmd0aCA8PSAxKSByZXR1cm4gKG9wICE9PSAnYW55Jyk7XG4gICAgY29uc3QgY29udmVydGVkID1cbiAgICAgICAgb3AgPT09ICc9PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSA6XG4gICAgICAgIG9wID09PSAnIT0nID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sICc9PScpKSA6XG4gICAgICAgIG9wID09PSAnPCcgfHxcbiAgICAgICAgb3AgPT09ICc+JyB8fFxuICAgICAgICBvcCA9PT0gJzw9JyB8fFxuICAgICAgICBvcCA9PT0gJz49JyA/IGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sIG9wKSA6XG4gICAgICAgIG9wID09PSAnYW55JyA/IGNvbnZlcnREaXNqdW5jdGlvbk9wKGZpbHRlci5zbGljZSgxKSkgOlxuICAgICAgICBvcCA9PT0gJ2FsbCcgPyBbJ2FsbCddLmNvbmNhdChmaWx0ZXIuc2xpY2UoMSkubWFwKGNvbnZlcnRGaWx0ZXIpKSA6XG4gICAgICAgIG9wID09PSAnbm9uZScgPyBbJ2FsbCddLmNvbmNhdChmaWx0ZXIuc2xpY2UoMSkubWFwKGNvbnZlcnRGaWx0ZXIpLm1hcChjb252ZXJ0TmVnYXRpb24pKSA6XG4gICAgICAgIG9wID09PSAnaW4nID8gY29udmVydEluT3AoZmlsdGVyWzFdLCBmaWx0ZXIuc2xpY2UoMikpIDpcbiAgICAgICAgb3AgPT09ICchaW4nID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSkgOlxuICAgICAgICBvcCA9PT0gJ2hhcycgPyBjb252ZXJ0SGFzT3AoZmlsdGVyWzFdKSA6XG4gICAgICAgIG9wID09PSAnIWhhcycgPyBjb252ZXJ0TmVnYXRpb24oY29udmVydEhhc09wKGZpbHRlclsxXSkpIDpcbiAgICAgICAgb3AgPT09ICd3aXRoaW4nID8gZmlsdGVyIDpcbiAgICAgICAgdHJ1ZTtcbiAgICByZXR1cm4gY29udmVydGVkO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q29tcGFyaXNvbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItdHlwZS0ke29wfWAsIHZhbHVlXTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaWQtJHtvcH1gLCB2YWx1ZV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLSR7b3B9YCwgcHJvcGVydHksIHZhbHVlXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREaXNqdW5jdGlvbk9wKGZpbHRlcnM6IEFycmF5PEFycmF5PGFueT4+KSB7XG4gICAgcmV0dXJuIFsnYW55J10uY29uY2F0KGZpbHRlcnMubWFwKGNvbnZlcnRGaWx0ZXIpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydEluT3AocHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBBcnJheTxhbnk+KSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtaW5gLCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaWQtaW5gLCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDIwMCAmJiAhdmFsdWVzLnNvbWUodiA9PiB0eXBlb2YgdiAhPT0gdHlwZW9mIHZhbHVlc1swXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1sYXJnZScsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXMuc29ydChjb21wYXJlKV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFsnZmlsdGVyLWluLXNtYWxsJywgcHJvcGVydHksIFsnbGl0ZXJhbCcsIHZhbHVlc11dO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0SGFzT3AocHJvcGVydHk6IHN0cmluZykge1xuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJyRpZCc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci1oYXMtaWRgXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzYCwgcHJvcGVydHldO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydE5lZ2F0aW9uKGZpbHRlcjogbWl4ZWQpIHtcbiAgICByZXR1cm4gWychJywgZmlsdGVyXTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7aXNFeHByZXNzaW9uRmlsdGVyfSBmcm9tICcuL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb259IGZyb20gJy4uL3R5cGVzLmpzJztcblxudHlwZSBFeHBlY3RlZFR5cGVzID0ge1tfOiBzdHJpbmddOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nfTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBsZWdhY3kgZmlsdGVyIHRvICh0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZikgYW5cbiAqIGVxdWl2YWxlbnQgZXhwcmVzc2lvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udmVydEZpbHRlcihmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24pOiBtaXhlZCB7XG4gICAgcmV0dXJuIF9jb252ZXJ0RmlsdGVyKGZpbHRlciwge30pO1xufVxuXG4vKlxuICogQ29udmVydCB0aGUgZ2l2ZW4gZmlsdGVyIHRvIGFuIGV4cHJlc3Npb24sIHN0b3JpbmcgdGhlIGV4cGVjdGVkIHR5cGVzIGZvclxuICogYW55IGZlYXR1cmUgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIGV4cGVjdGVkVHlwZXMuXG4gKlxuICogVGhlc2UgZXhwZWN0ZWQgdHlwZXMgYXJlIG5lZWRlZCBpbiBvcmRlciB0byBjb25zdHJ1Y3QgcHJlZmxpZ2h0IHR5cGUgY2hlY2tzXG4gKiBuZWVkZWQgZm9yIGhhbmRsaW5nICdhbnknIGZpbHRlcnMuIEEgcHJlZmxpZ2h0IHR5cGUgY2hlY2sgaXMgbmVjZXNzYXJ5IGluXG4gKiBvcmRlciB0byBtaW1pYyBsZWdhY3kgZmlsdGVycycgc2VtYW50aWNzIGFyb3VuZCBleHBlY3RlZCB0eXBlIG1pc21hdGNoZXMuXG4gKiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGxlZ2FjeSBmaWx0ZXI6XG4gKlxuICogICAgIFtcImFueVwiLCBbXCJhbGxcIiwgW1wiPlwiLCBcInlcIiwgMF0sIFtcIj5cIiwgXCJ5XCIsIDBdXSwgW1wiPlwiLCBcInhcIiwgMF1dXG4gKlxuICogTmFpdmVseSwgd2UgbWlnaHQgY29udmVydCB0aGlzIHRvIHRoZSBleHByZXNzaW9uOlxuICpcbiAqICAgICBbXCJhbnlcIiwgW1wiYWxsXCIsIFtcIj5cIiwgW1wiZ2V0XCIsIFwieVwiXSwgMF0sIFtcIj5cIiwgW1wiZ2V0XCIsIFwielwiXSwgMF1dLCBbXCI+XCIsIFtcImdldFwiLCBcInhcIl0sIDBdXVxuICpcbiAqIEJ1dCBpZiB3ZSB0cmllZCB0byBldmFsdWF0ZSB0aGlzIGFnYWluc3QsIHNheSBge3g6IDEsIHk6IG51bGwsIHo6IDB9YCwgdGhlXG4gKiBbXCI+XCIsIFtcImdldFwiLCBcInlcIl0sIDBdIHdvdWxkIGNhdXNlIGFuIGV2YWx1YXRpb24gZXJyb3IsIGxlYWRpbmcgdG8gdGhlXG4gKiBlbnRpcmUgZmlsdGVyIHJldHVybmluZyBmYWxzZS4gTGVnYWN5IGZpbHRlciBzZW1hbnRpY3MsIHRob3VnaCwgYXNrIGZvclxuICogW1wiPlwiLCBcInlcIiwgMF0gdG8gc2ltcGx5IHJldHVybiBgZmFsc2VgIHdoZW4gYHlgIGlzIG9mIHRoZSB3cm9uZyB0eXBlLFxuICogYWxsb3dpbmcgdGhlIHN1YnNlcXVlbnQgdGVybXMgb2YgdGhlIG91dGVyIFwiYW55XCIgZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWRcbiAqIChyZXN1bHRpbmcsIGluIHRoaXMgY2FzZSwgaW4gYSBgdHJ1ZWAgdmFsdWUsIGJlY2F1c2UgeCA+IDApLlxuICpcbiAqIFdlIGFjY291bnQgZm9yIHRoaXMgYnkgaW5zZXJ0aW5nIGEgcHJlZmxpZ2h0IHR5cGUtY2hlY2tpbmcgZXhwcmVzc2lvbiBiZWZvcmVcbiAqIGVhY2ggXCJhbnlcIiB0ZXJtLCBhbGxvd2luZyB1cyB0byBhdm9pZCBldmFsdWF0aW5nIHRoZSBhY3R1YWwgY29udmVydGVkIGZpbHRlclxuICogaWYgYW55IHR5cGUgbWlzbWF0Y2hlcyB3b3VsZCBjYXVzZSBpdCB0byBwcm9kdWNlIGFuIGV2YWxhdXRpb24gZXJyb3I6XG4gKlxuICogICAgIFtcImFueVwiLFxuICogICAgICAgW1wiY2FzZVwiLFxuICogICAgICAgICBbXCJhbGxcIiwgW1wiPT1cIiwgW1widHlwZW9mXCIsIFtcImdldFwiLCBcInlcIl1dLCBcIm51bWJlclwiXSwgW1wiPT1cIiwgW1widHlwZW9mXCIsIFtcImdldFwiLCBcInpcIl0sIFwibnVtYmVyXV0sXG4gKiAgICAgICAgIFtcImFsbFwiLCBbXCI+XCIsIFtcImdldFwiLCBcInlcIl0sIDBdLCBbXCI+XCIsIFtcImdldFwiLCBcInpcIl0sIDBdXSxcbiAqICAgICAgICAgZmFsc2VcbiAqICAgICAgIF0sXG4gKiAgICAgICBbXCJjYXNlXCIsXG4gKiAgICAgICAgIFtcIj09XCIsIFtcInR5cGVvZlwiLCBbXCJnZXRcIiwgXCJ4XCJdLCBcIm51bWJlclwiXV0sXG4gKiAgICAgICAgIFtcIj5cIiwgW1wiZ2V0XCIsIFwieFwiXSwgMF0sXG4gKiAgICAgICAgIGZhbHNlXG4gKiAgICAgICBdXG4gKiAgICAgXVxuICpcbiAqIEFuIGFsdGVybmF0aXZlLCBwb3NzaWJseSBtb3JlIGRpcmVjdCBhcHByb2FjaCB3b3VsZCBiZSB0byB1c2UgdHlwZSBjaGVja3NcbiAqIGluIHRoZSBjb252ZXJzaW9uIG9mIGVhY2ggY29tcGFyaXNvbiBvcGVyYXRvciwgc28gdGhhdCB0aGUgY29udmVydGVkIHZlcnNpb25cbiAqIG9mIGVhY2ggaW5kaXZpZHVhbCA9PSwgPj0sIGV0Yy4gd291bGQgbWltaWMgdGhlIGxlZ2FjeSBmaWx0ZXIgc2VtYW50aWNzLiBUaGVcbiAqIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBpdCBjYW4gbGVhZCB0byBtYW55IG1vcmUgdHlwZSBjaGVja3MgdGhhblxuICogd291bGQgb3RoZXJ3aXNlIGJlIG5lY2Vzc2FyeTogb3V0c2lkZSB0aGUgY29udGV4dCBvZiBhbiBcImFueVwiIGV4cHJlc3Npb24sXG4gKiBiYWlsaW5nIG91dCBkdWUgdG8gYSBydW50aW1lIHR5cGUgZXJyb3IgKGV4cHJlc3Npb24gc2VtYW50aWNzKSBhbmQgcmV0dXJuaW5nXG4gKiBmYWxzZSAobGVnYWN5IGZpbHRlciBzZW1hbnRpY3MpIGFyZSBlcXVpdmFsZW50OiB0aGV5IGNhdXNlIHRoZSBmaWx0ZXIgdG9cbiAqIHByb2R1Y2UgYSBgZmFsc2VgIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gX2NvbnZlcnRGaWx0ZXIoZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLCBleHBlY3RlZFR5cGVzOiBFeHBlY3RlZFR5cGVzKTogbWl4ZWQge1xuICAgIGlmIChpc0V4cHJlc3Npb25GaWx0ZXIoZmlsdGVyKSkgeyByZXR1cm4gZmlsdGVyOyB9XG5cbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBmaWx0ZXJbMF07XG4gICAgaWYgKGZpbHRlci5sZW5ndGggPD0gMSkgcmV0dXJuIChvcCAhPT0gJ2FueScpO1xuXG4gICAgbGV0IGNvbnZlcnRlZDtcblxuICAgIGlmIChcbiAgICAgICAgb3AgPT09ICc9PScgfHxcbiAgICAgICAgb3AgPT09ICchPScgfHxcbiAgICAgICAgb3AgPT09ICc8JyB8fFxuICAgICAgICBvcCA9PT0gJz4nIHx8XG4gICAgICAgIG9wID09PSAnPD0nIHx8XG4gICAgICAgIG9wID09PSAnPj0nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IFssIHByb3BlcnR5LCB2YWx1ZV0gPSAoZmlsdGVyOiBhbnkpO1xuICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0Q29tcGFyaXNvbk9wKHByb3BlcnR5LCB2YWx1ZSwgb3AsIGV4cGVjdGVkVHlwZXMpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICdhbnknKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGZpbHRlcjogYW55KS5zbGljZSgxKS5tYXAoZiA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBfY29udmVydEZpbHRlcihmLCB0eXBlcyk7XG4gICAgICAgICAgICBjb25zdCB0eXBlY2hlY2tzID0gcnVudGltZVR5cGVDaGVja3ModHlwZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVjaGVja3MgPT09IHRydWUgPyBjaGlsZCA6IFsnY2FzZScsIHR5cGVjaGVja3MsIGNoaWxkLCBmYWxzZV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gWydhbnknXS5jb25jYXQoY2hpbGRyZW4pO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICdhbGwnKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGZpbHRlcjogYW55KS5zbGljZSgxKS5tYXAoZiA9PiBfY29udmVydEZpbHRlcihmLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5sZW5ndGggPiAxID8gWydhbGwnXS5jb25jYXQoY2hpbGRyZW4pIDogW10uY29uY2F0KC4uLmNoaWxkcmVuKTtcbiAgICB9IGVsc2UgaWYgKG9wID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIFsnIScsIF9jb252ZXJ0RmlsdGVyKFsnYW55J10uY29uY2F0KGZpbHRlci5zbGljZSgxKSksIHt9KV07XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gJ2luJykge1xuICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0SW5PcCgoZmlsdGVyWzFdOiBhbnkpLCBmaWx0ZXIuc2xpY2UoMikpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICchaW4nKSB7XG4gICAgICAgIGNvbnZlcnRlZCA9IGNvbnZlcnRJbk9wKChmaWx0ZXJbMV06IGFueSksIGZpbHRlci5zbGljZSgyKSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gJ2hhcycpIHtcbiAgICAgICAgY29udmVydGVkID0gY29udmVydEhhc09wKChmaWx0ZXJbMV06IGFueSkpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICchaGFzJykge1xuICAgICAgICBjb252ZXJ0ZWQgPSBbJyEnLCBjb252ZXJ0SGFzT3AoKGZpbHRlclsxXTogYW55KSldO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnZlcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuLy8gR2l2ZW4gYSBzZXQgb2YgZmVhdHVyZSBwcm9wZXJ0aWVzIGFuZCBhbiBleHBlY3RlZCB0eXBlIGZvciBlYWNoIG9uZSxcbi8vIGNvbnN0cnVjdCBhbiBib29sZWFuIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGVhY2ggcHJvcGVydHkgaGFzIHRoZVxuLy8gcmlnaHQgdHlwZS5cbi8vIEUuZy46IGZvciB7bmFtZTogJ3N0cmluZycsIHBvcHVsYXRpb246ICdudW1iZXInfSwgcmV0dXJuXG4vLyBbICdhbGwnLFxuLy8gICBbJz09JywgWyd0eXBlb2YnLCBbJ2dldCcsICduYW1lJ10sICdzdHJpbmcnXV0sXG4vLyAgIFsnPT0nLCBbJ3R5cGVvZicsIFsnZ2V0JywgJ3BvcHVsYXRpb24nXSwgJ251bWJlcl1dXG4vLyBdXG5mdW5jdGlvbiBydW50aW1lVHlwZUNoZWNrcyhleHBlY3RlZFR5cGVzOiBFeHBlY3RlZFR5cGVzKSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZXhwZWN0ZWRUeXBlcykge1xuICAgICAgICBjb25zdCBnZXQgPSBwcm9wZXJ0eSA9PT0gJyRpZCcgPyBbJ2lkJ10gOiBbJ2dldCcsIHByb3BlcnR5XTtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKFsnPT0nLCBbJ3R5cGVvZicsIGdldF0sIGV4cGVjdGVkVHlwZXNbcHJvcGVydHldXSk7XG4gICAgfVxuICAgIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSByZXR1cm4gY29uZGl0aW9uc1swXTtcbiAgICByZXR1cm4gWydhbGwnXS5jb25jYXQoY29uZGl0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDb21wYXJpc29uT3AocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSwgb3A6IHN0cmluZywgZXhwZWN0ZWRUeXBlczogP0V4cGVjdGVkVHlwZXMpIHtcbiAgICBsZXQgZ2V0O1xuICAgIGlmIChwcm9wZXJ0eSA9PT0gJyR0eXBlJykge1xuICAgICAgICByZXR1cm4gW29wLCBbJ2dlb21ldHJ5LXR5cGUnXSwgdmFsdWVdO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICckaWQnKSB7XG4gICAgICAgIGdldCA9IFsnaWQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnZXQgPSBbJ2dldCcsIHByb3BlcnR5XTtcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0ZWRUeXBlcyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0eXBlID0gKCh0eXBlb2YgdmFsdWUpOiBhbnkpO1xuICAgICAgICBleHBlY3RlZFR5cGVzW3Byb3BlcnR5XSA9IHR5cGU7XG4gICAgfVxuXG4gICAgaWYgKG9wID09PSAnPT0nICYmIHByb3BlcnR5ICE9PSAnJGlkJyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2FsbCcsXG4gICAgICAgICAgICBbJ2hhcycsIHByb3BlcnR5XSwgLy8gbWlzc2luZyBwcm9wZXJ0eSAhPSBudWxsIGZvciBsZWdhY3kgZmlsdGVyc1xuICAgICAgICAgICAgWyc9PScsIGdldCwgbnVsbF1cbiAgICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKG9wID09PSAnIT0nICYmIHByb3BlcnR5ICE9PSAnJGlkJyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2FueScsXG4gICAgICAgICAgICBbJyEnLCBbJ2hhcycsIHByb3BlcnR5XV0sIC8vIG1pc3NpbmcgcHJvcGVydHkgIT0gbnVsbCBmb3IgbGVnYWN5IGZpbHRlcnNcbiAgICAgICAgICAgIFsnIT0nLCBnZXQsIG51bGxdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtvcCwgZ2V0LCB2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogQXJyYXk8YW55PiwgbmVnYXRlID0gZmFsc2UpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5lZ2F0ZTtcblxuICAgIGxldCBnZXQ7XG4gICAgaWYgKHByb3BlcnR5ID09PSAnJHR5cGUnKSB7XG4gICAgICAgIGdldCA9IFsnZ2VvbWV0cnktdHlwZSddO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICckaWQnKSB7XG4gICAgICAgIGdldCA9IFsnaWQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnZXQgPSBbJ2dldCcsIHByb3BlcnR5XTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGxpc3Qgb2YgdmFsdWVzIHRvIGJlIHNlYXJjaGVkIGlzIGhvbW9nZW5vdXNseSB0eXBlZC5cbiAgICAvLyBJZiBzbyAoYW5kIGlmIHRoZSB0eXBlIGlzIHN0cmluZyBvciBudW1iZXIpLCB0aGVuIHdlIGNhbiB1c2UgYVxuICAgIC8vIFttYXRjaCwgaW5wdXQsIFsuLi52YWx1ZXNdLCB0cnVlLCBmYWxzZV0gY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIGFcbiAgICAvLyBidW5jaCBvZiBgPT1gIHRlc3RzLlxuICAgIGxldCB1bmlmb3JtVHlwZXMgPSB0cnVlO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIHVuaWZvcm1UeXBlcyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5pZm9ybVR5cGVzICYmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgLy8gTWF0Y2ggZXhwcmVzc2lvbnMgbXVzdCBoYXZlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICAgIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IHZhbHVlcy5zb3J0KCkuZmlsdGVyKCh2LCBpKSA9PiBpID09PSAwIHx8IHZhbHVlc1tpIC0gMV0gIT09IHYpO1xuICAgICAgICByZXR1cm4gWydtYXRjaCcsIGdldCwgdW5pcXVlVmFsdWVzLCAhbmVnYXRlLCBuZWdhdGVdO1xuICAgIH1cblxuICAgIHJldHVybiBbIG5lZ2F0ZSA/ICdhbGwnIDogJ2FueScgXS5jb25jYXQoXG4gICAgICAgIHZhbHVlcy5tYXAodiA9PiBbbmVnYXRlID8gJyE9JyA6ICc9PScsIGdldCwgdl0pXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gY29udmVydEhhc09wKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvcGVydHkgPT09ICckdHlwZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PT0gJyRpZCcpIHtcbiAgICAgICAgcmV0dXJuIFsnIT0nLCBbJ2lkJ10sIG51bGxdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbJ2hhcycsIHByb3BlcnR5XTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGVhY2hMYXllcixcbiAgICBlYWNoUHJvcGVydHlcbn0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IGNvbnZlcnRGdW5jdGlvbiwge2NvbnZlcnRUb2tlblN0cmluZ30gZnJvbSAnLi4vZnVuY3Rpb24vY29udmVydC5qcyc7XG5pbXBvcnQgY29udmVydEZpbHRlciBmcm9tICcuLi9mZWF0dXJlX2ZpbHRlci9jb252ZXJ0LmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIE1pZ3JhdGUgdGhlIGdpdmVuIHN0eWxlIG9iamVjdCBpbiBwbGFjZSB0byB1c2UgZXhwcmVzc2lvbnMuIFNwZWNpZmljYWxseSxcbiAqIHRoaXMgd2lsbCBjb252ZXJ0IChhKSBcInN0b3BcIiBmdW5jdGlvbnMsIGFuZCAoYikgbGVnYWN5IGZpbHRlcnMgdG8gdGhlaXJcbiAqIGV4cHJlc3Npb24gZXF1aXZhbGVudHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24pIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBbXTtcblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGlmIChsYXllci5maWx0ZXIpIHtcbiAgICAgICAgICAgIGxheWVyLmZpbHRlciA9IChjb252ZXJ0RmlsdGVyKGxheWVyLmZpbHRlcik6IGFueSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVhY2hQcm9wZXJ0eShzdHlsZSwge3BhaW50OiB0cnVlLCBsYXlvdXQ6IHRydWV9LCAoe3BhdGgsIHZhbHVlLCByZWZlcmVuY2UsIHNldH0pID0+IHtcbiAgICAgICAgaWYgKGlzRXhwcmVzc2lvbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBzZXQoY29udmVydEZ1bmN0aW9uKHZhbHVlLCByZWZlcmVuY2UpKTtcbiAgICAgICAgICAgIGNvbnZlcnRlZC5wdXNoKHBhdGguam9pbignLicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2UudG9rZW5zICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNldChjb252ZXJ0VG9rZW5TdHJpbmcodmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0eWxlO1xufVxuXG4iLCJcbmltcG9ydCBtaWdyYXRlVG9WOCBmcm9tICcuL21pZ3JhdGUvdjguanMnO1xuaW1wb3J0IG1pZ3JhdGVUb0V4cHJlc3Npb25zIGZyb20gJy4vbWlncmF0ZS9leHByZXNzaW9ucy5qcyc7XG5cbi8qKlxuICogTWlncmF0ZSBhIE1hcGJveCBHTCBTdHlsZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBhbGlhcyBtaWdyYXRlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGUgYSBNYXBib3ggR0wgU3R5bGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IGEgbWlncmF0ZWQgc3R5bGVcbiAqIEBleGFtcGxlXG4gKiB2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuICogdmFyIG1pZ3JhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYycpLm1pZ3JhdGU7XG4gKiB2YXIgc3R5bGUgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc3R5bGUuanNvbicsICd1dGY4Jyk7XG4gKiBmcy53cml0ZUZpbGVTeW5jKCcuL3N0eWxlLmpzb24nLCBKU09OLnN0cmluZ2lmeShtaWdyYXRlKHN0eWxlKSkpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHlsZSkge1xuICAgIGxldCBtaWdyYXRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHN0eWxlLnZlcnNpb24gPT09IDcpIHtcbiAgICAgICAgc3R5bGUgPSBtaWdyYXRlVG9WOChzdHlsZSk7XG4gICAgICAgIG1pZ3JhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3R5bGUudmVyc2lvbiA9PT0gOCkge1xuICAgICAgICBtaWdyYXRlZCA9IG1pZ3JhdGVUb0V4cHJlc3Npb25zKHN0eWxlKTtcbiAgICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghbWlncmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgbWlncmF0ZSBmcm9tJywgc3R5bGUudmVyc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICBjb25zdCBzdHlsZUlEcyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZUlEcyA9IFtdO1xuICAgIGNvbnN0IGNvbXBvc2l0ZWRTb3VyY2VMYXllcnMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaWQgaW4gc3R5bGUuc291cmNlcykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzW2lkXTtcblxuICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09IFwidmVjdG9yXCIpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IC9ebWFwYm94OlxcL1xcLyguKikvLmV4ZWMoc291cmNlLnVybCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBzdHlsZUlEcy5wdXNoKGlkKTtcbiAgICAgICAgc291cmNlSURzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIGlmIChzdHlsZUlEcy5sZW5ndGggPCAyKVxuICAgICAgICByZXR1cm4gc3R5bGU7XG5cbiAgICBzdHlsZUlEcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBkZWxldGUgc3R5bGUuc291cmNlc1tpZF07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wb3NpdGVJRCA9IHNvdXJjZUlEcy5qb2luKFwiLFwiKTtcblxuICAgIHN0eWxlLnNvdXJjZXNbY29tcG9zaXRlSURdID0ge1xuICAgICAgICBcInR5cGVcIjogXCJ2ZWN0b3JcIixcbiAgICAgICAgXCJ1cmxcIjogYG1hcGJveDovLyR7Y29tcG9zaXRlSUR9YFxuICAgIH07XG5cbiAgICBzdHlsZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgaWYgKHN0eWxlSURzLmluZGV4T2YobGF5ZXIuc291cmNlKSA+PSAwKSB7XG4gICAgICAgICAgICBsYXllci5zb3VyY2UgPSBjb21wb3NpdGVJRDtcblxuICAgICAgICAgICAgaWYgKCdzb3VyY2UtbGF5ZXInIGluIGxheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZWRTb3VyY2VMYXllcnMuaW5kZXhPZihsYXllclsnc291cmNlLWxheWVyJ10pID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBzb3VyY2UgbGF5ZXIgbmFtZXMnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVkU291cmNlTGF5ZXJzLnB1c2gobGF5ZXJbJ3NvdXJjZS1sYXllciddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzdHlsZTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJywgJ2ZpbHRlcicsICdsYXlvdXQnXTtcbiIsIlxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzJztcblxuZnVuY3Rpb24gZGVyZWYobGF5ZXIsIHBhcmVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIGxheWVyKSB7XG4gICAgICAgIGlmIChrICE9PSAncmVmJykge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gbGF5ZXJba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZQcm9wZXJ0aWVzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgaWYgKGsgaW4gcGFyZW50KSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBwYXJlbnRba107XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlcmVmTGF5ZXJzO1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgc29tZSBvZiB3aGljaCBtYXkgY29udGFpbiBgcmVmYCBwcm9wZXJ0aWVzXG4gKiB3aG9zZSB2YWx1ZSBpcyB0aGUgYGlkYCBvZiBhbm90aGVyIHByb3BlcnR5LCByZXR1cm4gYSBuZXcgYXJyYXkgd2hlcmVcbiAqIHN1Y2ggbGF5ZXJzIGhhdmUgYmVlbiBhdWdtZW50ZWQgd2l0aCB0aGUgJ3R5cGUnLCAnc291cmNlJywgZXRjLiBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSBwYXJlbnQgbGF5ZXIsIGFuZCB0aGUgYHJlZmAgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnNcbiAqIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PExheWVyPn1cbiAqL1xuZnVuY3Rpb24gZGVyZWZMYXllcnMobGF5ZXJzKSB7XG4gICAgbGF5ZXJzID0gbGF5ZXJzLnNsaWNlKCk7XG5cbiAgICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcFtsYXllcnNbaV0uaWRdID0gbGF5ZXJzW2ldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgncmVmJyBpbiBsYXllcnNbaV0pIHtcbiAgICAgICAgICAgIGxheWVyc1tpXSA9IGRlcmVmKGxheWVyc1tpXSwgbWFwW2xheWVyc1tpXS5yZWZdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG59XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIERlZXBseSBjb21wYXJlcyB0d28gb2JqZWN0IGxpdGVyYWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChhOiA/bWl4ZWQsIGI6ID9taXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISh0eXBlb2YgYiA9PT0gJ29iamVjdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWVwRXF1YWw7XG4iLCJcbmltcG9ydCBpc0VxdWFsIGZyb20gJy4vdXRpbC9kZWVwX2VxdWFsLmpzJztcblxuY29uc3Qgb3BlcmF0aW9ucyA9IHtcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0U3R5bGUnLCBhcmdzOiBbc3R5bGVzaGVldF0gfVxuICAgICAqL1xuICAgIHNldFN0eWxlOiAnc2V0U3R5bGUnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdhZGRMYXllcicsIGFyZ3M6IFtsYXllciwgJ2JlZm9yZUxheWVySWQnXSB9XG4gICAgICovXG4gICAgYWRkTGF5ZXI6ICdhZGRMYXllcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3JlbW92ZUxheWVyJywgYXJnczogWydsYXllcklkJ10gfVxuICAgICAqL1xuICAgIHJlbW92ZUxheWVyOiAncmVtb3ZlTGF5ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRQYWludFByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldFBhaW50UHJvcGVydHk6ICdzZXRQYWludFByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5b3V0UHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6ICdzZXRMYXlvdXRQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEZpbHRlcicsIGFyZ3M6IFsnbGF5ZXJJZCcsIGZpbHRlcl0gfVxuICAgICAqL1xuICAgIHNldEZpbHRlcjogJ3NldEZpbHRlcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ2FkZFNvdXJjZScsIGFyZ3M6IFsnc291cmNlSWQnLCBzb3VyY2VdIH1cbiAgICAgKi9cbiAgICBhZGRTb3VyY2U6ICdhZGRTb3VyY2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdyZW1vdmVTb3VyY2UnLCBhcmdzOiBbJ3NvdXJjZUlkJ10gfVxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZTogJ3JlbW92ZVNvdXJjZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEdlb0pTT05Tb3VyY2VEYXRhJywgYXJnczogWydzb3VyY2VJZCcsIGRhdGFdIH1cbiAgICAgKi9cbiAgICBzZXRHZW9KU09OU291cmNlRGF0YTogJ3NldEdlb0pTT05Tb3VyY2VEYXRhJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5ZXJab29tUmFuZ2UnLCBhcmdzOiBbJ2xheWVySWQnLCAwLCAyMl0gfVxuICAgICAqL1xuICAgIHNldExheWVyWm9vbVJhbmdlOiAnc2V0TGF5ZXJab29tUmFuZ2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXllclByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldExheWVyUHJvcGVydHk6ICdzZXRMYXllclByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0Q2VudGVyJywgYXJnczogW1tsb24sIGxhdF1dIH1cbiAgICAgKi9cbiAgICBzZXRDZW50ZXI6ICdzZXRDZW50ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRab29tJywgYXJnczogW3pvb21dIH1cbiAgICAgKi9cbiAgICBzZXRab29tOiAnc2V0Wm9vbScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEJlYXJpbmcnLCBhcmdzOiBbYmVhcmluZ10gfVxuICAgICAqL1xuICAgIHNldEJlYXJpbmc6ICdzZXRCZWFyaW5nJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0UGl0Y2gnLCBhcmdzOiBbcGl0Y2hdIH1cbiAgICAgKi9cbiAgICBzZXRQaXRjaDogJ3NldFBpdGNoJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0U3ByaXRlJywgYXJnczogWydzcHJpdGVVcmwnXSB9XG4gICAgICovXG4gICAgc2V0U3ByaXRlOiAnc2V0U3ByaXRlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0R2x5cGhzJywgYXJnczogWydnbHlwaHNVcmwnXSB9XG4gICAgICovXG4gICAgc2V0R2x5cGhzOiAnc2V0R2x5cGhzJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0VHJhbnNpdGlvbicsIGFyZ3M6IFt0cmFuc2l0aW9uXSB9XG4gICAgICovXG4gICAgc2V0VHJhbnNpdGlvbjogJ3NldFRyYW5zaXRpb24nLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMaWdodGluZycsIGFyZ3M6IFtsaWdodFByb3BlcnRpZXNdIH1cbiAgICAgKi9cbiAgICBzZXRMaWdodDogJ3NldExpZ2h0JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0VGVycmFpbicsIGFyZ3M6IFt0ZXJyYWluUHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldFRlcnJhaW46ICdzZXRUZXJyYWluJyxcblxuICAgIC8qXG4gICAgICogIHsgY29tbWFuZDogJ3NldEZvZycsIGFyZ3M6IFtmb2dQcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0Rm9nOiAnc2V0Rm9nJ1xuXG59O1xuXG5mdW5jdGlvbiBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcykge1xuICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkU291cmNlLCBhcmdzOiBbc291cmNlSWQsIGFmdGVyW3NvdXJjZUlkXV19KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZVNvdXJjZSwgYXJnczogW3NvdXJjZUlkXX0pO1xuICAgIHNvdXJjZXNSZW1vdmVkW3NvdXJjZUlkXSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcyk7XG59XG5cbmZ1bmN0aW9uIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpIHtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWJlZm9yZVtzb3VyY2VJZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RhdGEnICYmICFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF1bcHJvcF0sIGFmdGVyW3NvdXJjZUlkXVtwcm9wXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXJbc291cmNlSWRdKSB7XG4gICAgICAgIGlmICghYWZ0ZXJbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRpZmZTb3VyY2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHNvdXJjZUlkO1xuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byByZW1vdmVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byBhZGQvdXBkYXRlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkgY29udGludWU7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF0sIGFmdGVyW3NvdXJjZUlkXSkpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBhZnRlcltzb3VyY2VJZF0udHlwZSA9PT0gJ2dlb2pzb24nICYmIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHZW9KU09OU291cmNlRGF0YSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF0uZGF0YV19KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gdXBkYXRlIGNvbW1hbmQsIG11c3QgcmVtb3ZlIHRoZW4gYWRkXG4gICAgICAgICAgICAgICAgdXBkYXRlU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBsYXllcklkLCBrbGFzcywgY29tbWFuZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHByb3A7XG5cbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlKSB7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZVtwcm9wXSwgYWZ0ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXX0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZCwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyW3Byb3BdLCBrbGFzc119KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Y2tJZChsYXllcikge1xuICAgIHJldHVybiBsYXllci5pZDtcbn1cbmZ1bmN0aW9uIGluZGV4QnlJZChncm91cCwgbGF5ZXIpIHtcbiAgICBncm91cFtsYXllci5pZF0gPSBsYXllcjtcbiAgICByZXR1cm4gZ3JvdXA7XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllcnMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwgW107XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCBbXTtcblxuICAgIC8vIG9yZGVyIG9mIGxheWVycyBieSBpZFxuICAgIGNvbnN0IGJlZm9yZU9yZGVyID0gYmVmb3JlLm1hcChwbHVja0lkKTtcbiAgICBjb25zdCBhZnRlck9yZGVyID0gYWZ0ZXIubWFwKHBsdWNrSWQpO1xuXG4gICAgLy8gaW5kZXggb2YgbGF5ZXIgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IGJlZm9yZS5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG4gICAgY29uc3QgYWZ0ZXJJbmRleCA9IGFmdGVyLnJlZHVjZShpbmRleEJ5SWQsIHt9KTtcblxuICAgIC8vIHRyYWNrIG9yZGVyIG9mIGxheWVycyBhcyBpZiB0aGV5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgY29uc3QgdHJhY2tlciA9IGJlZm9yZU9yZGVyLnNsaWNlKCk7XG5cbiAgICAvLyBsYXllcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgZG8gbm90IG5lZWQgdG8gYmUgZGlmZmVkXG4gICAgY29uc3QgY2xlYW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgbGV0IGksIGQsIGxheWVySWQsIGJlZm9yZUxheWVyLCBhZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkLCBwcm9wO1xuXG4gICAgLy8gcmVtb3ZlIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYmVmb3JlT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGJlZm9yZU9yZGVyW2ldO1xuICAgICAgICBpZiAoIWFmdGVySW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5pbmRleE9mKGxheWVySWQsIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQvcmVvcmRlciBsYXllcnNcbiAgICBmb3IgKGkgPSAwLCBkID0gMDsgaSA8IGFmdGVyT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gd29yayBiYWNrd2FyZHMgYXMgaW5zZXJ0IGlzIGJlZm9yZSBhbiBleGlzdGluZyBsYXllclxuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlclthZnRlck9yZGVyLmxlbmd0aCAtIDEgLSBpXTtcblxuICAgICAgICBpZiAodHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIDEgLSBpXSA9PT0gbGF5ZXJJZCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGJlZm9yZUluZGV4Lmhhc093blByb3BlcnR5KGxheWVySWQpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxheWVyIGJlZm9yZSB3ZSBpbnNlcnQgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkLCB0cmFja2VyLmxlbmd0aCAtIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbGF5ZXIgYXQgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIGldO1xuICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJJbmRleFtsYXllcklkXSwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF19KTtcbiAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sZW5ndGggLSBpLCAwLCBsYXllcklkKTtcbiAgICAgICAgY2xlYW5bbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlcltpXTtcbiAgICAgICAgYmVmb3JlTGF5ZXIgPSBiZWZvcmVJbmRleFtsYXllcklkXTtcbiAgICAgICAgYWZ0ZXJMYXllciA9IGFmdGVySW5kZXhbbGF5ZXJJZF07XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgcHJldmlvdXNseSBhZGRlZCAobmV3IG9yIG1vdmVkKVxuICAgICAgICBpZiAoY2xlYW5bbGF5ZXJJZF0gfHwgaXNFcXVhbChiZWZvcmVMYXllciwgYWZ0ZXJMYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSwgc291cmNlLWxheWVyLCBvciB0eXBlIGhhdmUgY2hhbmdlcywgdGhlbiByZW1vdmUgdGhlIGxheWVyXG4gICAgICAgIC8vIGFuZCBhZGQgaXQgYmFjayAnZnJvbSBzY3JhdGNoJy5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLnNvdXJjZSwgYWZ0ZXJMYXllci5zb3VyY2UpIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyWydzb3VyY2UtbGF5ZXInXSwgYWZ0ZXJMYXllclsnc291cmNlLWxheWVyJ10pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLnR5cGUsIGFmdGVyTGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgLy8gd2UgYWRkIHRoZSBsYXllciBiYWNrIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGl0IHdhcyBhbHJlYWR5IGluLCBzb1xuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgYHRyYWNrZXJgXG4gICAgICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxhc3RJbmRleE9mKGxheWVySWQpICsgMV07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF19KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGF5b3V0LCBwYWludCwgZmlsdGVyLCBtaW56b29tLCBtYXh6b29tXG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5sYXlvdXQsIGFmdGVyTGF5ZXIubGF5b3V0LCBjb21tYW5kcywgbGF5ZXJJZCwgbnVsbCwgb3BlcmF0aW9ucy5zZXRMYXlvdXRQcm9wZXJ0eSk7XG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5wYWludCwgYWZ0ZXJMYXllci5wYWludCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5maWx0ZXIsIGFmdGVyTGF5ZXIuZmlsdGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGaWx0ZXIsIGFyZ3M6IFtsYXllcklkLCBhZnRlckxheWVyLmZpbHRlcl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5taW56b29tKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci5tYXh6b29tLCBhZnRlckxheWVyLm1heHpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyWm9vbVJhbmdlLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5taW56b29tLCBhZnRlckxheWVyLm1heHpvb21dfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgYWxsIG90aGVyIGxheWVyIHByb3BzLCBpbmNsdWRpbmcgcGFpbnQuKlxuICAgICAgICBmb3IgKHByb3AgaW4gYmVmb3JlTGF5ZXIpIHtcbiAgICAgICAgICAgIGlmICghYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBhZnRlckxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWFmdGVyTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERpZmYgdHdvIHN0eWxlc2hlZXRcbiAqXG4gKiBDcmVhdGVzIHNlbWFudGljbHkgYXdhcmUgZGlmZnMgdGhhdCBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgYXQgcnVudGltZS5cbiAqIE9wZXJhdGlvbnMgcHJvZHVjZWQgYnkgdGhlIGRpZmYgY2xvc2VseSByZXNlbWJsZSB0aGUgbWFwYm94LWdsLWpzIEFQSS4gQW55XG4gKiBlcnJvciBjcmVhdGluZyB0aGUgZGlmZiB3aWxsIGZhbGwgYmFjayB0byB0aGUgJ3NldFN0eWxlJyBvcGVyYXRpb24uXG4gKlxuICogRXhhbXBsZSBkaWZmOlxuICogW1xuICogICAgIHsgY29tbWFuZDogJ3NldENvbnN0YW50JywgYXJnczogWydAd2F0ZXInLCAnIzAwMDBGRiddIH0sXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JsYWNrJ10gfVxuICogXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFtiZWZvcmVdIHN0eWxlc2hlZXQgdG8gY29tcGFyZSBmcm9tXG4gKiBAcGFyYW0geyp9IGFmdGVyIHN0eWxlc2hlZXQgdG8gY29tcGFyZSB0b1xuICogQHJldHVybnMgQXJyYXkgbGlzdCBvZiBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGRpZmZTdHlsZXMoYmVmb3JlLCBhZnRlcikge1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG5cbiAgICBsZXQgY29tbWFuZHMgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudmVyc2lvbiwgYWZ0ZXIudmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBbe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0U3R5bGUsIGFyZ3M6IFthZnRlcl19XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmNlbnRlciwgYWZ0ZXIuY2VudGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRDZW50ZXIsIGFyZ3M6IFthZnRlci5jZW50ZXJdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS56b29tLCBhZnRlci56b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRab29tLCBhcmdzOiBbYWZ0ZXIuem9vbV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmJlYXJpbmcsIGFmdGVyLmJlYXJpbmcpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldEJlYXJpbmcsIGFyZ3M6IFthZnRlci5iZWFyaW5nXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUucGl0Y2gsIGFmdGVyLnBpdGNoKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRQaXRjaCwgYXJnczogW2FmdGVyLnBpdGNoXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuc3ByaXRlLCBhZnRlci5zcHJpdGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFNwcml0ZSwgYXJnczogW2FmdGVyLnNwcml0ZV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmdseXBocywgYWZ0ZXIuZ2x5cGhzKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHbHlwaHMsIGFyZ3M6IFthZnRlci5nbHlwaHNdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS50cmFuc2l0aW9uLCBhZnRlci50cmFuc2l0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRUcmFuc2l0aW9uLCBhcmdzOiBbYWZ0ZXIudHJhbnNpdGlvbl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmxpZ2h0LCBhZnRlci5saWdodCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGlnaHQsIGFyZ3M6IFthZnRlci5saWdodF19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmZvZywgYWZ0ZXIuZm9nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGb2csIGFyZ3M6IFthZnRlci5mb2ddfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgc291cmNlc2BcbiAgICAgICAgLy8gSWYgYSBzb3VyY2UgaXMgdG8gYmUgcmVtb3ZlZCwgd2UgYWxzby0tYmVmb3JlIHRoZSByZW1vdmVTb3VyY2VcbiAgICAgICAgLy8gY29tbWFuZC0tbmVlZCB0byByZW1vdmUgYWxsIHRoZSBzdHlsZSBsYXllcnMgdGhhdCBkZXBlbmQgb24gaXQuXG4gICAgICAgIGNvbnN0IHNvdXJjZXNSZW1vdmVkID0ge307XG5cbiAgICAgICAgLy8gRmlyc3QgY29sbGVjdCB0aGUge2FkZCxyZW1vdmV9U291cmNlIGNvbW1hbmRzXG4gICAgICAgIGNvbnN0IHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMgPSBbXTtcbiAgICAgICAgZGlmZlNvdXJjZXMoYmVmb3JlLnNvdXJjZXMsIGFmdGVyLnNvdXJjZXMsIHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcblxuICAgICAgICAvLyBQdXNoIGEgcmVtb3ZlTGF5ZXIgY29tbWFuZCBmb3IgZWFjaCBzdHlsZSBsYXllciB0aGF0IGRlcGVuZHMgb24gYVxuICAgICAgICAvLyBzb3VyY2UgdGhhdCdzIGJlaW5nIHJlbW92ZWQuXG4gICAgICAgIC8vIEFsc28sIGV4Y2x1ZGUgYW55IHN1Y2ggbGF5ZXJzIHRoZW0gZnJvbSB0aGUgaW5wdXQgdG8gYGRpZmZMYXllcnNgXG4gICAgICAgIC8vIGJlbG93LCBzbyB0aGF0IGRpZmZMYXllcnMgcHJvZHVjZXMgdGhlIGFwcHJvcHJpYXRlIGBhZGRMYXllcnNgXG4gICAgICAgIC8vIGNvbW1hbmRcbiAgICAgICAgY29uc3QgYmVmb3JlTGF5ZXJzID0gW107XG4gICAgICAgIGlmIChiZWZvcmUubGF5ZXJzKSB7XG4gICAgICAgICAgICBiZWZvcmUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVMYXllciwgYXJnczogW2xheWVyLmlkXX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVycmFpbiBpZiB0aGUgc291cmNlIGZvciB0aGF0IHRlcnJhaW4gaXMgYmVpbmcgcmVtb3ZlZFxuICAgICAgICBsZXQgYmVmb3JlVGVycmFpbiA9IGJlZm9yZS50ZXJyYWluO1xuICAgICAgICBpZiAoYmVmb3JlVGVycmFpbikge1xuICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2JlZm9yZVRlcnJhaW4uc291cmNlXSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VGVycmFpbiwgYXJnczogW3VuZGVmaW5lZF19KTtcbiAgICAgICAgICAgICAgICBiZWZvcmVUZXJyYWluID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29tbWFuZHMgPSBjb21tYW5kcy5jb25jYXQocmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcyk7XG5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGVycmFpbiBpcyBhIHRvcC1sZXZlbCBwcm9wZXJ0eVxuICAgICAgICAvLyBJdHMgbGlrZSBhIGxheWVyIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRlcGVuZHMgb24gYSBzb3VyY2UgYmVpbmcgcHJlc2VudC5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZVRlcnJhaW4sIGFmdGVyLnRlcnJhaW4pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFRlcnJhaW4sIGFyZ3M6IFthZnRlci50ZXJyYWluXX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gYGxheWVyc2BcbiAgICAgICAgZGlmZkxheWVycyhiZWZvcmVMYXllcnMsIGFmdGVyLmxheWVycywgY29tbWFuZHMpO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gc2V0U3R5bGVcbiAgICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gY29tcHV0ZSBzdHlsZSBkaWZmOicsIGUpO1xuICAgICAgICBjb21tYW5kcyA9IFt7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXX1dO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlmZlN0eWxlcztcbmV4cG9ydCB7b3BlcmF0aW9uc307XG4iLCIvLyBAZmxvd1xuXG4vLyBOb3RlOiBEbyBub3QgaW5oZXJpdCBmcm9tIEVycm9yLiBJdCBicmVha3Mgd2hlbiB0cmFuc3BpbGluZyB0byBFUzUuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRpb25FcnJvciB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGlkZW50aWZpZXI6ID9zdHJpbmc7XG4gICAgbGluZTogP251bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGtleTogP3N0cmluZywgdmFsdWU6ID97IF9fbGluZV9fOiBudW1iZXIgfSwgbWVzc2FnZTogc3RyaW5nLCBpZGVudGlmaWVyOiA/c3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IChrZXkgPyBgJHtrZXl9OiBgIDogJycpICsgbWVzc2FnZTtcbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuX19saW5lX18pIHtcbiAgICAgICAgICAgIHRoaXMubGluZSA9IHZhbHVlLl9fbGluZV9fO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuLy8gTm90ZTogRG8gbm90IGluaGVyaXQgZnJvbSBFcnJvci4gSXQgYnJlYWtzIHdoZW4gdHJhbnNwaWxpbmcgdG8gRVM1LlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzaW5nRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBlcnJvcjogRXJyb3I7XG4gICAgbGluZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXJyb3I6IEVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBlcnJvci5tZXNzYWdlLm1hdGNoKC9saW5lIChcXGQrKS8pO1xuICAgICAgICB0aGlzLmxpbmUgPSBtYXRjaCA/IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkgOiAwO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVDb25zdGFudHMob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IGNvbnN0YW50cyA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICBpZiAoY29uc3RhbnRzKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGNvbnN0YW50cywgJ2NvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OCcpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuLy8gVHVybiBqc29ubGludC1saW5lcy1wcmltaXRpdmVzIG9iamVjdHMgaW50byBwcmltaXRpdmUgb2JqZWN0c1xuZXhwb3J0IGZ1bmN0aW9uIHVuYnVuZGxlKHZhbHVlOiBtaXhlZCkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFVuYnVuZGxlKHZhbHVlOiBtaXhlZCk6IG1peGVkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChkZWVwVW5idW5kbGUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7XG4gICAgICAgIGNvbnN0IHVuYnVuZGxlZFZhbHVlOiB7IFtrZXk6IHN0cmluZ106IG1peGVkIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHVuYnVuZGxlZFZhbHVlW2tleV0gPSBkZWVwVW5idW5kbGUodmFsdWVba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYnVuZGxlZFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB1bmJ1bmRsZSh2YWx1ZSk7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBvYmplY3QgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGVsZW1lbnRTcGVjcyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IHt9O1xuICAgIGNvbnN0IGVsZW1lbnRWYWxpZGF0b3JzID0gb3B0aW9ucy5vYmplY3RFbGVtZW50VmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgdHlwZSA9IGdldFR5cGUob2JqZWN0KTtcbiAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0LCBgb2JqZWN0IGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IGluIG9iamVjdCkge1xuICAgICAgICBjb25zdCBlbGVtZW50U3BlY0tleSA9IG9iamVjdEtleS5zcGxpdCgnLicpWzBdOyAvLyB0cmVhdCAncGFpbnQuKicgYXMgJ3BhaW50J1xuICAgICAgICBjb25zdCBlbGVtZW50U3BlYyA9IGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0gfHwgZWxlbWVudFNwZWNzWycqJ107XG5cbiAgICAgICAgbGV0IHZhbGlkYXRlRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnRWYWxpZGF0b3JzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VmFsaWRhdG9yc1snKiddKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1snKiddO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRTcGVjc1snKiddKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSB2YWxpZGF0ZVNwZWM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0W29iamVjdEtleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtvYmplY3RLZXl9XCJgKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICAgIGtleTogKGtleSA/IGAke2tleX0uYCA6IGtleSkgKyBvYmplY3RLZXksXG4gICAgICAgICAgICB2YWx1ZTogb2JqZWN0W29iamVjdEtleV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgICBvYmplY3RLZXlcbiAgICAgICAgfSwgb2JqZWN0KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50U3BlY0tleSBpbiBlbGVtZW50U3BlY3MpIHtcbiAgICAgICAgLy8gRG9uJ3QgY2hlY2sgYHJlcXVpcmVkYCB3aGVuIHRoZXJlJ3MgYSBjdXN0b20gdmFsaWRhdG9yIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldLnJlcXVpcmVkICYmIGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIG9iamVjdFtlbGVtZW50U3BlY0tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCIke2VsZW1lbnRTcGVjS2V5fVwiYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBhcnJheSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgYXJyYXlTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbGlkYXRlQXJyYXlFbGVtZW50ID0gb3B0aW9ucy5hcnJheUVsZW1lbnRWYWxpZGF0b3IgfHwgdmFsaWRhdGU7XG5cbiAgICBpZiAoZ2V0VHlwZShhcnJheSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBleHBlY3RlZCwgJHtnZXRUeXBlKGFycmF5KX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlYy5sZW5ndGggJiYgYXJyYXkubGVuZ3RoICE9PSBhcnJheVNwZWMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgbGVuZ3RoICR7YXJyYXlTcGVjLmxlbmd0aH0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlY1snbWluLWxlbmd0aCddICYmIGFycmF5Lmxlbmd0aCA8IGFycmF5U3BlY1snbWluLWxlbmd0aCddKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgbGVuZ3RoIGF0IGxlYXN0ICR7YXJyYXlTcGVjWydtaW4tbGVuZ3RoJ119IGV4cGVjdGVkLCBsZW5ndGggJHthcnJheS5sZW5ndGh9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGxldCBhcnJheUVsZW1lbnRTcGVjID0ge1xuICAgICAgICBcInR5cGVcIjogYXJyYXlTcGVjLnZhbHVlLFxuICAgICAgICBcInZhbHVlc1wiOiBhcnJheVNwZWMudmFsdWVzLFxuICAgICAgICBcIm1pbmltdW1cIjogYXJyYXlTcGVjLm1pbmltdW0sXG4gICAgICAgIFwibWF4aW11bVwiOiBhcnJheVNwZWMubWF4aW11bVxuICAgIH07XG5cbiAgICBpZiAoc3R5bGVTcGVjLiR2ZXJzaW9uIDwgNykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjLmZ1bmN0aW9uID0gYXJyYXlTcGVjLmZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGlmIChnZXRUeXBlKGFycmF5U3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFycmF5RWxlbWVudFNwZWMgPSBhcnJheVNwZWMudmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5RWxlbWVudCh7XG4gICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgIGFycmF5SW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZTogYXJyYXlbaV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGFycmF5RWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWBcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgbGV0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHR5cGUgPSAnTmFOJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5pbXVtJyBpbiB2YWx1ZVNwZWMpIHtcbiAgICAgICAgbGV0IHNwZWNNaW4gPSB2YWx1ZVNwZWMubWluaW11bTtcbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWVTcGVjLm1pbmltdW0pID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gb3B0aW9ucy5hcnJheUluZGV4O1xuICAgICAgICAgICAgc3BlY01pbiA9IHZhbHVlU3BlYy5taW5pbXVtW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IHNwZWNNaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICR7c3BlY01pbn1gKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ21heGltdW0nIGluIHZhbHVlU3BlYykge1xuICAgICAgICBsZXQgc3BlY01heCA9IHZhbHVlU3BlYy5tYXhpbXVtO1xuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZVNwZWMubWF4aW11bSkgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBvcHRpb25zLmFycmF5SW5kZXg7XG4gICAgICAgICAgICBzcGVjTWF4ID0gdmFsdWVTcGVjLm1heGltdW1baV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID4gc3BlY01heCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGAke3ZhbHVlfSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHtzcGVjTWF4fWApXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB7aXNFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IHZhbGlkYXRlRnVuY3Rpb25TdG9wXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCB2YWx1ZSwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3Aob3B0aW9ucykge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gZm91bmRgKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgb2JqZWN0IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWVbMF0pfSBmb3VuZGApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS56b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcERvbWFpblpvb20gJiYgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA+IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pICE9PSBwcmV2aW91c1N0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge3pvb206IHt9fSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7em9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZX1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVTdG9wRG9tYWluVmFsdWUoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge30sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24oZGVlcFVuYnVuZGxlKHZhbHVlWzFdKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgJ2V4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiBzdG9wcy4nKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9WzFdYCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVsxXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZnVuY3Rpb25WYWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKG9wdGlvbnMsIHN0b3ApIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGUob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0VmFsdWUgPSBvcHRpb25zLnZhbHVlICE9PSBudWxsID8gb3B0aW9ucy52YWx1ZSA6IHN0b3A7XG5cbiAgICAgICAgaWYgKCFzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgc3RvcEtleVR5cGUgPSB0eXBlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHN0b3BLZXlUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBgJHt0eXBlfSBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAke3N0b3BLZXlUeXBlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4nKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgZnVuY3Rpb25UeXBlICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgO1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKGZ1bmN0aW9uVmFsdWVTcGVjKSAmJiBmdW5jdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJ1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIG1lc3NhZ2UpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgKCFpc0Zpbml0ZSh2YWx1ZSkgfHwgTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7dmFsdWV9YCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdmFsdWUgaW4gc3RvcERvbWFpblZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgJ3N0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZScpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbiwgY3JlYXRlUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7ZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCB7aXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuLi9leHByZXNzaW9uL2lzX2NvbnN0YW50LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnM6IGFueSk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ3Byb3BlcnR5JyA/IGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbiA6IGNyZWF0ZUV4cHJlc3Npb24pKGRlZXBVbmJ1bmRsZShvcHRpb25zLnZhbHVlKSwgb3B0aW9ucy52YWx1ZVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZS5tYXAoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihgJHtvcHRpb25zLmtleX0ke2Vycm9yLmtleX1gLCBvcHRpb25zLnZhbHVlLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwcmVzc2lvbk9iaiA9IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLmV4cHJlc3Npb24gfHwgKGV4cHJlc3Npb24udmFsdWU6IGFueSkuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uO1xuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgJiYgKG9wdGlvbnMucHJvcGVydHlLZXkgPT09ICd0ZXh0LWZvbnQnKSAmJlxuICAgICAgICAhZXhwcmVzc2lvbk9iai5vdXRwdXREZWZpbmVkKCkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCBgSW52YWxpZCBkYXRhIGV4cHJlc3Npb24gZm9yIFwiJHtvcHRpb25zLnByb3BlcnR5S2V5fVwiLiBPdXRwdXQgdmFsdWVzIG11c3QgYmUgY29udGFpbmVkIGFzIGxpdGVyYWxzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbi5gKV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgJiYgb3B0aW9ucy5wcm9wZXJ0eVR5cGUgPT09ICdsYXlvdXQnICYmXG4gICAgICAgICghaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcImZlYXR1cmUtc3RhdGVcIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbGF5b3V0IHByb3BlcnRpZXMuJyldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAnZmlsdGVyJyAmJiAhaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wiZmVhdHVyZS1zdGF0ZVwiIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBmaWx0ZXJzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCAmJiBvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0LmluZGV4T2YoJ2NsdXN0ZXInKSA9PT0gMCkge1xuICAgICAgICBpZiAoIWlzR2xvYmFsUHJvcGVydHlDb25zdGFudChleHByZXNzaW9uT2JqLCBbJ3pvb20nLCAnZmVhdHVyZS1zdGF0ZSddKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJ6b29tXCIgYW5kIFwiZmVhdHVyZS1zdGF0ZVwiIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggY2x1c3RlciBwcm9wZXJ0aWVzLicpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2NsdXN0ZXItaW5pdGlhbCcgJiYgIWlzRmVhdHVyZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdGZWF0dXJlIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBpbml0aWFsIGV4cHJlc3Npb24gcGFydCBvZiBjbHVzdGVyIHByb3BlcnRpZXMuJyldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHtwYXJzZUNTU0NvbG9yfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUVudW0ob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU3BlYy52YWx1ZXMpKSB7IC8vIDw9djdcbiAgICAgICAgaWYgKHZhbHVlU3BlYy52YWx1ZXMuaW5kZXhPZih1bmJ1bmRsZSh2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZXhwZWN0ZWQgb25lIG9mIFske3ZhbHVlU3BlYy52YWx1ZXMuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA+PXY4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7T2JqZWN0LmtleXModmFsdWVTcGVjLnZhbHVlcykuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uLmpzJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHt1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb25GaWx0ZXJ9IGZyb20gJy4uL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXIob3B0aW9ucykge1xuICAgIGlmIChpc0V4cHJlc3Npb25GaWx0ZXIoZGVlcFVuYnVuZGxlKG9wdGlvbnMudmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdmaWx0ZXInLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiB7dmFsdWU6ICdib29sZWFuJ31cbiAgICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGlmIChnZXRUeXBlKHZhbHVlKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBsZXQgdHlwZTtcblxuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnQnKV07XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVudW0oe1xuICAgICAgICBrZXk6IGAke2tleX1bMF1gLFxuICAgICAgICB2YWx1ZTogdmFsdWVbMF0sXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmZpbHRlcl9vcGVyYXRvcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICB9KSk7XG5cbiAgICBzd2l0Y2ggKHVuYnVuZGxlKHZhbHVlWzBdKSkge1xuICAgIGNhc2UgJzwnOlxuICAgIGNhc2UgJzw9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB1bmJ1bmRsZSh2YWx1ZVsxXSkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYFwiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIke3ZhbHVlWzBdfVwiYCkpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlICc9PSc6XG4gICAgY2FzZSAnIT0nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJHt2YWx1ZVswXX1cIiBtdXN0IGhhdmUgMyBlbGVtZW50c2ApKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSAnaW4nOlxuICAgIGNhc2UgJyFpbic6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbMV0pO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbaV0pO1xuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzFdKSA9PT0gJyR0eXBlJykge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbnVtKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5nZW9tZXRyeV90eXBlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ251bWJlcicgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WyR7aX1dYCwgdmFsdWVbaV0sIGBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgJ2FueSc6XG4gICAgY2FzZSAnYWxsJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgJ2hhcyc6XG4gICAgY2FzZSAnIWhhcyc6XG4gICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBcIiR7dmFsdWVbMF19XCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHNgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dpdGhpbic6XG4gICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBcIiR7dmFsdWVbMF19XCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHNgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgb2JqZWN0IGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge3N1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi91dGlsL3Byb3BlcnRpZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsIHByb3BlcnR5VHlwZSkge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgcHJvcGVydHlLZXkgPSBvcHRpb25zLm9iamVjdEtleTtcbiAgICBjb25zdCBsYXllclNwZWMgPSBzdHlsZVNwZWNbYCR7cHJvcGVydHlUeXBlfV8ke29wdGlvbnMubGF5ZXJUeXBlfWBdO1xuXG4gICAgaWYgKCFsYXllclNwZWMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25NYXRjaCA9IHByb3BlcnR5S2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdwYWludCcgJiYgdHJhbnNpdGlvbk1hdGNoICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IGxheWVyU3BlY1twcm9wZXJ0eUtleV07XG4gICAgaWYgKCF2YWx1ZVNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGB1bmtub3duIHByb3BlcnR5IFwiJHtwcm9wZXJ0eUtleX1cImApXTtcbiAgICB9XG5cbiAgICBsZXQgdG9rZW5NYXRjaDtcbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdzdHJpbmcnICYmIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlU3BlYykgJiYgIXZhbHVlU3BlYy50b2tlbnMgJiYgKHRva2VuTWF0Y2ggPSAvXnsoW159XSspfSQvLmV4ZWModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBrZXksIHZhbHVlLFxuICAgICAgICAgICAgYFwiJHtwcm9wZXJ0eUtleX1cIiBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gc3ludGF4XFxuYCArXG4gICAgICAgICAgICAgICAgYFVzZSBhbiBpZGVudGl0eSBwcm9wZXJ0eSBmdW5jdGlvbiBpbnN0ZWFkOiBcXGB7IFwidHlwZVwiOiBcImlkZW50aXR5XCIsIFwicHJvcGVydHlcIjogJHtKU09OLnN0cmluZ2lmeSh0b2tlbk1hdGNoWzFdKX0gfVxcYC5gKV07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gW107XG5cbiAgICBpZiAob3B0aW9ucy5sYXllclR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleSA9PT0gJ3RleHQtZmllbGQnICYmIHN0eWxlICYmICFzdHlsZS5nbHlwaHMpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JyAmJiBpc0Z1bmN0aW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZSkpICYmIHVuYnVuZGxlKHZhbHVlLnR5cGUpID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcInRleHQtZm9udFwiIGRvZXMgbm90IHN1cHBvcnQgaWRlbnRpdHkgZnVuY3Rpb25zJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWVTcGVjLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjLFxuICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ3Byb3BlcnR5JyxcbiAgICAgICAgcHJvcGVydHlUeXBlLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgIH0pKTtcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlUHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgJ3BhaW50Jyk7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZVByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfcHJvcGVydHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCAnbGF5b3V0Jyk7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCB2YWxpZGF0ZU9iamVjdCBmcm9tICcuL3ZhbGlkYXRlX29iamVjdC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVGaWx0ZXIgZnJvbSAnLi92YWxpZGF0ZV9maWx0ZXIuanMnO1xuaW1wb3J0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5LmpzJztcbmltcG9ydCB2YWxpZGF0ZUxheW91dFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzJztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcihvcHRpb25zKSB7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICghbGF5ZXIudHlwZSAmJiAhbGF5ZXIucmVmKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ2VpdGhlciBcInR5cGVcIiBvciBcInJlZlwiIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cbiAgICBsZXQgdHlwZSA9IHVuYnVuZGxlKGxheWVyLnR5cGUpO1xuICAgIGNvbnN0IHJlZiA9IHVuYnVuZGxlKGxheWVyLnJlZik7XG5cbiAgICBpZiAobGF5ZXIuaWQpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHVuYnVuZGxlKGxheWVyLmlkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmFycmF5SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJMYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShvdGhlckxheWVyLmlkKSA9PT0gbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5pZCwgYGR1cGxpY2F0ZSBsYXllciBpZCBcIiR7bGF5ZXIuaWR9XCIsIHByZXZpb3VzbHkgdXNlZCBhdCBsaW5lICR7b3RoZXJMYXllci5pZC5fX2xpbmVfX31gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3JlZicgaW4gbGF5ZXIpIHtcbiAgICAgICAgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnZmlsdGVyJywgJ2xheW91dCddLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGlmIChwIGluIGxheWVyKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyW3BdLCBgXCIke3B9XCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVyc2ApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHBhcmVudDtcblxuICAgICAgICBzdHlsZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShsYXllci5pZCkgPT09IHJlZikgcGFyZW50ID0gbGF5ZXI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIucmVmLCBgcmVmIGxheWVyIFwiJHtyZWZ9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5yZWYpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsICdyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllcicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSB1bmJ1bmRsZShwYXJlbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEodHlwZSA9PT0gJ2JhY2tncm91bmQnIHx8IHR5cGUgPT09ICdza3knKSkge1xuICAgICAgICBpZiAoIWxheWVyLnNvdXJjZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc3R5bGUuc291cmNlcyAmJiBzdHlsZS5zb3VyY2VzW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYHNvdXJjZSBcIiR7bGF5ZXIuc291cmNlfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgdHlwZSA9PT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIHJlcXVpcmVzIGEgcmFzdGVyIHNvdXJjZWApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3Jhc3RlcicgJiYgdHlwZSAhPT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIHJlcXVpcmVzIGEgdmVjdG9yIHNvdXJjZWApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgIWxheWVyWydzb3VyY2UtbGF5ZXInXSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAncmFzdGVyLWRlbScgJiYgdHlwZSAhPT0gJ2hpbGxzaGFkZScpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCAncmFzdGVyLWRlbSBzb3VyY2UgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGxheWVyIHR5cGUgXFwnaGlsbHNoYWRlXFwnLicpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmUnICYmIGxheWVyLnBhaW50ICYmIGxheWVyLnBhaW50WydsaW5lLWdyYWRpZW50J10gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZVR5cGUgIT09ICdnZW9qc29uJyB8fCAhc291cmNlLmxpbmVNZXRyaWNzKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBzcGVjaWZpZXMgYSBsaW5lLWdyYWRpZW50LCB3aGljaCByZXF1aXJlcyBhIEdlb0pTT04gc291cmNlIHdpdGggXFxgbGluZU1ldHJpY3NcXGAgZW5hYmxlZC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogbGF5ZXIsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICcqJygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBlbmZvcmNlIHRoZSBzcGVjJ3MgYFwicmVxdWlyZXNcIjogdHJ1ZWAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCByZWZzO1xuICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZXF1aXJlbWVudCBpcyB2YWxpZGF0ZWQgYWJvdmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTc3Mi5cbiAgICAgICAgICAgIHR5cGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RLZXk6ICd0eXBlJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcjogdmFsaWRhdGVGaWx0ZXIsXG4gICAgICAgICAgICBsYXlvdXQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFpbnQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhaW50UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6IHR5cGV9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHt1bmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0uanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuXG5jb25zdCBvYmplY3RFbGVtZW50VmFsaWRhdG9ycyA9IHtcbiAgICBwcm9tb3RlSWQ6IHZhbGlkYXRlUHJvbW90ZUlkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVNvdXJjZShvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGlmICghdmFsdWUudHlwZSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1widHlwZVwiIGlzIHJlcXVpcmVkJyldO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB1bmJ1bmRsZSh2YWx1ZS50eXBlKTtcbiAgICBsZXQgZXJyb3JzO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAndmVjdG9yJzpcbiAgICBjYXNlICdyYXN0ZXInOlxuICAgIGNhc2UgJ3Jhc3Rlci1kZW0nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjW2Bzb3VyY2VfJHt0eXBlLnJlcGxhY2UoJy0nLCAnXycpfWBdLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlLmNsdXN0ZXIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZS5jbHVzdGVyUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcl0gPSB2YWx1ZS5jbHVzdGVyUHJvcGVydGllc1twcm9wXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VFeHByID0gdHlwZW9mIG9wZXJhdG9yID09PSAnc3RyaW5nJyA/IFtvcGVyYXRvciwgWydhY2N1bXVsYXRlZCddLCBbJ2dldCcsIHByb3BdXSA6IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9LiR7cHJvcH0ubWFwYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hcEV4cHIsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnY2x1c3Rlci1tYXAnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS4ke3Byb3B9LnJlZHVjZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZWR1Y2VFeHByLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2NsdXN0ZXItcmVkdWNlJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfdmlkZW8sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2ltYWdlLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdjYW52YXMnOlxuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBudWxsLCBgUGxlYXNlIHVzZSBydW50aW1lIEFQSXMgdG8gYWRkIGNhbnZhcyBzb3VyY2VzLCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlbSBpbiBzdHlsZXNoZWV0cy5gLCAnc291cmNlLmNhbnZhcycpXTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9LnR5cGVgLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHt2YWx1ZXM6IFsndmVjdG9yJywgJ3Jhc3RlcicsICdyYXN0ZXItZGVtJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnXX0sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvbW90ZUlkKHtrZXksIHZhbHVlfSkge1xuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHtrZXksIHZhbHVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmcoe2tleTogYCR7a2V5fS4ke3Byb3B9YCwgdmFsdWU6IHZhbHVlW3Byb3BdfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogbGlnaHRTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGlnaHRba2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVUZXJyYWluKG9wdGlvbnMpIHtcbiAgICBjb25zdCB0ZXJyYWluID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgdGVycmFpblNwZWMgPSBzdHlsZVNwZWMudGVycmFpbjtcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCByb290VHlwZSA9IGdldFR5cGUodGVycmFpbik7XG4gICAgaWYgKHRlcnJhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ3RlcnJhaW4nLCB0ZXJyYWluLCBgb2JqZWN0IGV4cGVjdGVkLCAke3Jvb3RUeXBlfSBmb3VuZGApXSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGVycmFpbikge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiB0ZXJyYWluU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIHRlcnJhaW5TcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXJyYWluW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZXJyYWluU3BlY1trZXldKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRlcnJhaW5ba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHRlcnJhaW5TcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdGVycmFpbltrZXldLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7a2V5fVwiYCldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGVycmFpbi5zb3VyY2UpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4sIGB0ZXJyYWluIGlzIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcImApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzICYmIHN0eWxlLnNvdXJjZXNbdGVycmFpbi5zb3VyY2VdO1xuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB0ZXJyYWluLnNvdXJjZSwgYHNvdXJjZSBcIiR7dGVycmFpbi5zb3VyY2V9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgIT09ICdyYXN0ZXItZGVtJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4uc291cmNlLCBgdGVycmFpbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgc291cmNlIG9mIHR5cGUgJHtzb3VyY2VUeXBlfSwgaXQgb25seSBiZSB1c2VkIHdpdGggYSBcInJhc3Rlci1kZW1cIiBzb3VyY2UgdHlwZWApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGb2cob3B0aW9ucykge1xuICAgIGNvbnN0IGZvZyA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IGZvZ1NwZWMgPSBzdHlsZVNwZWMuZm9nO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHJvb3RUeXBlID0gZ2V0VHlwZShmb2cpO1xuICAgIGlmIChmb2cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2ZvZycsIGZvZywgYG9iamVjdCBleHBlY3RlZCwgJHtyb290VHlwZX0gZm91bmRgKV0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZvZykge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBmb2dTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgZm9nU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZm9nW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2dTcGVjW2tleV0pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZm9nW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBmb2dTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgZm9nW2tleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdHRlZChvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodmFsaWRhdGVTdHJpbmcob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uLmpzJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZyBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2Uob3B0aW9uczogYW55KSB7XG4gICAgaWYgKHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zKTtcbn1cbiIsIlxuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZC5qcyc7XG5pbXBvcnQge3VuYnVuZGxlLCBkZWVwVW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHtpc0Z1bmN0aW9ufSBmcm9tICcuLi9mdW5jdGlvbi9pbmRleC5qcyc7XG5cbmltcG9ydCB2YWxpZGF0ZUZ1bmN0aW9uIGZyb20gJy4vdmFsaWRhdGVfZnVuY3Rpb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlQm9vbGVhbiBmcm9tICcuL3ZhbGlkYXRlX2Jvb2xlYW4uanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZUNvbG9yIGZyb20gJy4vdmFsaWRhdGVfY29sb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlQ29uc3RhbnRzIGZyb20gJy4vdmFsaWRhdGVfY29uc3RhbnRzLmpzJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlX2xheWVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlX2xpZ2h0LmpzJztcbmltcG9ydCB2YWxpZGF0ZVRlcnJhaW4gZnJvbSAnLi92YWxpZGF0ZV90ZXJyYWluLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuaW1wb3J0IHZhbGlkYXRlRm9ybWF0dGVkIGZyb20gJy4vdmFsaWRhdGVfZm9ybWF0dGVkLmpzJztcbmltcG9ydCB2YWxpZGF0ZUltYWdlIGZyb20gJy4vdmFsaWRhdGVfaW1hZ2UuanMnO1xuXG5jb25zdCBWQUxJREFUT1JTID0ge1xuICAgICcqJygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgJ2FycmF5JzogdmFsaWRhdGVBcnJheSxcbiAgICAnYm9vbGVhbic6IHZhbGlkYXRlQm9vbGVhbixcbiAgICAnbnVtYmVyJzogdmFsaWRhdGVOdW1iZXIsXG4gICAgJ2NvbG9yJzogdmFsaWRhdGVDb2xvcixcbiAgICAnY29uc3RhbnRzJzogdmFsaWRhdGVDb25zdGFudHMsXG4gICAgJ2VudW0nOiB2YWxpZGF0ZUVudW0sXG4gICAgJ2ZpbHRlcic6IHZhbGlkYXRlRmlsdGVyLFxuICAgICdmdW5jdGlvbic6IHZhbGlkYXRlRnVuY3Rpb24sXG4gICAgJ2xheWVyJzogdmFsaWRhdGVMYXllcixcbiAgICAnb2JqZWN0JzogdmFsaWRhdGVPYmplY3QsXG4gICAgJ3NvdXJjZSc6IHZhbGlkYXRlU291cmNlLFxuICAgICdsaWdodCc6IHZhbGlkYXRlTGlnaHQsXG4gICAgJ3RlcnJhaW4nOiB2YWxpZGF0ZVRlcnJhaW4sXG4gICAgJ2ZvZyc6IHZhbGlkYXRlRm9nLFxuICAgICdzdHJpbmcnOiB2YWxpZGF0ZVN0cmluZyxcbiAgICAnZm9ybWF0dGVkJzogdmFsaWRhdGVGb3JtYXR0ZWQsXG4gICAgJ3Jlc29sdmVkSW1hZ2UnOiB2YWxpZGF0ZUltYWdlXG59O1xuXG4vLyBNYWluIHJlY3Vyc2l2ZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUcmFja3M6XG4vL1xuLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbi8vICAgZm9yIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgcmVwb3J0aW5nLlxuLy8gLSB2YWx1ZTogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuLy8gICBoaWdoIGxldmVsIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGRlc2NlbmRlZCBpbnRvIGRlZXBlciBvciBhIHNpbXBsZVxuLy8gICBzY2FsYXIgdmFsdWUuXG4vLyAtIHZhbHVlU3BlYzogY3VycmVudCBzcGVjIGJlaW5nIGV2YWx1YXRlZC4gVHJhY2tzIHZhbHVlLlxuLy8gLSBzdHlsZVNwZWM6IGN1cnJlbnQgZnVsbCBzcGVjIGJlaW5nIGV2YWx1YXRlZC5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGUob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICh2YWx1ZVNwZWMuZXhwcmVzc2lvbiAmJiBpc0Z1bmN0aW9uKHVuYnVuZGxlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2UgaWYgKHZhbHVlU3BlYy5leHByZXNzaW9uICYmIGlzRXhwcmVzc2lvbihkZWVwVW5idW5kbGUodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMudHlwZSAmJiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXSkge1xuICAgICAgICByZXR1cm4gVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgdmFsdWVTcGVjOiB2YWx1ZVNwZWMudHlwZSA/IHN0eWxlU3BlY1t2YWx1ZVNwZWMudHlwZV0gOiB2YWx1ZVNwZWNcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ3tmb250c3RhY2t9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie2ZvbnRzdGFja31cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne3JhbmdlfScpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntyYW5nZX1cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGUuanMnO1xuaW1wb3J0IGxhdGVzdFN0eWxlU3BlYyBmcm9tICcuL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlR2x5cGhzVVJMIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcyc7XG5cbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzJztcbmltcG9ydCB2YWxpZGF0ZVRlcnJhaW4gZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV90ZXJyYWluLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVQYWludFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMnO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgVGhlIHN0eWxlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBsYXRlc3Qgc3R5bGUgc3BlYyBpcyB1c2VkLlxuICogQHJldHVybnMge0FycmF5PFZhbGlkYXRpb25FcnJvcj59XG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG4gKiAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShzdHlsZSk7XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVNaW4oc3R5bGUsIHN0eWxlU3BlYyA9IGxhdGVzdFN0eWxlU3BlYykge1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIHZhbHVlOiBzdHlsZSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICBnbHlwaHM6IHZhbGlkYXRlR2x5cGhzVVJMLFxuICAgICAgICAgICAgJyonKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIGlmIChzdHlsZS5jb25zdGFudHMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUNvbnN0YW50cyh7XG4gICAgICAgICAgICBrZXk6ICdjb25zdGFudHMnLFxuICAgICAgICAgICAgdmFsdWU6IHN0eWxlLmNvbnN0YW50cyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydEVycm9ycyhlcnJvcnMpO1xufVxuXG52YWxpZGF0ZVN0eWxlTWluLnNvdXJjZSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVNvdXJjZSk7XG52YWxpZGF0ZVN0eWxlTWluLmxpZ2h0ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGlnaHQpO1xudmFsaWRhdGVTdHlsZU1pbi50ZXJyYWluID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlVGVycmFpbik7XG52YWxpZGF0ZVN0eWxlTWluLmZvZyA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUZvZyk7XG52YWxpZGF0ZVN0eWxlTWluLmxheWVyID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGF5ZXIpO1xudmFsaWRhdGVTdHlsZU1pbi5maWx0ZXIgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVGaWx0ZXIpO1xudmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSk7XG52YWxpZGF0ZVN0eWxlTWluLmxheW91dFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGF5b3V0UHJvcGVydHkpO1xuXG5mdW5jdGlvbiBzb3J0RXJyb3JzKGVycm9ycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoZXJyb3JzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBhLmxpbmUgLSBiLmxpbmU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDbGVhbkVycm9ycyhpbm5lcikge1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBzb3J0RXJyb3JzKGlubmVyLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZVN0eWxlTWluO1xuIiwiLyogcGFyc2VyIGdlbmVyYXRlZCBieSBqaXNvbiAwLjQuMTUgKi9cbi8qXG4gIFJldHVybnMgYSBQYXJzZXIgb2JqZWN0IG9mIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuXG4gIFBhcnNlcjoge1xuICAgIHl5OiB7fVxuICB9XG5cbiAgUGFyc2VyLnByb3RvdHlwZToge1xuICAgIHl5OiB7fSxcbiAgICB0cmFjZTogZnVuY3Rpb24oKSxcbiAgICBzeW1ib2xzXzoge2Fzc29jaWF0aXZlIGxpc3Q6IG5hbWUgPT0+IG51bWJlcn0sXG4gICAgdGVybWluYWxzXzoge2Fzc29jaWF0aXZlIGxpc3Q6IG51bWJlciA9PT4gbmFtZX0sXG4gICAgcHJvZHVjdGlvbnNfOiBbLi4uXSxcbiAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kKSxcbiAgICB0YWJsZTogWy4uLl0sXG4gICAgZGVmYXVsdEFjdGlvbnM6IHsuLi59LFxuICAgIHBhcnNlRXJyb3I6IGZ1bmN0aW9uKHN0ciwgaGFzaCksXG4gICAgcGFyc2U6IGZ1bmN0aW9uKGlucHV0KSxcblxuICAgIGxleGVyOiB7XG4gICAgICAgIEVPRjogMSxcbiAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24oc3RyLCBoYXNoKSxcbiAgICAgICAgc2V0SW5wdXQ6IGZ1bmN0aW9uKGlucHV0KSxcbiAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uKCksXG4gICAgICAgIHVucHV0OiBmdW5jdGlvbihzdHIpLFxuICAgICAgICBtb3JlOiBmdW5jdGlvbigpLFxuICAgICAgICBsZXNzOiBmdW5jdGlvbihuKSxcbiAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbigpLFxuICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbigpLFxuICAgICAgICBzaG93UG9zaXRpb246IGZ1bmN0aW9uKCksXG4gICAgICAgIHRlc3RfbWF0Y2g6IGZ1bmN0aW9uKHJlZ2V4X21hdGNoX2FycmF5LCBydWxlX2luZGV4KSxcbiAgICAgICAgbmV4dDogZnVuY3Rpb24oKSxcbiAgICAgICAgbGV4OiBmdW5jdGlvbigpLFxuICAgICAgICBiZWdpbjogZnVuY3Rpb24oY29uZGl0aW9uKSxcbiAgICAgICAgcG9wU3RhdGU6IGZ1bmN0aW9uKCksXG4gICAgICAgIF9jdXJyZW50UnVsZXM6IGZ1bmN0aW9uKCksXG4gICAgICAgIHRvcFN0YXRlOiBmdW5jdGlvbigpLFxuICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uKGNvbmRpdGlvbiksXG5cbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcmFuZ2VzOiBib29sZWFuICAgICAgICAgICAob3B0aW9uYWw6IHRydWUgPT0+IHRva2VuIGxvY2F0aW9uIGluZm8gd2lsbCBpbmNsdWRlIGEgLnJhbmdlW10gbWVtYmVyKVxuICAgICAgICAgICAgZmxleDogYm9vbGVhbiAgICAgICAgICAgICAob3B0aW9uYWw6IHRydWUgPT0+IGZsZXgtbGlrZSBsZXhpbmcgYmVoYXZpb3VyIHdoZXJlIHRoZSBydWxlcyBhcmUgdGVzdGVkIGV4aGF1c3RpdmVseSB0byBmaW5kIHRoZSBsb25nZXN0IG1hdGNoKVxuICAgICAgICAgICAgYmFja3RyYWNrX2xleGVyOiBib29sZWFuICAob3B0aW9uYWw6IHRydWUgPT0+IGxleGVyIHJlZ2V4ZXMgYXJlIHRlc3RlZCBpbiBvcmRlciBhbmQgZm9yIGVhY2ggbWF0Y2hpbmcgcmVnZXggdGhlIGFjdGlvbiBjb2RlIGlzIGludm9rZWQ7IHRoZSBsZXhlciB0ZXJtaW5hdGVzIHRoZSBzY2FuIHdoZW4gYSB0b2tlbiBpcyByZXR1cm5lZCBieSB0aGUgYWN0aW9uIGNvZGUpXG4gICAgICAgIH0sXG5cbiAgICAgICAgcGVyZm9ybUFjdGlvbjogZnVuY3Rpb24oeXksIHl5XywgJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucywgWVlfU1RBUlQpLFxuICAgICAgICBydWxlczogWy4uLl0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHthc3NvY2lhdGl2ZSBsaXN0OiBuYW1lID09PiBzZXR9LFxuICAgIH1cbiAgfVxuXG5cbiAgdG9rZW4gbG9jYXRpb24gaW5mbyAoQCQsIF8kLCBldGMuKToge1xuICAgIGZpcnN0X2xpbmU6IG4sXG4gICAgbGFzdF9saW5lOiBuLFxuICAgIGZpcnN0X2NvbHVtbjogbixcbiAgICBsYXN0X2NvbHVtbjogbixcbiAgICByYW5nZTogW3N0YXJ0X251bWJlciwgZW5kX251bWJlcl0gICAgICAgKHdoZXJlIHRoZSBudW1iZXJzIGFyZSBpbmRleGVzIGludG8gdGhlIGlucHV0IHN0cmluZywgcmVndWxhciB6ZXJvLWJhc2VkKVxuICB9XG5cblxuICB0aGUgcGFyc2VFcnJvciBmdW5jdGlvbiByZWNlaXZlcyBhICdoYXNoJyBvYmplY3Qgd2l0aCB0aGVzZSBtZW1iZXJzIGZvciBsZXhlciBhbmQgcGFyc2VyIGVycm9yczoge1xuICAgIHRleHQ6ICAgICAgICAobWF0Y2hlZCB0ZXh0KVxuICAgIHRva2VuOiAgICAgICAodGhlIHByb2R1Y2VkIHRlcm1pbmFsIHRva2VuLCBpZiBhbnkpXG4gICAgbGluZTogICAgICAgICh5eWxpbmVubylcbiAgfVxuICB3aGlsZSBwYXJzZXIgKGdyYW1tYXIpIGVycm9ycyB3aWxsIGFsc28gcHJvdmlkZSB0aGVzZSBtZW1iZXJzLCBpLmUuIHBhcnNlciBlcnJvcnMgZGVsaXZlciBhIHN1cGVyc2V0IG9mIGF0dHJpYnV0ZXM6IHtcbiAgICBsb2M6ICAgICAgICAgKHl5bGxvYylcbiAgICBleHBlY3RlZDogICAgKHN0cmluZyBkZXNjcmliaW5nIHRoZSBzZXQgb2YgZXhwZWN0ZWQgdG9rZW5zKVxuICAgIHJlY292ZXJhYmxlOiAoYm9vbGVhbjogVFJVRSB3aGVuIHRoZSBwYXJzZXIgaGFzIGEgZXJyb3IgcmVjb3ZlcnkgcnVsZSBhdmFpbGFibGUgZm9yIHRoaXMgcGFydGljdWxhciBlcnJvcilcbiAgfVxuKi9cbnZhciBwYXJzZXIgPSAoZnVuY3Rpb24oKXtcbnZhciBvPWZ1bmN0aW9uKGssdixvLGwpe2ZvcihvPW98fHt9LGw9ay5sZW5ndGg7bC0tO29ba1tsXV09dik7cmV0dXJuIG99LCRWMD1bMSwxMl0sJFYxPVsxLDEzXSwkVjI9WzEsOV0sJFYzPVsxLDEwXSwkVjQ9WzEsMTFdLCRWNT1bMSwxNF0sJFY2PVsxLDE1XSwkVjc9WzE0LDE4LDIyLDI0XSwkVjg9WzE4LDIyXSwkVjk9WzIyLDI0XTtcbnZhciBwYXJzZXIgPSB7dHJhY2U6IGZ1bmN0aW9uIHRyYWNlKCkgeyB9LFxueXk6IHt9LFxuc3ltYm9sc186IHtcImVycm9yXCI6MixcIkpTT05TdHJpbmdcIjozLFwiU1RSSU5HXCI6NCxcIkpTT05OdW1iZXJcIjo1LFwiTlVNQkVSXCI6NixcIkpTT05OdWxsTGl0ZXJhbFwiOjcsXCJOVUxMXCI6OCxcIkpTT05Cb29sZWFuTGl0ZXJhbFwiOjksXCJUUlVFXCI6MTAsXCJGQUxTRVwiOjExLFwiSlNPTlRleHRcIjoxMixcIkpTT05WYWx1ZVwiOjEzLFwiRU9GXCI6MTQsXCJKU09OT2JqZWN0XCI6MTUsXCJKU09OQXJyYXlcIjoxNixcIntcIjoxNyxcIn1cIjoxOCxcIkpTT05NZW1iZXJMaXN0XCI6MTksXCJKU09OTWVtYmVyXCI6MjAsXCI6XCI6MjEsXCIsXCI6MjIsXCJbXCI6MjMsXCJdXCI6MjQsXCJKU09ORWxlbWVudExpc3RcIjoyNSxcIiRhY2NlcHRcIjowLFwiJGVuZFwiOjF9LFxudGVybWluYWxzXzogezI6XCJlcnJvclwiLDQ6XCJTVFJJTkdcIiw2OlwiTlVNQkVSXCIsODpcIk5VTExcIiwxMDpcIlRSVUVcIiwxMTpcIkZBTFNFXCIsMTQ6XCJFT0ZcIiwxNzpcIntcIiwxODpcIn1cIiwyMTpcIjpcIiwyMjpcIixcIiwyMzpcIltcIiwyNDpcIl1cIn0sXG5wcm9kdWN0aW9uc186IFswLFszLDFdLFs1LDFdLFs3LDFdLFs5LDFdLFs5LDFdLFsxMiwyXSxbMTMsMV0sWzEzLDFdLFsxMywxXSxbMTMsMV0sWzEzLDFdLFsxMywxXSxbMTUsMl0sWzE1LDNdLFsyMCwzXSxbMTksMV0sWzE5LDNdLFsxNiwyXSxbMTYsM10sWzI1LDFdLFsyNSwzXV0sXG5wZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSAvKiBhY3Rpb25bMV0gKi8sICQkIC8qIHZzdGFjayAqLywgXyQgLyogbHN0YWNrICovKSB7XG4vKiB0aGlzID09IHl5dmFsICovXG5cbnZhciAkMCA9ICQkLmxlbmd0aCAtIDE7XG5zd2l0Y2ggKHl5c3RhdGUpIHtcbmNhc2UgMTpcbiAvLyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycyB3aXRoIGFjdHVhbCBjaGFyYWN0ZXJcbiAgICAgICAgICB0aGlzLiQgPSBuZXcgU3RyaW5nKHl5dGV4dC5yZXBsYWNlKC9cXFxcKFxcXFx8XCIpL2csIFwiJFwiK1wiMVwiKVxuICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxuL2csJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHIvZywnXFxyJylcbiAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcdC9nLCdcXHQnKVxuICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx2L2csJ1xcdicpXG4gICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXGYvZywnXFxmJylcbiAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcYi9nLCdcXGInKSk7XG4gICAgICAgICAgdGhpcy4kLl9fbGluZV9fID0gIHRoaXMuXyQuZmlyc3RfbGluZTtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgMjpcblxuICAgICAgICAgICAgdGhpcy4kID0gbmV3IE51bWJlcih5eXRleHQpO1xuICAgICAgICAgICAgdGhpcy4kLl9fbGluZV9fID0gIHRoaXMuXyQuZmlyc3RfbGluZTtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgMzpcblxuICAgICAgICAgICAgdGhpcy4kID0gbnVsbDtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgNDpcblxuICAgICAgICAgICAgdGhpcy4kID0gbmV3IEJvb2xlYW4odHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLiQuX19saW5lX18gPSB0aGlzLl8kLmZpcnN0X2xpbmU7XG4gICAgICAgIFxuYnJlYWs7XG5jYXNlIDU6XG5cbiAgICAgICAgICAgIHRoaXMuJCA9IG5ldyBCb29sZWFuKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuJC5fX2xpbmVfXyA9IHRoaXMuXyQuZmlyc3RfbGluZTtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgNjpcbnJldHVybiB0aGlzLiQgPSAkJFskMC0xXTtcbmJyZWFrO1xuY2FzZSAxMzpcbnRoaXMuJCA9IHt9OyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy4kLCAnX19saW5lX18nLCB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fJC5maXJzdF9saW5lLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgfSlcbmJyZWFrO1xuY2FzZSAxNDogY2FzZSAxOTpcbnRoaXMuJCA9ICQkWyQwLTFdOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy4kLCAnX19saW5lX18nLCB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fJC5maXJzdF9saW5lLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgfSlcbmJyZWFrO1xuY2FzZSAxNTpcbnRoaXMuJCA9IFskJFskMC0yXSwgJCRbJDBdXTtcbmJyZWFrO1xuY2FzZSAxNjpcbnRoaXMuJCA9IHt9OyB0aGlzLiRbJCRbJDBdWzBdXSA9ICQkWyQwXVsxXTtcbmJyZWFrO1xuY2FzZSAxNzpcbnRoaXMuJCA9ICQkWyQwLTJdOyAkJFskMC0yXVskJFskMF1bMF1dID0gJCRbJDBdWzFdO1xuYnJlYWs7XG5jYXNlIDE4OlxudGhpcy4kID0gW107IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLiQsICdfX2xpbmVfXycsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl8kLmZpcnN0X2xpbmUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KVxuYnJlYWs7XG5jYXNlIDIwOlxudGhpcy4kID0gWyQkWyQwXV07XG5icmVhaztcbmNhc2UgMjE6XG50aGlzLiQgPSAkJFskMC0yXTsgJCRbJDAtMl0ucHVzaCgkJFskMF0pO1xuYnJlYWs7XG59XG59LFxudGFibGU6IFt7Mzo1LDQ6JFYwLDU6Niw2OiRWMSw3OjMsODokVjIsOTo0LDEwOiRWMywxMTokVjQsMTI6MSwxMzoyLDE1OjcsMTY6OCwxNzokVjUsMjM6JFY2fSx7MTpbM119LHsxNDpbMSwxNl19LG8oJFY3LFsyLDddKSxvKCRWNyxbMiw4XSksbygkVjcsWzIsOV0pLG8oJFY3LFsyLDEwXSksbygkVjcsWzIsMTFdKSxvKCRWNyxbMiwxMl0pLG8oJFY3LFsyLDNdKSxvKCRWNyxbMiw0XSksbygkVjcsWzIsNV0pLG8oWzE0LDE4LDIxLDIyLDI0XSxbMiwxXSksbygkVjcsWzIsMl0pLHszOjIwLDQ6JFYwLDE4OlsxLDE3XSwxOToxOCwyMDoxOX0sezM6NSw0OiRWMCw1OjYsNjokVjEsNzozLDg6JFYyLDk6NCwxMDokVjMsMTE6JFY0LDEzOjIzLDE1OjcsMTY6OCwxNzokVjUsMjM6JFY2LDI0OlsxLDIxXSwyNToyMn0sezE6WzIsNl19LG8oJFY3LFsyLDEzXSksezE4OlsxLDI0XSwyMjpbMSwyNV19LG8oJFY4LFsyLDE2XSksezIxOlsxLDI2XX0sbygkVjcsWzIsMThdKSx7MjI6WzEsMjhdLDI0OlsxLDI3XX0sbygkVjksWzIsMjBdKSxvKCRWNyxbMiwxNF0pLHszOjIwLDQ6JFYwLDIwOjI5fSx7Mzo1LDQ6JFYwLDU6Niw2OiRWMSw3OjMsODokVjIsOTo0LDEwOiRWMywxMTokVjQsMTM6MzAsMTU6NywxNjo4LDE3OiRWNSwyMzokVjZ9LG8oJFY3LFsyLDE5XSksezM6NSw0OiRWMCw1OjYsNjokVjEsNzozLDg6JFYyLDk6NCwxMDokVjMsMTE6JFY0LDEzOjMxLDE1OjcsMTY6OCwxNzokVjUsMjM6JFY2fSxvKCRWOCxbMiwxN10pLG8oJFY4LFsyLDE1XSksbygkVjksWzIsMjFdKV0sXG5kZWZhdWx0QWN0aW9uczogezE2OlsyLDZdfSxcbnBhcnNlRXJyb3I6IGZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7XG4gICAgaWYgKGhhc2gucmVjb3ZlcmFibGUpIHtcbiAgICAgICAgdGhpcy50cmFjZShzdHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpO1xuICAgIH1cbn0sXG5wYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsIHN0YWNrID0gWzBdLCB0c3RhY2sgPSBbXSwgdnN0YWNrID0gW251bGxdLCBsc3RhY2sgPSBbXSwgdGFibGUgPSB0aGlzLnRhYmxlLCB5eXRleHQgPSAnJywgeXlsaW5lbm8gPSAwLCB5eWxlbmcgPSAwLCByZWNvdmVyaW5nID0gMCwgVEVSUk9SID0gMiwgRU9GID0gMTtcbiAgICB2YXIgYXJncyA9IGxzdGFjay5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGxleGVyID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmxleGVyKTtcbiAgICB2YXIgc2hhcmVkU3RhdGUgPSB7IHl5OiB7fSB9O1xuICAgIGZvciAodmFyIGsgaW4gdGhpcy55eSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMueXksIGspKSB7XG4gICAgICAgICAgICBzaGFyZWRTdGF0ZS55eVtrXSA9IHRoaXMueXlba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV4ZXIuc2V0SW5wdXQoaW5wdXQsIHNoYXJlZFN0YXRlLnl5KTtcbiAgICBzaGFyZWRTdGF0ZS55eS5sZXhlciA9IGxleGVyO1xuICAgIHNoYXJlZFN0YXRlLnl5LnBhcnNlciA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiBsZXhlci55eWxsb2MgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbGV4ZXIueXlsbG9jID0ge307XG4gICAgfVxuICAgIHZhciB5eWxvYyA9IGxleGVyLnl5bGxvYztcbiAgICBsc3RhY2sucHVzaCh5eWxvYyk7XG4gICAgdmFyIHJhbmdlcyA9IGxleGVyLm9wdGlvbnMgJiYgbGV4ZXIub3B0aW9ucy5yYW5nZXM7XG4gICAgaWYgKHR5cGVvZiBzaGFyZWRTdGF0ZS55eS5wYXJzZUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHNoYXJlZFN0YXRlLnl5LnBhcnNlRXJyb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLnBhcnNlRXJyb3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcFN0YWNrKG4pIHtcbiAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47XG4gICAgICAgIHZzdGFjay5sZW5ndGggPSB2c3RhY2subGVuZ3RoIC0gbjtcbiAgICAgICAgbHN0YWNrLmxlbmd0aCA9IGxzdGFjay5sZW5ndGggLSBuO1xuICAgIH1cbiAgICBfdG9rZW5fc3RhY2s6XG4gICAgICAgIGZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgICAgIHZhciB0b2tlbjtcbiAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubGV4KCkgfHwgRU9GO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuc3ltYm9sc19bdG9rZW5dIHx8IHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsID0ge30sIHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkge1xuICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTtcbiAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkge1xuICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSAnJztcbiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVybWluYWxzX1twXSAmJiBwID4gVEVSUk9SKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCdcXCcnICsgdGhpcy50ZXJtaW5hbHNfW3BdICsgJ1xcJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZXhlci5zaG93UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJyArICh5eWxpbmVubyArIDEpICsgJzpcXG4nICsgbGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAnXFxuRXhwZWN0aW5nICcgKyBleHBlY3RlZC5qb2luKCcsICcpICsgJywgZ290IFxcJycgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICdcXCcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcgKyAoeXlsaW5lbm8gKyAxKSArICc6IFVuZXhwZWN0ZWQgJyArIChzeW1ib2wgPT0gRU9GID8gJ2VuZCBvZiBpbnB1dCcgOiAnXFwnJyArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgJ1xcJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGxleGVyLm1hdGNoLFxuICAgICAgICAgICAgICAgICAgICB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiBsZXhlci55eWxpbmVubyxcbiAgICAgICAgICAgICAgICAgICAgbG9jOiB5eWxvYyxcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogJyArIHN0YXRlICsgJywgdG9rZW46ICcgKyBzeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgIHZzdGFjay5wdXNoKGxleGVyLnl5dGV4dCk7XG4gICAgICAgICAgICBsc3RhY2sucHVzaChsZXhlci55eWxsb2MpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhY3Rpb25bMV0pO1xuICAgICAgICAgICAgc3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICB5eWxlbmcgPSBsZXhlci55eWxlbmc7XG4gICAgICAgICAgICAgICAgeXl0ZXh0ID0gbGV4ZXIueXl0ZXh0O1xuICAgICAgICAgICAgICAgIHl5bGluZW5vID0gbGV4ZXIueXlsaW5lbm87XG4gICAgICAgICAgICAgICAgeXlsb2MgPSBsZXhlci55eWxsb2M7XG4gICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY292ZXJpbmctLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sO1xuICAgICAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBsZW4gPSB0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzFdO1xuICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVuXTtcbiAgICAgICAgICAgIHl5dmFsLl8kID0ge1xuICAgICAgICAgICAgICAgIGZpcnN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfbGluZSxcbiAgICAgICAgICAgICAgICBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLFxuICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9jb2x1bW4sXG4gICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9jb2x1bW5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgeXl2YWwuXyQucmFuZ2UgPSBbXG4gICAgICAgICAgICAgICAgICAgIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sXG4gICAgICAgICAgICAgICAgICAgIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5hcHBseSh5eXZhbCwgW1xuICAgICAgICAgICAgICAgIHl5dGV4dCxcbiAgICAgICAgICAgICAgICB5eWxlbmcsXG4gICAgICAgICAgICAgICAgeXlsaW5lbm8sXG4gICAgICAgICAgICAgICAgc2hhcmVkU3RhdGUueXksXG4gICAgICAgICAgICAgICAgYWN0aW9uWzFdLFxuICAgICAgICAgICAgICAgIHZzdGFjayxcbiAgICAgICAgICAgICAgICBsc3RhY2tcbiAgICAgICAgICAgIF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsIC0xICogbGVuICogMik7XG4gICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTtcbiAgICAgICAgICAgICAgICBsc3RhY2sgPSBsc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTtcbiAgICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpO1xuICAgICAgICAgICAgbHN0YWNrLnB1c2goeXl2YWwuXyQpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59fTtcbi8qIGdlbmVyYXRlZCBieSBqaXNvbi1sZXggMC4zLjQgKi9cbnZhciBsZXhlciA9IChmdW5jdGlvbigpe1xudmFyIGxleGVyID0gKHtcblxuRU9GOjEsXG5cbnBhcnNlRXJyb3I6ZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICAgICAgaWYgKHRoaXMueXkucGFyc2VyKSB7XG4gICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vIHJlc2V0cyB0aGUgbGV4ZXIsIHNldHMgbmV3IGlucHV0XG5zZXRJbnB1dDpmdW5jdGlvbiAoaW5wdXQsIHl5KSB7XG4gICAgICAgIHRoaXMueXkgPSB5eSB8fCB0aGlzLnl5IHx8IHt9O1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9tb3JlID0gdGhpcy5fYmFja3RyYWNrID0gdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7XG4gICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnO1xuICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrID0gWydJTklUSUFMJ107XG4gICAgICAgIHRoaXMueXlsbG9jID0ge1xuICAgICAgICAgICAgZmlyc3RfbGluZTogMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogMCxcbiAgICAgICAgICAgIGxhc3RfbGluZTogMSxcbiAgICAgICAgICAgIGxhc3RfY29sdW1uOiAwXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFswLDBdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuLy8gY29uc3VtZXMgYW5kIHJldHVybnMgb25lIGNoYXIgZnJvbSB0aGUgaW5wdXRcbmlucHV0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07XG4gICAgICAgIHRoaXMueXl0ZXh0ICs9IGNoO1xuICAgICAgICB0aGlzLnl5bGVuZysrO1xuICAgICAgICB0aGlzLm9mZnNldCsrO1xuICAgICAgICB0aGlzLm1hdGNoICs9IGNoO1xuICAgICAgICB0aGlzLm1hdGNoZWQgKz0gY2g7XG4gICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcXHJcXG4/fFxcbikuKi9nKTtcbiAgICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgICAgICB0aGlzLnl5bGluZW5vKys7XG4gICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfY29sdW1uKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlWzFdKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKDEpO1xuICAgICAgICByZXR1cm4gY2g7XG4gICAgfSxcblxuLy8gdW5zaGlmdHMgb25lIGNoYXIgKG9yIGEgc3RyaW5nKSBpbnRvIHRoZSBpbnB1dFxudW5wdXQ6ZnVuY3Rpb24gKGNoKSB7XG4gICAgICAgIHZhciBsZW4gPSBjaC5sZW5ndGg7XG4gICAgICAgIHZhciBsaW5lcyA9IGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0O1xuICAgICAgICB0aGlzLnl5dGV4dCA9IHRoaXMueXl0ZXh0LnN1YnN0cigwLCB0aGlzLnl5dGV4dC5sZW5ndGggLSBsZW4pO1xuICAgICAgICAvL3RoaXMueXlsZW5nIC09IGxlbjtcbiAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuO1xuICAgICAgICB2YXIgb2xkTGluZXMgPSB0aGlzLm1hdGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG4gICAgICAgIHRoaXMubWF0Y2ggPSB0aGlzLm1hdGNoLnN1YnN0cigwLCB0aGlzLm1hdGNoLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAobGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy55eWxpbmVubyAtPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7XG5cbiAgICAgICAgdGhpcy55eWxsb2MgPSB7XG4gICAgICAgICAgICBmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5maXJzdF9saW5lLFxuICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID9cbiAgICAgICAgICAgICAgICAobGluZXMubGVuZ3RoID09PSBvbGRMaW5lcy5sZW5ndGggPyB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gOiAwKVxuICAgICAgICAgICAgICAgICArIG9sZExpbmVzW29sZExpbmVzLmxlbmd0aCAtIGxpbmVzLmxlbmd0aF0ubGVuZ3RoIC0gbGluZXNbMF0ubGVuZ3RoIDpcbiAgICAgICAgICAgICAgdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIC0gbGVuXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3JbMF0sIHJbMF0gKyB0aGlzLnl5bGVuZyAtIGxlbl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy55eWxlbmcgPSB0aGlzLnl5dGV4dC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbi8vIFdoZW4gY2FsbGVkIGZyb20gYWN0aW9uLCBjYWNoZXMgbWF0Y2hlZCB0ZXh0IGFuZCBhcHBlbmRzIGl0IG9uIG5leHQgYWN0aW9uXG5tb3JlOmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbW9yZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbi8vIFdoZW4gY2FsbGVkIGZyb20gYWN0aW9uLCBzaWduYWxzIHRoZSBsZXhlciB0aGF0IHRoaXMgcnVsZSBmYWlscyB0byBtYXRjaCB0aGUgaW5wdXQsIHNvIHRoZSBuZXh0IG1hdGNoaW5nIHJ1bGUgKHJlZ2V4KSBzaG91bGQgYmUgdGVzdGVkIGluc3RlYWQuXG5yZWplY3Q6ZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgdGhpcy5fYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnICsgKHRoaXMueXlsaW5lbm8gKyAxKSArICcuIFlvdSBjYW4gb25seSBpbnZva2UgcmVqZWN0KCkgaW4gdGhlIGxleGVyIHdoZW4gdGhlIGxleGVyIGlzIG9mIHRoZSBiYWNrdHJhY2tpbmcgcGVyc3Vhc2lvbiAob3B0aW9ucy5iYWNrdHJhY2tfbGV4ZXIgPSB0cnVlKS5cXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdG9rZW46IG51bGwsXG4gICAgICAgICAgICAgICAgbGluZTogdGhpcy55eWxpbmVub1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4vLyByZXRhaW4gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBtYXRjaFxubGVzczpmdW5jdGlvbiAobikge1xuICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0Y2guc2xpY2UobikpO1xuICAgIH0sXG5cbi8vIGRpc3BsYXlzIGFscmVhZHkgbWF0Y2hlZCBpbnB1dCwgaS5lLiBmb3IgZXJyb3IgbWVzc2FnZXNcbnBhc3RJbnB1dDpmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gKHBhc3QubGVuZ3RoID4gMjAgPyAnLi4uJzonJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuXG4vLyBkaXNwbGF5cyB1cGNvbWluZyBpbnB1dCwgaS5lLiBmb3IgZXJyb3IgbWVzc2FnZXNcbnVwY29taW5nSW5wdXQ6ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMubWF0Y2g7XG4gICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7XG4gICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMC1uZXh0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLDIwKSArIChuZXh0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykpLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuXG4vLyBkaXNwbGF5cyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIHdoZXJlIHRoZSBsZXhpbmcgZXJyb3Igb2NjdXJyZWQsIGkuZS4gZm9yIGVycm9yIG1lc3NhZ2VzXG5zaG93UG9zaXRpb246ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTtcbiAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oXCItXCIpO1xuICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyBcIlxcblwiICsgYyArIFwiXlwiO1xuICAgIH0sXG5cbi8vIHRlc3QgdGhlIGxleGVkIHRva2VuOiByZXR1cm4gRkFMU0Ugd2hlbiBub3QgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0b2tlblxudGVzdF9tYXRjaDpmdW5jdGlvbiAobWF0Y2gsIGluZGV4ZWRfcnVsZSkge1xuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIGJhY2t1cDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgLy8gc2F2ZSBjb250ZXh0XG4gICAgICAgICAgICBiYWNrdXAgPSB7XG4gICAgICAgICAgICAgICAgeXlsaW5lbm86IHRoaXMueXlsaW5lbm8sXG4gICAgICAgICAgICAgICAgeXlsbG9jOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2xpbmU6IHRoaXMueXlsbG9jLmZpcnN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy5sYXN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHl5dGV4dDogdGhpcy55eXRleHQsXG4gICAgICAgICAgICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICAgICAgICAgICAgbWF0Y2hlczogdGhpcy5tYXRjaGVzLFxuICAgICAgICAgICAgICAgIG1hdGNoZWQ6IHRoaXMubWF0Y2hlZCxcbiAgICAgICAgICAgICAgICB5eWxlbmc6IHRoaXMueXlsZW5nLFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgX21vcmU6IHRoaXMuX21vcmUsXG4gICAgICAgICAgICAgICAgX2lucHV0OiB0aGlzLl9pbnB1dCxcbiAgICAgICAgICAgICAgICB5eTogdGhpcy55eSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25TdGFjazogdGhpcy5jb25kaXRpb25TdGFjay5zbGljZSgwKSxcbiAgICAgICAgICAgICAgICBkb25lOiB0aGlzLmRvbmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykge1xuICAgICAgICAgICAgICAgIGJhY2t1cC55eWxsb2MucmFuZ2UgPSB0aGlzLnl5bGxvYy5yYW5nZS5zbGljZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueXlsbG9jID0ge1xuICAgICAgICAgICAgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLFxuICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sXG4gICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCAtIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLm1hdGNoKC9cXHI/XFxuPy8pWzBdLmxlbmd0aCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07XG4gICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07XG4gICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoO1xuICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9iYWNrdHJhY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZShtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICB0aGlzLm1hdGNoZWQgKz0gbWF0Y2hbMF07XG4gICAgICAgIHRva2VuID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwodGhpcywgdGhpcy55eSwgdGhpcywgaW5kZXhlZF9ydWxlLCB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMV0pO1xuICAgICAgICBpZiAodGhpcy5kb25lICYmIHRoaXMuX2lucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9iYWNrdHJhY2spIHtcbiAgICAgICAgICAgIC8vIHJlY292ZXIgY29udGV4dFxuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBiYWNrdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tdID0gYmFja3VwW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBydWxlIGFjdGlvbiBjYWxsZWQgcmVqZWN0KCkgaW1wbHlpbmcgdGhlIG5leHQgcnVsZSBzaG91bGQgYmUgdGVzdGVkIGluc3RlYWQuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbi8vIHJldHVybiBuZXh0IG1hdGNoIGluIGlucHV0XG5uZXh0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIHRlbXBNYXRjaCxcbiAgICAgICAgICAgIGluZGV4O1xuICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHtcbiAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5fY3VycmVudFJ1bGVzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTtcbiAgICAgICAgICAgIGlmICh0ZW1wTWF0Y2ggJiYgKCFtYXRjaCB8fCB0ZW1wTWF0Y2hbMF0ubGVuZ3RoID4gbWF0Y2hbMF0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMudGVzdF9tYXRjaCh0ZW1wTWF0Y2gsIHJ1bGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JhY2t0cmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBydWxlIGFjdGlvbiBjYWxsZWQgcmVqZWN0KCkgaW1wbHlpbmcgYSBydWxlIE1JU21hdGNoLlxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZTogdGhpcyBpcyBhIGxleGVyIHJ1bGUgd2hpY2ggY29uc3VtZXMgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYSB0b2tlbiAoZS5nLiB3aGl0ZXNwYWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25zLmZsZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnRlc3RfbWF0Y2gobWF0Y2gsIHJ1bGVzW2luZGV4XSk7XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZTogdGhpcyBpcyBhIGxleGVyIHJ1bGUgd2hpY2ggY29uc3VtZXMgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYSB0b2tlbiAoZS5nLiB3aGl0ZXNwYWNlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXFxuJyArIHRoaXMuc2hvd1Bvc2l0aW9uKCksIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgICAgICAgIHRva2VuOiBudWxsLFxuICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMueXlsaW5lbm9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuLy8gcmV0dXJuIG5leHQgbWF0Y2ggdGhhdCBoYXMgYSB0b2tlblxubGV4OmZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm5leHQoKTtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV4KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyBhY3RpdmF0ZXMgYSBuZXcgbGV4ZXIgY29uZGl0aW9uIHN0YXRlIChwdXNoZXMgdGhlIG5ldyBsZXhlciBjb25kaXRpb24gc3RhdGUgb250byB0aGUgY29uZGl0aW9uIHN0YWNrKVxuYmVnaW46ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pO1xuICAgIH0sXG5cbi8vIHBvcCB0aGUgcHJldmlvdXNseSBhY3RpdmUgbGV4ZXIgY29uZGl0aW9uIHN0YXRlIG9mZiB0aGUgY29uZGl0aW9uIHN0YWNrXG5wb3BTdGF0ZTpmdW5jdGlvbiBwb3BTdGF0ZSgpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFja1swXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vIHByb2R1Y2UgdGhlIGxleGVyIHJ1bGUgc2V0IHdoaWNoIGlzIGFjdGl2ZSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgbGV4ZXIgY29uZGl0aW9uIHN0YXRlXG5fY3VycmVudFJ1bGVzOmZ1bmN0aW9uIF9jdXJyZW50UnVsZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAmJiB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbXCJJTklUSUFMXCJdLnJ1bGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuLy8gcmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIGxleGVyIGNvbmRpdGlvbiBzdGF0ZTsgd2hlbiBhbiBpbmRleCBhcmd1bWVudCBpcyBwcm92aWRlZCBpdCBwcm9kdWNlcyB0aGUgTi10aCBwcmV2aW91cyBjb25kaXRpb24gc3RhdGUsIGlmIGF2YWlsYWJsZVxudG9wU3RhdGU6ZnVuY3Rpb24gdG9wU3RhdGUobikge1xuICAgICAgICBuID0gdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxIC0gTWF0aC5hYnMobiB8fCAwKTtcbiAgICAgICAgaWYgKG4gPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbbl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJTklUSUFMXCI7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyBhbGlhcyBmb3IgYmVnaW4oY29uZGl0aW9uKVxucHVzaFN0YXRlOmZ1bmN0aW9uIHB1c2hTdGF0ZShjb25kaXRpb24pIHtcbiAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24pO1xuICAgIH0sXG5cbi8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHN0YXRlcyBjdXJyZW50bHkgb24gdGhlIHN0YWNrXG5zdGF0ZVN0YWNrU2l6ZTpmdW5jdGlvbiBzdGF0ZVN0YWNrU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoO1xuICAgIH0sXG5vcHRpb25zOiB7fSxcbnBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eSx5eV8sJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucyxZWV9TVEFSVCkge1xudmFyIFlZU1RBVEU9WVlfU1RBUlQ7XG5zd2l0Y2goJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykge1xuY2FzZSAwOi8qIHNraXAgd2hpdGVzcGFjZSAqL1xuYnJlYWs7XG5jYXNlIDE6cmV0dXJuIDZcbmJyZWFrO1xuY2FzZSAyOnl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cigxLHl5Xy55eWxlbmctMik7IHJldHVybiA0XG5icmVhaztcbmNhc2UgMzpyZXR1cm4gMTdcbmJyZWFrO1xuY2FzZSA0OnJldHVybiAxOFxuYnJlYWs7XG5jYXNlIDU6cmV0dXJuIDIzXG5icmVhaztcbmNhc2UgNjpyZXR1cm4gMjRcbmJyZWFrO1xuY2FzZSA3OnJldHVybiAyMlxuYnJlYWs7XG5jYXNlIDg6cmV0dXJuIDIxXG5icmVhaztcbmNhc2UgOTpyZXR1cm4gMTBcbmJyZWFrO1xuY2FzZSAxMDpyZXR1cm4gMTFcbmJyZWFrO1xuY2FzZSAxMTpyZXR1cm4gOFxuYnJlYWs7XG5jYXNlIDEyOnJldHVybiAxNFxuYnJlYWs7XG5jYXNlIDEzOnJldHVybiAnSU5WQUxJRCdcbmJyZWFrO1xufVxufSxcbnJ1bGVzOiBbL14oPzpcXHMrKS8sL14oPzooLT8oWzAtOV18WzEtOV1bMC05XSspKShcXC5bMC05XSspPyhbZUVdWy0rXT9bMC05XSspP1xcYikvLC9eKD86XCIoPzpcXFxcW1xcXFxcImJmbnJ0L118XFxcXHVbYS1mQS1GMC05XXs0fXxbXlxcXFxcXDAtXFx4MDlcXHgwYS1cXHgxZlwiXSkqXCIpLywvXig/OlxceykvLC9eKD86XFx9KS8sL14oPzpcXFspLywvXig/OlxcXSkvLC9eKD86LCkvLC9eKD86OikvLC9eKD86dHJ1ZVxcYikvLC9eKD86ZmFsc2VcXGIpLywvXig/Om51bGxcXGIpLywvXig/OiQpLywvXig/Oi4pL10sXG5jb25kaXRpb25zOiB7XCJJTklUSUFMXCI6e1wicnVsZXNcIjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM10sXCJpbmNsdXNpdmVcIjp0cnVlfX1cbn0pO1xucmV0dXJuIGxleGVyO1xufSkoKTtcbnBhcnNlci5sZXhlciA9IGxleGVyO1xuZnVuY3Rpb24gUGFyc2VyICgpIHtcbiAgdGhpcy55eSA9IHt9O1xufVxuUGFyc2VyLnByb3RvdHlwZSA9IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFyc2VyO1xucmV0dXJuIG5ldyBQYXJzZXI7XG59KSgpO1xuXG5cbmlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG5leHBvcnRzLnBhcnNlciA9IHBhcnNlcjtcbmV4cG9ydHMuUGFyc2VyID0gcGFyc2VyLlBhcnNlcjtcbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXJzZXIucGFyc2UuYXBwbHkocGFyc2VyLCBhcmd1bWVudHMpOyB9O1xufVxuIiwiaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL2Vycm9yL3BhcnNpbmdfZXJyb3IuanMnO1xuaW1wb3J0IGpzb25saW50IGZyb20gJ0BtYXBib3gvanNvbmxpbnQtbGluZXMtcHJpbWl0aXZlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlYWRTdHlsZShzdHlsZSkge1xuICAgIGlmIChzdHlsZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnIHx8IHN0eWxlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4ganNvbmxpbnQucGFyc2Uoc3R5bGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzaW5nRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZVN0eWxlTWluIGZyb20gJy4vdmFsaWRhdGVfc3R5bGUubWluLmpzJztcbmltcG9ydCB7djh9IGZyb20gJy4vc3R5bGUtc3BlYy5qcyc7XG5pbXBvcnQgcmVhZFN0eWxlIGZyb20gJy4vcmVhZF9zdHlsZS5qcyc7XG5cbi8qKlxuICogVmFsaWRhdGUgYSBNYXBib3ggR0wgc3R5bGUgYWdhaW5zdCB0aGUgc3R5bGUgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGFsaWFzIHZhbGlkYXRlXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8QnVmZmVyfSBzdHlsZSBUaGUgc3R5bGUgdG8gYmUgdmFsaWRhdGVkLiBJZiBhIGBTdHJpbmdgXG4gKiAgICAgb3IgYEJ1ZmZlcmAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBlcnJvcnMgd2lsbCBjb250YWluIGxpbmUgbnVtYmVycy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBzcGVjIHZlcnNpb24gaXMgaW5mZXJyZWQgZnJvbSB0aGUgc3R5bGVzaGVldC5cbiAqIEByZXR1cm5zIHtBcnJheTxWYWxpZGF0aW9uRXJyb3J8UGFyc2luZ0Vycm9yPn1cbiAqIEBleGFtcGxlXG4gKiAgIHZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjJykudmFsaWRhdGU7XG4gKiAgIHZhciBzdHlsZSA9IGZzLnJlYWRGaWxlU3luYygnLi9zdHlsZS5qc29uJywgJ3V0ZjgnKTtcbiAqICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKHN0eWxlKTtcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlKHN0eWxlLCBzdHlsZVNwZWMgPSB2OCkge1xuICAgIGxldCBzID0gc3R5bGU7XG5cbiAgICB0cnkge1xuICAgICAgICBzID0gcmVhZFN0eWxlKHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIFtlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVTdHlsZU1pbihzLCBzdHlsZVNwZWMpO1xufVxuXG5leHBvcnQgY29uc3Qgc291cmNlID0gdmFsaWRhdGVTdHlsZU1pbi5zb3VyY2U7XG5leHBvcnQgY29uc3QgbGlnaHQgPSB2YWxpZGF0ZVN0eWxlTWluLmxpZ2h0O1xuZXhwb3J0IGNvbnN0IGxheWVyID0gdmFsaWRhdGVTdHlsZU1pbi5sYXllcjtcbmV4cG9ydCBjb25zdCBmaWx0ZXIgPSB2YWxpZGF0ZVN0eWxlTWluLmZpbHRlcjtcbmV4cG9ydCBjb25zdCBwYWludFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5O1xuZXhwb3J0IGNvbnN0IGxheW91dFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZU1pbi5sYXlvdXRQcm9wZXJ0eTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB2YWxpZGF0ZVN0eWxlIGZyb20gJy4vdmFsaWRhdGVfc3R5bGUubWluLmpzJztcbmltcG9ydCB7djh9IGZyb20gJy4vc3R5bGUtc3BlYy5qcyc7XG5pbXBvcnQgcmVhZFN0eWxlIGZyb20gJy4vcmVhZF9zdHlsZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuL3V0aWwvZ2V0X3R5cGUuanMnO1xuXG5jb25zdCBTVVBQT1JURURfU1BFQ19WRVJTSU9OID0gODtcbmNvbnN0IE1BWF9TT1VSQ0VTX0lOX1NUWUxFID0gMTU7XG5cbmZ1bmN0aW9uIGlzVmFsaWQodmFsdWU6ID9zdHJpbmcsIHJlZ2V4OiBSZWdFeHApOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlIHx8IGdldFR5cGUodmFsdWUpICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdmFsdWUubWF0Y2gocmVnZXgpO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb3VudChzb3VyY2U6IE9iamVjdCk6IG51bWJlciB7XG4gICAgaWYgKHNvdXJjZS51cmwpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS51cmwuc3BsaXQoJywnKS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxvd2VkS2V5RXJyb3JzKG9iajogT2JqZWN0LCBrZXlzOiBBcnJheTwqPiwgcGF0aDogP3N0cmluZyk6IEFycmF5PD9WYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChrZXlzKTtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmICghYWxsb3dlZC5oYXMoaykpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwYXRoID8gYCR7cGF0aH0uJHtrfWAgOiBudWxsO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihwcm9wLCBvYmpba10sIGBVbnN1cHBvcnRlZCBwcm9wZXJ0eSBcIiR7a31cImApKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlcnJvcnM7XG59XG5cbmNvbnN0IGFjY2VwdGVkU291cmNlVHlwZXMgPSBuZXcgU2V0KFtcInZlY3RvclwiLCBcInJhc3RlclwiLCBcInJhc3Rlci1kZW1cIl0pO1xuZnVuY3Rpb24gZ2V0U291cmNlRXJyb3JzKHNvdXJjZTogT2JqZWN0LCBpOiBudW1iZXIpOiBBcnJheTw/VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG5cbiAgICAvKlxuICAgICAqIElubGluZWQgc291cmNlcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgTWFwYm94IFN0eWxlcyBBUEksIHNvIG9ubHlcbiAgICAgKiBcInR5cGVcIiwgXCJ1cmxcIiwgYW5kIFwidGlsZVNpemVcIiBwcm9wZXJ0aWVzIGFyZSB2YWxpZFxuICAgICAqL1xuICAgIGNvbnN0IHNvdXJjZUtleXMgPSBbJ3R5cGUnLCAndXJsJywgJ3RpbGVTaXplJ107XG4gICAgZXJyb3JzLnB1c2goLi4uZ2V0QWxsb3dlZEtleUVycm9ycyhzb3VyY2UsIHNvdXJjZUtleXMsICdzb3VyY2UnKSk7XG5cbiAgICAvKlxuICAgICAqIFwidHlwZVwiIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9uZSBvZiBcInZlY3RvclwiLCBcInJhc3RlclwiLCBcInJhc3Rlci1kZW1cIlxuICAgICAqL1xuICAgIGlmICghYWNjZXB0ZWRTb3VyY2VUeXBlcy5oYXMoU3RyaW5nKHNvdXJjZS50eXBlKSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlc1ske2l9XS50eXBlYCwgc291cmNlLnR5cGUsIGBFeHBlY3RlZCBvbmUgb2YgWyR7QXJyYXkuZnJvbShhY2NlcHRlZFNvdXJjZVR5cGVzKS5qb2luKFwiLCBcIil9XWApKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFwic291cmNlXCIgaXMgcmVxdWlyZWQuIFZhbGlkIGV4YW1wbGVzOlxuICAgICAqIG1hcGJveDovL21hcGJveC5hYmNkMTIzNFxuICAgICAqIG1hcGJveDovL3Blbm55LmFiY2QxMjM0XG4gICAgICogbWFwYm94Oi8vbWFwYm94LmFiY2QxMjM0LHBlbm55LmFiY2QxMjM0XG4gICAgICovXG4gICAgY29uc3Qgc291cmNlVXJsUGF0dGVybiA9IC9ebWFwYm94OlxcL1xcLyhbXi9dKikkLztcbiAgICBpZiAoIXNvdXJjZS51cmwgfHwgIWlzVmFsaWQoc291cmNlLnVybCwgc291cmNlVXJsUGF0dGVybikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlc1ske2l9XS51cmxgLCBzb3VyY2UudXJsLCAnRXhwZWN0ZWQgYSB2YWxpZCBNYXBib3ggdGlsZXNldCB1cmwnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlc0Vycm9ycyhzb3VyY2VzOiBPYmplY3QpOiBBcnJheTw/VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIE9iamVjdC5rZXlzKHNvdXJjZXMpLmZvckVhY2goKHM6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUVycm9ycyA9IGdldFNvdXJjZUVycm9ycyhzb3VyY2VzW3NdLCBpKTtcblxuICAgICAgICAvLyBJZiBzb3VyY2UgaGFzIGVycm9ycywgc2tpcCBjb3VudGluZ1xuICAgICAgICBpZiAoIXNvdXJjZUVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyBnZXRTb3VyY2VDb3VudChzb3VyY2VzW3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnNvdXJjZUVycm9ycyk7XG4gICAgfSk7XG5cbiAgICBpZiAoY291bnQgPiBNQVhfU09VUkNFU19JTl9TVFlMRSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKCdzb3VyY2VzJywgbnVsbCwgYFN0eWxlcyBtdXN0IGNvbnRhaW4gJHtNQVhfU09VUkNFU19JTl9TVFlMRX0gb3IgZmV3ZXIgc291cmNlc2ApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RXJyb3JzKHN0eWxlOiBPYmplY3QsIHNwZWNLZXlzOiBBcnJheTxhbnk+KTogQXJyYXk8P1ZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgLypcbiAgICAgKiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIG9wdGlvbmFsIGJ1dCBmdWxseSBtYW5hZ2VkIGJ5IHRoZSBNYXBib3ggU3R5bGVzXG4gICAgICogQVBJLiBWYWx1ZXMgb24gc3R5bGVzaGVldCBvbiBQT1NUIG9yIFBBVENIIHdpbGwgYmUgaWdub3JlZDogXCJvd25lclwiLFxuICAgICAqIFwiaWRcIiwgXCJjYWNoZUNvbnRyb2xcIiwgXCJkcmFmdFwiLCBcImNyZWF0ZWRcIiwgXCJtb2RpZmllZFwiXG4gICAgICpcbiAgICAgKiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIG9wdGlvbmFsLiBUaGUgTWFwYm94IFN0eWxlcyBBUEkgcmVzcGVjdHMgdmFsdWUgb25cbiAgICAgKiBzdHlsZXNoZWV0IG9uIFBBVENILCBidXQgaWdub3JlcyB0aGUgdmFsdWUgb24gUE9TVDogXCJ2aXNpYmlsaXR5XCJcbiAgICAgKi9cbiAgICBjb25zdCBvcHRpb25hbFJvb3RQcm9wZXJ0aWVzID0gW1xuICAgICAgICAnb3duZXInLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnY2FjaGVDb250cm9sJyxcbiAgICAgICAgJ2RyYWZ0JyxcbiAgICAgICAgJ2NyZWF0ZWQnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAndmlzaWJpbGl0eSdcbiAgICBdO1xuXG4gICAgY29uc3QgYWxsb3dlZEtleUVycm9ycyA9IGdldEFsbG93ZWRLZXlFcnJvcnMoc3R5bGUsIFsuLi5zcGVjS2V5cywgLi4ub3B0aW9uYWxSb290UHJvcGVydGllc10pO1xuICAgIGVycm9ycy5wdXNoKC4uLmFsbG93ZWRLZXlFcnJvcnMpO1xuXG4gICAgaWYgKHN0eWxlLnZlcnNpb24gPiBTVVBQT1JURURfU1BFQ19WRVJTSU9OIHx8IHN0eWxlLnZlcnNpb24gPCBTVVBQT1JURURfU1BFQ19WRVJTSU9OKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoJ3ZlcnNpb24nLCBzdHlsZS52ZXJzaW9uLCBgU3R5bGUgdmVyc2lvbiBtdXN0IGJlICR7U1VQUE9SVEVEX1NQRUNfVkVSU0lPTn1gKSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBcImdseXBoc1wiIGlzIG9wdGlvbmFsLiBJZiBwcmVzZW50LCB2YWxpZCBleGFtcGxlczpcbiAgICAgKiBtYXBib3g6Ly9mb250cy9wZW5ueS97Zm9udHN0YWNrfS97cmFuZ2V9LnBiZlxuICAgICAqIG1hcGJveDovL2ZvbnRzL21hcGJveC97Zm9udHN0YWNrfS97cmFuZ2V9LnBiZlxuICAgICAqL1xuICAgIGNvbnN0IGdseXBoVXJsUGF0dGVybiA9IC9ebWFwYm94OlxcL1xcL2ZvbnRzXFwvKFteL10qKVxcL3tmb250c3RhY2t9XFwve3JhbmdlfS5wYmYkLztcbiAgICBpZiAoIWlzVmFsaWQoc3R5bGUuZ2x5cGhzLCBnbHlwaFVybFBhdHRlcm4pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoJ2dseXBocycsIHN0eWxlLmdseXBocywgJ1N0eWxlcyBtdXN0IHJlZmVyZW5jZSBnbHlwaHMgaG9zdGVkIGJ5IE1hcGJveCcpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFwic3ByaXRlXCIgaXMgb3B0aW9uYWwuIElmIHByZXNlbnQsIHZhbGlkIGV4YW1wbGVzOlxuICAgICAqIG1hcGJveDovL3Nwcml0ZXMvcGVubnkvYWJjZDEyMzRcbiAgICAgKiBtYXBib3g6Ly9zcHJpdGVzL21hcGJveC9hYmNkMTIzNC9kcmFmdFxuICAgICAqIG1hcGJveDovL3Nwcml0ZXMvY3lydXMvYWJjZDEyMzQvYWJjZDEyMzRcbiAgICAgKi9cbiAgICBjb25zdCBzcHJpdGVVcmxQYXR0ZXJuID0gL15tYXBib3g6XFwvXFwvc3ByaXRlc1xcLyhbXi9dKilcXC8oW14vXSopXFwvPyhbXi9dKik/JC87XG4gICAgaWYgKCFpc1ZhbGlkKHN0eWxlLnNwcml0ZSwgc3ByaXRlVXJsUGF0dGVybikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcignc3ByaXRlJywgc3R5bGUuc3ByaXRlLCAnU3R5bGVzIG11c3QgcmVmZXJlbmNlIHNwcml0ZXMgaG9zdGVkIGJ5IE1hcGJveCcpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFwidmlzaWJpbGl0eVwiIGlzIG9wdGlvbmFsLiBJZiBwcmVzZW50LCB2YWxpZCBleGFtcGxlczpcbiAgICAgKiBcInByaXZhdGVcIlxuICAgICAqIFwicHVibGljXCJcbiAgICAgKi9cbiAgICBjb25zdCB2aXNpYmlsaXR5UGF0dGVybiA9IC9eKHB1YmxpY3xwcml2YXRlKSQvO1xuICAgIGlmICghaXNWYWxpZChzdHlsZS52aXNpYmlsaXR5LCB2aXNpYmlsaXR5UGF0dGVybikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcigndmlzaWJpbGl0eScsIHN0eWxlLnZpc2liaWxpdHksICdTdHlsZSB2aXNpYmlsaXR5IG11c3QgYmUgcHVibGljIG9yIHByaXZhdGUnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIE1hcGJveCBHTCBzdHlsZSBhZ2FpbnN0IHRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uIGFuZCBjaGVjayBmb3JcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTWFwYm94IFN0eWxlcyBBUEkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlIFRoZSBzdHlsZSB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyB7QXJyYXk8VmFsaWRhdGlvbkVycm9yPn1cbiAqIEBleGFtcGxlXG4gKiAgIHZhciB2YWxpZGF0ZU1hcGJveEFwaVN1cHBvcnRlZCA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZV9zdHlsZV9tYXBib3hfYXBpX3N1cHBvcnRlZC5qcycpO1xuICogICB2YXIgZXJyb3JzID0gdmFsaWRhdGVNYXBib3hBcGlTdXBwb3J0ZWQoc3R5bGUpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU1hcGJveEFwaVN1cHBvcnRlZChzdHlsZTogT2JqZWN0KTogQXJyYXk8P1ZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGxldCBzID0gc3R5bGU7XG4gICAgdHJ5IHtcbiAgICAgICAgcyA9IHJlYWRTdHlsZShzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBbZV07XG4gICAgfVxuXG4gICAgbGV0IGVycm9ycyA9IHZhbGlkYXRlU3R5bGUocywgdjgpXG4gICAgICAgIC5jb25jYXQoZ2V0Um9vdEVycm9ycyhzLCBPYmplY3Qua2V5cyh2OC4kcm9vdCkpKTtcblxuICAgIGlmIChzLnNvdXJjZXMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChnZXRTb3VyY2VzRXJyb3JzKHMuc291cmNlcykpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG50eXBlIEV4cHJlc3Npb25UeXBlID0gJ2RhdGEtZHJpdmVuJyB8ICdjcm9zcy1mYWRlZCcgfCAnY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW4nIHwgJ2NvbG9yLXJhbXAnIHwgJ2RhdGEtY29uc3RhbnQnIHwgJ2NvbnN0YW50JztcbnR5cGUgRXhwcmVzc2lvblBhcmFtZXRlcnMgPSBBcnJheTwnem9vbScgfCAnZmVhdHVyZScgfCAnZmVhdHVyZS1zdGF0ZScgfCAnaGVhdG1hcC1kZW5zaXR5JyB8ICdsaW5lLXByb2dyZXNzJyB8ICdza3ktcmFkaWFsLXByb2dyZXNzJz47XG5cbnR5cGUgRXhwcmVzc2lvblNwZWNpZmljYXRpb24gPSB7XG4gICAgaW50ZXJwb2xhdGVkOiBib29sZWFuLFxuICAgIHBhcmFtZXRlcnM6IEV4cHJlc3Npb25QYXJhbWV0ZXJzXG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uID0ge1xuICAgIHR5cGU6ICdudW1iZXInLFxuICAgICdwcm9wZXJ0eS10eXBlJzogRXhwcmVzc2lvblR5cGUsXG4gICAgZXhwcmVzc2lvbj86IEV4cHJlc3Npb25TcGVjaWZpY2F0aW9uLFxuICAgIHRyYW5zaXRpb246IGJvb2xlYW4sXG4gICAgZGVmYXVsdD86IG51bWJlclxufSB8IHtcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAncHJvcGVydHktdHlwZSc6IEV4cHJlc3Npb25UeXBlLFxuICAgIGV4cHJlc3Npb24/OiBFeHByZXNzaW9uU3BlY2lmaWNhdGlvbixcbiAgICB0cmFuc2l0aW9uOiBib29sZWFuLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmcsXG4gICAgdG9rZW5zPzogYm9vbGVhblxufSB8IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgdHJhbnNpdGlvbjogYm9vbGVhbixcbiAgICBkZWZhdWx0PzogYm9vbGVhblxufSB8IHtcbiAgICB0eXBlOiAnZW51bScsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgdmFsdWVzOiB7W186IHN0cmluZ106IHt9fSxcbiAgICB0cmFuc2l0aW9uOiBib29sZWFuLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmdcbn0gfCB7XG4gICAgdHlwZTogJ2NvbG9yJyxcbiAgICAncHJvcGVydHktdHlwZSc6IEV4cHJlc3Npb25UeXBlLFxuICAgIGV4cHJlc3Npb24/OiBFeHByZXNzaW9uU3BlY2lmaWNhdGlvbixcbiAgICB0cmFuc2l0aW9uOiBib29sZWFuLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmcsXG4gICAgb3ZlcnJpZGFibGU6IGJvb2xlYW5cbn0gfCB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICB2YWx1ZTogJ251bWJlcicsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIHRyYW5zaXRpb246IGJvb2xlYW4sXG4gICAgZGVmYXVsdD86IEFycmF5PG51bWJlcj5cbn0gfCB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICB2YWx1ZTogJ3N0cmluZycsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIHRyYW5zaXRpb246IGJvb2xlYW4sXG4gICAgZGVmYXVsdD86IEFycmF5PHN0cmluZz5cbn07XG5cbmltcG9ydCB2OCBmcm9tICcuL3JlZmVyZW5jZS92OC5qc29uJztcbmltcG9ydCBsYXRlc3QgZnJvbSAnLi9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCBmb3JtYXQgZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IG1pZ3JhdGUgZnJvbSAnLi9taWdyYXRlLmpzJztcbmltcG9ydCBjb21wb3NpdGUgZnJvbSAnLi9jb21wb3NpdGUuanMnO1xuaW1wb3J0IGRlcmVmTGF5ZXJzIGZyb20gJy4vZGVyZWYuanMnO1xuaW1wb3J0IGRpZmYgZnJvbSAnLi9kaWZmLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9lcnJvci9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCB7U3R5bGVFeHByZXNzaW9uLCBpc0V4cHJlc3Npb24sIGNyZWF0ZUV4cHJlc3Npb24sIGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbiwgbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uLCBab29tQ29uc3RhbnRFeHByZXNzaW9uLCBab29tRGVwZW5kZW50RXhwcmVzc2lvbiwgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9ufSBmcm9tICcuL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IGZlYXR1cmVGaWx0ZXIsIHtpc0V4cHJlc3Npb25GaWx0ZXJ9IGZyb20gJy4vZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuXG5pbXBvcnQgY29udmVydEZpbHRlciBmcm9tICcuL2ZlYXR1cmVfZmlsdGVyL2NvbnZlcnQuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4vdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQge2NyZWF0ZUZ1bmN0aW9uLCBpc0Z1bmN0aW9ufSBmcm9tICcuL2Z1bmN0aW9uL2luZGV4LmpzJztcbmltcG9ydCBjb252ZXJ0RnVuY3Rpb24gZnJvbSAnLi9mdW5jdGlvbi9jb252ZXJ0LmpzJztcbmltcG9ydCB7ZWFjaFNvdXJjZSwgZWFjaExheWVyLCBlYWNoUHJvcGVydHl9IGZyb20gJy4vdmlzaXQuanMnO1xuXG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZV9zdHlsZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVNYXBib3hBcGlTdXBwb3J0ZWQgZnJvbSAnLi92YWxpZGF0ZV9tYXBib3hfYXBpX3N1cHBvcnRlZC5qcyc7XG5cbmNvbnN0IGV4cHJlc3Npb24gPSB7XG4gICAgU3R5bGVFeHByZXNzaW9uLFxuICAgIGlzRXhwcmVzc2lvbixcbiAgICBpc0V4cHJlc3Npb25GaWx0ZXIsXG4gICAgY3JlYXRlRXhwcmVzc2lvbixcbiAgICBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24sXG4gICAgbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIFpvb21Db25zdGFudEV4cHJlc3Npb24sXG4gICAgWm9vbURlcGVuZGVudEV4cHJlc3Npb24sXG4gICAgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uXG59O1xuXG5jb25zdCBzdHlsZUZ1bmN0aW9uID0ge1xuICAgIGNvbnZlcnRGdW5jdGlvbixcbiAgICBjcmVhdGVGdW5jdGlvbixcbiAgICBpc0Z1bmN0aW9uXG59O1xuXG5jb25zdCB2aXNpdCA9IHtlYWNoU291cmNlLCBlYWNoTGF5ZXIsIGVhY2hQcm9wZXJ0eX07XG5cbmV4cG9ydCB7XG4gICAgdjgsXG4gICAgbGF0ZXN0LFxuICAgIGZvcm1hdCxcbiAgICBtaWdyYXRlLFxuICAgIGNvbXBvc2l0ZSxcbiAgICBkZXJlZkxheWVycyxcbiAgICBkaWZmLFxuICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICBQYXJzaW5nRXJyb3IsXG4gICAgZXhwcmVzc2lvbixcbiAgICBmZWF0dXJlRmlsdGVyLFxuICAgIGNvbnZlcnRGaWx0ZXIsXG4gICAgQ29sb3IsXG4gICAgc3R5bGVGdW5jdGlvbiBhcyBmdW5jdGlvbixcbiAgICB2YWxpZGF0ZSxcbiAgICB2YWxpZGF0ZU1hcGJveEFwaVN1cHBvcnRlZCxcbiAgICB2aXNpdFxufTtcblxudmFsaWRhdGUucGFyc2VkID0gdmFsaWRhdGU7XG52YWxpZGF0ZS5sYXRlc3QgPSB2YWxpZGF0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@mapbox/mapbox-gl-style-spec/dist/index.es.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global, Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Color\", function() { return Color; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ParsingError\", function() { return ParsingError$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ValidationError\", function() { return ValidationError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"composite\", function() { return composite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"convertFilter\", function() { return convertFilter$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"derefLayers\", function() { return derefLayers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"diff\", function() { return diffStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"expression\", function() { return expression$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"featureFilter\", function() { return createFilter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"format\", function() { return format; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"function\", function() { return styleFunction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"latest\", function() { return v8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"migrate\", function() { return migrate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v8\", function() { return v8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"validate\", function() { return validateStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"validateMapboxApiSupported\", function() { return validateMapboxApiSupported; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"visit\", function() { return visit; });\nfunction _toArray(r) { return _arrayWithHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableRest(); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _wrapNativeSuper(t) { var r = \"function\" == typeof Map ? new Map() : void 0; return _wrapNativeSuper = function _wrapNativeSuper(t) { if (null === t || !_isNativeFunction(t)) return t; if (\"function\" != typeof t) throw new TypeError(\"Super expression must either be null or a function\"); if (void 0 !== r) { if (r.has(t)) return r.get(t); r.set(t, Wrapper); } function Wrapper() { return _construct(t, arguments, _getPrototypeOf(this).constructor); } return Wrapper.prototype = Object.create(t.prototype, { constructor: { value: Wrapper, enumerable: !1, writable: !0, configurable: !0 } }), _setPrototypeOf(Wrapper, t); }, _wrapNativeSuper(t); }\nfunction _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _isNativeFunction(t) { try { return -1 !== Function.toString.call(t).indexOf(\"[native code]\"); } catch (n) { return \"function\" == typeof t; } }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _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; } } }; }\nfunction _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; } }\nfunction _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; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar $version = 8;\nvar $root = {\n version: {\n required: true,\n type: \"enum\",\n values: [8],\n doc: \"Style specification version number. Must be 8.\",\n example: 8\n },\n name: {\n type: \"string\",\n doc: \"A human-readable name for the style.\",\n example: \"Bright\"\n },\n metadata: {\n type: \"*\",\n doc: \"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"\n },\n center: {\n type: \"array\",\n value: \"number\",\n doc: \"Default map center in longitude and latitude. The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: [-73.9749, 40.7736]\n },\n zoom: {\n type: \"number\",\n doc: \"Default zoom level. The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: 12.5\n },\n bearing: {\n type: \"number\",\n \"default\": 0,\n period: 360,\n units: \"degrees\",\n doc: \"Default bearing, in degrees. The bearing is the compass direction that is \\\"up\\\"; for example, a bearing of 90° orients the map so that east is up. This value will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: 29\n },\n pitch: {\n type: \"number\",\n \"default\": 0,\n units: \"degrees\",\n doc: \"Default pitch, in degrees. Zero is perpendicular to the surface, for a look straight down at the map, while a greater value like 60 looks ahead towards the horizon. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\n example: 50\n },\n light: {\n type: \"light\",\n doc: \"The global light source.\",\n example: {\n anchor: \"viewport\",\n color: \"white\",\n intensity: 0.4\n }\n },\n terrain: {\n type: \"terrain\",\n doc: \"A global modifier that elevates layers and markers based on a DEM data source.\"\n },\n fog: {\n type: \"fog\",\n doc: \"A global effect that fades layers and markers based on their distance to the camera. The fog can be used to approximate the effect of atmosphere on distant objects and enhance the depth perception of the map when used with terrain or 3D features.\"\n },\n sources: {\n required: true,\n type: \"sources\",\n doc: \"Data source specifications.\",\n example: {\n \"mapbox-streets\": {\n type: \"vector\",\n url: \"mapbox://mapbox.mapbox-streets-v6\"\n }\n }\n },\n sprite: {\n type: \"string\",\n doc: \"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended. This property is required if any layer uses the `background-pattern`, `fill-pattern`, `line-pattern`, `fill-extrusion-pattern`, or `icon-image` properties. The URL must be absolute, containing the [scheme, authority and path components](https://en.wikipedia.org/wiki/URL#Syntax).\",\n example: \"mapbox://sprites/mapbox/bright-v8\"\n },\n glyphs: {\n type: \"string\",\n doc: \"A URL template for loading signed-distance-field glyph sets in PBF format. The URL must include `{fontstack}` and `{range}` tokens. This property is required if any layer uses the `text-field` layout property. The URL must be absolute, containing the [scheme, authority and path components](https://en.wikipedia.org/wiki/URL#Syntax).\",\n example: \"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\"\n },\n transition: {\n type: \"transition\",\n doc: \"A global transition definition to use as a default across properties, to be used for timing transitions between one value and the next when no property-specific transition is set. Collision-based symbol fading is controlled independently of the style's `transition` property.\",\n example: {\n duration: 300,\n delay: 0\n }\n },\n layers: {\n required: true,\n type: \"array\",\n value: \"layer\",\n doc: \"Layers will be drawn in the order of this array.\",\n example: [{\n id: \"water\",\n source: \"mapbox-streets\",\n \"source-layer\": \"water\",\n type: \"fill\",\n paint: {\n \"fill-color\": \"#00ffff\"\n }\n }]\n }\n};\nvar sources = {\n \"*\": {\n type: \"source\",\n doc: \"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For image and video sources, a URL must be provided. For GeoJSON sources, a URL or inline GeoJSON must be provided.\"\n }\n};\nvar source = [\"source_vector\", \"source_raster\", \"source_raster_dem\", \"source_geojson\", \"source_video\", \"source_image\"];\nvar source_vector = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n vector: {\n doc: \"A vector tile source.\"\n }\n },\n doc: \"The type of the source.\"\n },\n url: {\n type: \"string\",\n doc: \"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`.\"\n },\n tiles: {\n type: \"array\",\n value: \"string\",\n doc: \"An array of one or more tile source URLs, as in the TileJSON spec.\"\n },\n bounds: {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [-180, -85.051129, 180, 85.051129],\n doc: \"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL.\"\n },\n scheme: {\n type: \"enum\",\n values: {\n xyz: {\n doc: \"Slippy map tilenames scheme.\"\n },\n tms: {\n doc: \"OSGeo spec scheme.\"\n }\n },\n \"default\": \"xyz\",\n doc: \"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\"\n },\n minzoom: {\n type: \"number\",\n \"default\": 0,\n doc: \"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 22,\n doc: \"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n promoteId: {\n type: \"promoteId\",\n doc: \"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`. If specified as a string for a vector tile source, the same property is used across all its source layers.\"\n },\n \"volatile\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"A setting to determine whether a source's tiles are cached locally.\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.3.0\",\n ios: \"5.10.0\"\n }\n }\n },\n \"*\": {\n type: \"*\",\n doc: \"Other keys to configure the data source.\"\n }\n};\nvar source_raster = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n raster: {\n doc: \"A raster tile source.\"\n }\n },\n doc: \"The type of the source.\"\n },\n url: {\n type: \"string\",\n doc: \"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`.\"\n },\n tiles: {\n type: \"array\",\n value: \"string\",\n doc: \"An array of one or more tile source URLs, as in the TileJSON spec.\"\n },\n bounds: {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [-180, -85.051129, 180, 85.051129],\n doc: \"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL.\"\n },\n minzoom: {\n type: \"number\",\n \"default\": 0,\n doc: \"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 22,\n doc: \"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"\n },\n tileSize: {\n type: \"number\",\n \"default\": 512,\n units: \"pixels\",\n doc: \"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"\n },\n scheme: {\n type: \"enum\",\n values: {\n xyz: {\n doc: \"Slippy map tilenames scheme.\"\n },\n tms: {\n doc: \"OSGeo spec scheme.\"\n }\n },\n \"default\": \"xyz\",\n doc: \"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n \"volatile\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"A setting to determine whether a source's tiles are cached locally.\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.3.0\",\n ios: \"5.10.0\"\n }\n }\n },\n \"*\": {\n type: \"*\",\n doc: \"Other keys to configure the data source.\"\n }\n};\nvar source_raster_dem = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n \"raster-dem\": {\n doc: \"A RGB-encoded raster DEM source\"\n }\n },\n doc: \"The type of the source.\"\n },\n url: {\n type: \"string\",\n doc: \"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`.\"\n },\n tiles: {\n type: \"array\",\n value: \"string\",\n doc: \"An array of one or more tile source URLs, as in the TileJSON spec.\"\n },\n bounds: {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [-180, -85.051129, 180, 85.051129],\n doc: \"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL.\"\n },\n minzoom: {\n type: \"number\",\n \"default\": 0,\n doc: \"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 22,\n doc: \"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"\n },\n tileSize: {\n type: \"number\",\n \"default\": 512,\n units: \"pixels\",\n doc: \"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n encoding: {\n type: \"enum\",\n values: {\n terrarium: {\n doc: \"Terrarium format PNG tiles. See https://aws.amazon.com/es/public-datasets/terrain/ for more info.\"\n },\n mapbox: {\n doc: \"Mapbox Terrain RGB tiles. See https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb for more info.\"\n }\n },\n \"default\": \"mapbox\",\n doc: \"The encoding used by this source. Mapbox Terrain RGB is used by default\"\n },\n \"volatile\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"A setting to determine whether a source's tiles are cached locally.\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.3.0\",\n ios: \"5.10.0\"\n }\n }\n },\n \"*\": {\n type: \"*\",\n doc: \"Other keys to configure the data source.\"\n }\n};\nvar source_geojson = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n geojson: {\n doc: \"A GeoJSON data source.\"\n }\n },\n doc: \"The data type of the GeoJSON source.\"\n },\n data: {\n type: \"*\",\n doc: \"A URL to a GeoJSON file, or inline GeoJSON.\"\n },\n maxzoom: {\n type: \"number\",\n \"default\": 18,\n doc: \"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels).\"\n },\n attribution: {\n type: \"string\",\n doc: \"Contains an attribution to be displayed when the map is shown to a user.\"\n },\n buffer: {\n type: \"number\",\n \"default\": 128,\n maximum: 512,\n minimum: 0,\n doc: \"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance.\"\n },\n filter: {\n type: \"*\",\n doc: \"An expression for filtering features prior to processing them for rendering.\"\n },\n tolerance: {\n type: \"number\",\n \"default\": 0.375,\n doc: \"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\"\n },\n cluster: {\n type: \"boolean\",\n \"default\": false,\n doc: \"If the data is a collection of point features, setting this to true clusters the points by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\\n * `cluster` Is `true` if the point is a cluster \\n * `cluster_id` A unqiue id for the cluster to be used in conjunction with the [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\\n * `point_count` Number of original points grouped into this cluster\\n * `point_count_abbreviated` An abbreviated point count\"\n },\n clusterRadius: {\n type: \"number\",\n \"default\": 50,\n minimum: 0,\n doc: \"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile.\"\n },\n clusterMaxZoom: {\n type: \"number\",\n doc: \"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\"\n },\n clusterMinPoints: {\n type: \"number\",\n doc: \"Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`.\"\n },\n clusterProperties: {\n type: \"*\",\n doc: \"An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from clustered points. Has the form `{\\\"property_name\\\": [operator, map_expression]}`. `operator` is any expression function that accepts at least 2 operands (e.g. `\\\"+\\\"` or `\\\"max\\\"`) — it accumulates the property value from clusters/points the cluster contains; `map_expression` produces the value of a single point.\\n\\nExample: `{\\\"sum\\\": [\\\"+\\\", [\\\"get\\\", \\\"scalerank\\\"]]}`.\\n\\nFor more advanced use cases, in place of `operator`, you can use a custom reduce expression that references a special `[\\\"accumulated\\\"]` value, e.g.:\\n`{\\\"sum\\\": [[\\\"+\\\", [\\\"accumulated\\\"], [\\\"get\\\", \\\"sum\\\"]], [\\\"get\\\", \\\"scalerank\\\"]]}`\"\n },\n lineMetrics: {\n type: \"boolean\",\n \"default\": false,\n doc: \"Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\"\n },\n generateId: {\n type: \"boolean\",\n \"default\": false,\n doc: \"Whether to generate ids for the geojson features. When enabled, the `feature.id` property will be auto assigned based on its index in the `features` array, over-writing any previous values.\"\n },\n promoteId: {\n type: \"promoteId\",\n doc: \"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`.\"\n }\n};\nvar source_video = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n video: {\n doc: \"A video data source.\"\n }\n },\n doc: \"The data type of the video source.\"\n },\n urls: {\n required: true,\n type: \"array\",\n value: \"string\",\n doc: \"URLs to video content in order of preferred format.\"\n },\n coordinates: {\n required: true,\n doc: \"Corners of video specified in longitude, latitude pairs.\",\n type: \"array\",\n length: 4,\n value: {\n type: \"array\",\n length: 2,\n value: \"number\",\n doc: \"A single longitude, latitude pair.\"\n }\n }\n};\nvar source_image = {\n type: {\n required: true,\n type: \"enum\",\n values: {\n image: {\n doc: \"An image data source.\"\n }\n },\n doc: \"The data type of the image source.\"\n },\n url: {\n required: true,\n type: \"string\",\n doc: \"URL that points to an image.\"\n },\n coordinates: {\n required: true,\n doc: \"Corners of image specified in longitude, latitude pairs.\",\n type: \"array\",\n length: 4,\n value: {\n type: \"array\",\n length: 2,\n value: \"number\",\n doc: \"A single longitude, latitude pair.\"\n }\n }\n};\nvar layer = {\n id: {\n type: \"string\",\n doc: \"Unique layer name.\",\n required: true\n },\n type: {\n type: \"enum\",\n values: {\n fill: {\n doc: \"A filled polygon with an optional stroked border.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n line: {\n doc: \"A stroked line.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n symbol: {\n doc: \"An icon or a text label.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n circle: {\n doc: \"A filled circle.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n heatmap: {\n doc: \"A heatmap.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"fill-extrusion\": {\n doc: \"An extruded (3D) polygon.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n raster: {\n doc: \"Raster map textures such as satellite imagery.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n hillshade: {\n doc: \"Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n background: {\n doc: \"The background color or pattern of the map.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n }\n },\n sky: {\n doc: \"A spherical dome around the map that is always rendered behind all other layers.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n }\n },\n doc: \"Rendering type of this layer.\",\n required: true\n },\n metadata: {\n type: \"*\",\n doc: \"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"\n },\n source: {\n type: \"string\",\n doc: \"Name of a source description to be used for this layer. Required for all layer types except `background`.\"\n },\n \"source-layer\": {\n type: \"string\",\n doc: \"Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\"\n },\n minzoom: {\n type: \"number\",\n minimum: 0,\n maximum: 24,\n doc: \"The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\"\n },\n maxzoom: {\n type: \"number\",\n minimum: 0,\n maximum: 24,\n doc: \"The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\"\n },\n filter: {\n type: \"filter\",\n doc: \"A expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression is not supported in filter expressions.\"\n },\n layout: {\n type: \"layout\",\n doc: \"Layout properties for the layer.\"\n },\n paint: {\n type: \"paint\",\n doc: \"Default paint properties for this layer.\"\n }\n};\nvar layout = [\"layout_fill\", \"layout_line\", \"layout_circle\", \"layout_heatmap\", \"layout_fill-extrusion\", \"layout_symbol\", \"layout_raster\", \"layout_hillshade\", \"layout_background\", \"layout_sky\"];\nvar layout_background = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_sky = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_fill = {\n \"fill-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n },\n \"data-driven styling\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_circle = {\n \"circle-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.2.0\",\n android: \"9.2.0\",\n ios: \"5.9.0\",\n macos: \"0.16.0\"\n },\n \"data-driven styling\": {\n js: \"1.2.0\",\n android: \"9.2.0\",\n ios: \"5.9.0\",\n macos: \"0.16.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_heatmap = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_line = {\n \"line-cap\": {\n type: \"enum\",\n values: {\n butt: {\n doc: \"A cap with a squared-off end which is drawn to the exact endpoint of the line.\"\n },\n round: {\n doc: \"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"\n },\n square: {\n doc: \"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"\n }\n },\n \"default\": \"butt\",\n doc: \"The display of line endings.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"2.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-join\": {\n type: \"enum\",\n values: {\n bevel: {\n doc: \"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"\n },\n round: {\n doc: \"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"\n },\n miter: {\n doc: \"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\"\n }\n },\n \"default\": \"miter\",\n doc: \"The display of lines when joining.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-miter-limit\": {\n type: \"number\",\n \"default\": 2,\n doc: \"Used to automatically convert miter joins to bevel joins for sharp angles.\",\n requires: [{\n \"line-join\": \"miter\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-round-limit\": {\n type: \"number\",\n \"default\": 1.05,\n doc: \"Used to automatically convert round joins to miter joins for shallow angles.\",\n requires: [{\n \"line-join\": \"round\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n },\n \"data-driven styling\": {\n js: \"1.2.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_symbol = {\n \"symbol-placement\": {\n type: \"enum\",\n values: {\n point: {\n doc: \"The label is placed at the point where the geometry is located.\"\n },\n line: {\n doc: \"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\"\n },\n \"line-center\": {\n doc: \"The label is placed at the center of the line of the geometry. Can only be used on `LineString` and `Polygon` geometries. Note that a single feature in a vector tile may contain multiple line geometries.\"\n }\n },\n \"default\": \"point\",\n doc: \"Label placement relative to its geometry.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"`line-center` value\": {\n js: \"0.47.0\",\n android: \"6.4.0\",\n ios: \"4.3.0\",\n macos: \"0.10.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"symbol-spacing\": {\n type: \"number\",\n \"default\": 250,\n minimum: 1,\n units: \"pixels\",\n doc: \"Distance between two symbol anchors.\",\n requires: [{\n \"symbol-placement\": \"line\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"symbol-avoid-edges\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"symbol-sort-key\": {\n type: \"number\",\n doc: \"Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.53.0\",\n android: \"7.4.0\",\n ios: \"4.11.0\",\n macos: \"0.14.0\"\n },\n \"data-driven styling\": {\n js: \"0.53.0\",\n android: \"7.4.0\",\n ios: \"4.11.0\",\n macos: \"0.14.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"symbol-z-order\": {\n type: \"enum\",\n values: {\n auto: {\n doc: \"Sorts symbols by `symbol-sort-key` if set. Otherwise, sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`.\"\n },\n \"viewport-y\": {\n doc: \"Sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`.\"\n },\n source: {\n doc: \"Sorts symbols by `symbol-sort-key` if set. Otherwise, no sorting is applied; symbols are rendered in the same order as the source data.\"\n }\n },\n \"default\": \"auto\",\n doc: \"Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.49.0\",\n android: \"6.6.0\",\n ios: \"4.5.0\",\n macos: \"0.12.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-allow-overlap\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the icon will be visible even if it collides with other previously drawn symbols.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-ignore-placement\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, other symbols can be visible even if they collide with the icon.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-optional\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.\",\n requires: [\"icon-image\", \"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-rotation-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line` or `line-center`, aligns icon x-axes with the line.\"\n },\n viewport: {\n doc: \"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"\n },\n auto: {\n doc: \"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"In combination with `symbol-placement`, determines the rotation behavior of icons.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"`auto` value\": {\n js: \"0.25.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-size\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n units: \"factor of the original icon size\",\n doc: \"Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-text-fit\": {\n type: \"enum\",\n values: {\n none: {\n doc: \"The icon is displayed at its intrinsic aspect ratio.\"\n },\n width: {\n doc: \"The icon is scaled in the x-dimension to fit the width of the text.\"\n },\n height: {\n doc: \"The icon is scaled in the y-dimension to fit the height of the text.\"\n },\n both: {\n doc: \"The icon is scaled in both x- and y-dimensions.\"\n }\n },\n \"default\": \"none\",\n doc: \"Scales the icon to fit around the associated text.\",\n requires: [\"icon-image\", \"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n },\n \"stretchable icons\": {\n js: \"1.6.0\",\n android: \"9.2.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-text-fit-padding\": {\n type: \"array\",\n value: \"number\",\n length: 4,\n \"default\": [0, 0, 0, 0],\n units: \"pixels\",\n doc: \"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.\",\n requires: [\"icon-image\", \"text-field\", {\n \"icon-text-fit\": [\"both\", \"width\", \"height\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-image\": {\n type: \"resolvedImage\",\n doc: \"Name of image in sprite to use for drawing an image background.\",\n tokens: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-rotate\": {\n type: \"number\",\n \"default\": 0,\n period: 360,\n units: \"degrees\",\n doc: \"Rotates the icon clockwise.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.21.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-padding\": {\n type: \"number\",\n \"default\": 2,\n minimum: 0,\n units: \"pixels\",\n doc: \"Size of the additional area around the icon bounding box used for detecting symbol collisions.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-keep-upright\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the icon may be flipped to prevent it from being rendered upside-down.\",\n requires: [\"icon-image\", {\n \"icon-rotation-alignment\": \"map\"\n }, {\n \"symbol-placement\": [\"line\", \"line-center\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-offset\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n doc: \"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-anchor\": {\n type: \"enum\",\n values: {\n center: {\n doc: \"The center of the icon is placed closest to the anchor.\"\n },\n left: {\n doc: \"The left side of the icon is placed closest to the anchor.\"\n },\n right: {\n doc: \"The right side of the icon is placed closest to the anchor.\"\n },\n top: {\n doc: \"The top of the icon is placed closest to the anchor.\"\n },\n bottom: {\n doc: \"The bottom of the icon is placed closest to the anchor.\"\n },\n \"top-left\": {\n doc: \"The top left corner of the icon is placed closest to the anchor.\"\n },\n \"top-right\": {\n doc: \"The top right corner of the icon is placed closest to the anchor.\"\n },\n \"bottom-left\": {\n doc: \"The bottom left corner of the icon is placed closest to the anchor.\"\n },\n \"bottom-right\": {\n doc: \"The bottom right corner of the icon is placed closest to the anchor.\"\n }\n },\n \"default\": \"center\",\n doc: \"Part of the icon placed closest to the anchor.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-pitch-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The icon is aligned to the plane of the map.\"\n },\n viewport: {\n doc: \"The icon is aligned to the plane of the viewport.\"\n },\n auto: {\n doc: \"Automatically matches the value of `icon-rotation-alignment`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"Orientation of icon when map is pitched.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-pitch-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The text is aligned to the plane of the map.\"\n },\n viewport: {\n doc: \"The text is aligned to the plane of the viewport.\"\n },\n auto: {\n doc: \"Automatically matches the value of `text-rotation-alignment`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"Orientation of text when map is pitched.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n },\n \"`auto` value\": {\n js: \"0.25.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-rotation-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line` or `line-center`, aligns text x-axes with the line.\"\n },\n viewport: {\n doc: \"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"\n },\n auto: {\n doc: \"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`.\"\n }\n },\n \"default\": \"auto\",\n doc: \"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"`auto` value\": {\n js: \"0.25.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-field\": {\n type: \"formatted\",\n \"default\": \"\",\n tokens: true,\n doc: \"Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-font\": {\n type: \"array\",\n value: \"string\",\n \"default\": [\"Open Sans Regular\", \"Arial Unicode MS Regular\"],\n doc: \"Font stack to use for displaying text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-size\": {\n type: \"number\",\n \"default\": 16,\n minimum: 0,\n units: \"pixels\",\n doc: \"Font size.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-max-width\": {\n type: \"number\",\n \"default\": 10,\n minimum: 0,\n units: \"ems\",\n doc: \"The maximum line width for text wrapping.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-line-height\": {\n type: \"number\",\n \"default\": 1.2,\n units: \"ems\",\n doc: \"Text leading value for multi-line text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"2.3.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-letter-spacing\": {\n type: \"number\",\n \"default\": 0,\n units: \"ems\",\n doc: \"Text tracking amount.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.40.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-justify\": {\n type: \"enum\",\n values: {\n auto: {\n doc: \"The text is aligned towards the anchor position.\"\n },\n left: {\n doc: \"The text is aligned to the left.\"\n },\n center: {\n doc: \"The text is centered.\"\n },\n right: {\n doc: \"The text is aligned to the right.\"\n }\n },\n \"default\": \"center\",\n doc: \"Text justification options.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n },\n auto: {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-radial-offset\": {\n type: \"number\",\n units: \"ems\",\n \"default\": 0,\n doc: \"Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n },\n \"data-driven styling\": {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n }\n },\n requires: [\"text-field\"],\n \"property-type\": \"data-driven\",\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n }\n },\n \"text-variable-anchor\": {\n type: \"array\",\n value: \"enum\",\n values: {\n center: {\n doc: \"The center of the text is placed closest to the anchor.\"\n },\n left: {\n doc: \"The left side of the text is placed closest to the anchor.\"\n },\n right: {\n doc: \"The right side of the text is placed closest to the anchor.\"\n },\n top: {\n doc: \"The top of the text is placed closest to the anchor.\"\n },\n bottom: {\n doc: \"The bottom of the text is placed closest to the anchor.\"\n },\n \"top-left\": {\n doc: \"The top left corner of the text is placed closest to the anchor.\"\n },\n \"top-right\": {\n doc: \"The top right corner of the text is placed closest to the anchor.\"\n },\n \"bottom-left\": {\n doc: \"The bottom left corner of the text is placed closest to the anchor.\"\n },\n \"bottom-right\": {\n doc: \"The bottom right corner of the text is placed closest to the anchor.\"\n }\n },\n requires: [\"text-field\", {\n \"symbol-placement\": [\"point\"]\n }],\n doc: \"To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.54.0\",\n android: \"7.4.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-anchor\": {\n type: \"enum\",\n values: {\n center: {\n doc: \"The center of the text is placed closest to the anchor.\"\n },\n left: {\n doc: \"The left side of the text is placed closest to the anchor.\"\n },\n right: {\n doc: \"The right side of the text is placed closest to the anchor.\"\n },\n top: {\n doc: \"The top of the text is placed closest to the anchor.\"\n },\n bottom: {\n doc: \"The bottom of the text is placed closest to the anchor.\"\n },\n \"top-left\": {\n doc: \"The top left corner of the text is placed closest to the anchor.\"\n },\n \"top-right\": {\n doc: \"The top right corner of the text is placed closest to the anchor.\"\n },\n \"bottom-left\": {\n doc: \"The bottom left corner of the text is placed closest to the anchor.\"\n },\n \"bottom-right\": {\n doc: \"The bottom right corner of the text is placed closest to the anchor.\"\n }\n },\n \"default\": \"center\",\n doc: \"Part of the text placed closest to the anchor.\",\n requires: [\"text-field\", {\n \"!\": \"text-variable-anchor\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-max-angle\": {\n type: \"number\",\n \"default\": 45,\n units: \"degrees\",\n doc: \"Maximum angle change between adjacent characters.\",\n requires: [\"text-field\", {\n \"symbol-placement\": [\"line\", \"line-center\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-writing-mode\": {\n type: \"array\",\n value: \"enum\",\n values: {\n horizontal: {\n doc: \"If a text's language supports horizontal writing mode, symbols with point placement would be laid out horizontally.\"\n },\n vertical: {\n doc: \"If a text's language supports vertical writing mode, symbols with point placement would be laid out vertically.\"\n }\n },\n doc: \"The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant.\",\n requires: [\"text-field\", {\n \"symbol-placement\": [\"point\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.3.0\",\n android: \"8.3.0\",\n ios: \"5.3.0\",\n macos: \"0.15.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-rotate\": {\n type: \"number\",\n \"default\": 0,\n period: 360,\n units: \"degrees\",\n doc: \"Rotates the text clockwise.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-padding\": {\n type: \"number\",\n \"default\": 2,\n minimum: 0,\n units: \"pixels\",\n doc: \"Size of the additional area around the text bounding box used for detecting symbol collisions.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-keep-upright\": {\n type: \"boolean\",\n \"default\": true,\n doc: \"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\",\n requires: [\"text-field\", {\n \"text-rotation-alignment\": \"map\"\n }, {\n \"symbol-placement\": [\"line\", \"line-center\"]\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-transform\": {\n type: \"enum\",\n values: {\n none: {\n doc: \"The text is not altered.\"\n },\n uppercase: {\n doc: \"Forces all letters to be displayed in uppercase.\"\n },\n lowercase: {\n doc: \"Forces all letters to be displayed in lowercase.\"\n }\n },\n \"default\": \"none\",\n doc: \"Specifies how to capitalize text, similar to the CSS `text-transform` property.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-offset\": {\n type: \"array\",\n doc: \"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position.\",\n value: \"number\",\n units: \"ems\",\n length: 2,\n \"default\": [0, 0],\n requires: [\"text-field\", {\n \"!\": \"text-radial-offset\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.35.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-allow-overlap\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, the text will be visible even if it collides with other previously drawn symbols.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-ignore-placement\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, other symbols can be visible even if they collide with the text.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-optional\": {\n type: \"boolean\",\n \"default\": false,\n doc: \"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.\",\n requires: [\"text-field\", \"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_raster = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar layout_hillshade = {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n};\nvar filter = {\n type: \"array\",\n value: \"*\",\n doc: \"A filter selects specific features from a layer.\"\n};\nvar filter_operator = {\n type: \"enum\",\n values: {\n \"==\": {\n doc: \"`[\\\"==\\\", key, value]` equality: `feature[key] = value`\"\n },\n \"!=\": {\n doc: \"`[\\\"!=\\\", key, value]` inequality: `feature[key] ≠ value`\"\n },\n \">\": {\n doc: \"`[\\\">\\\", key, value]` greater than: `feature[key] > value`\"\n },\n \">=\": {\n doc: \"`[\\\">=\\\", key, value]` greater than or equal: `feature[key] ≥ value`\"\n },\n \"<\": {\n doc: \"`[\\\"<\\\", key, value]` less than: `feature[key] < value`\"\n },\n \"<=\": {\n doc: \"`[\\\"<=\\\", key, value]` less than or equal: `feature[key] ≤ value`\"\n },\n \"in\": {\n doc: \"`[\\\"in\\\", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`\"\n },\n \"!in\": {\n doc: \"`[\\\"!in\\\", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`\"\n },\n all: {\n doc: \"`[\\\"all\\\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`\"\n },\n any: {\n doc: \"`[\\\"any\\\", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`\"\n },\n none: {\n doc: \"`[\\\"none\\\", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`\"\n },\n has: {\n doc: \"`[\\\"has\\\", key]` `feature[key]` exists\"\n },\n \"!has\": {\n doc: \"`[\\\"!has\\\", key]` `feature[key]` does not exist\"\n },\n within: {\n doc: \"`[\\\"within\\\", object]` feature geometry is within object geometry\"\n }\n },\n doc: \"The filter operator.\"\n};\nvar geometry_type = {\n type: \"enum\",\n values: {\n Point: {\n doc: \"Filter to point geometries.\"\n },\n LineString: {\n doc: \"Filter to line geometries.\"\n },\n Polygon: {\n doc: \"Filter to polygon geometries.\"\n }\n },\n doc: \"The geometry type for the filter to select.\"\n};\nvar function_stop = {\n type: \"array\",\n minimum: 0,\n maximum: 24,\n value: [\"number\", \"color\"],\n length: 2,\n doc: \"Zoom level and value pair.\"\n};\nvar expression = {\n type: \"array\",\n value: \"*\",\n minimum: 1,\n doc: \"An expression defines a function that can be used for data-driven style properties or feature filters.\"\n};\nvar expression_name = {\n doc: \"\",\n type: \"enum\",\n values: {\n \"let\": {\n doc: \"Binds expressions to named variables, which can then be referenced in the result expression using [\\\"var\\\", \\\"variable_name\\\"].\",\n group: \"Variable binding\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"var\": {\n doc: \"References variable bound using \\\"let\\\".\",\n group: \"Variable binding\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n literal: {\n doc: \"Provides a literal array or object value.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n array: {\n doc: \"Asserts that the input is an array (optionally with a specific item type and length). If, when the input expression is evaluated, it is not of the asserted type, then this assertion will cause the whole expression to be aborted.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n at: {\n doc: \"Retrieves an item from an array.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"in\": {\n doc: \"Determines whether an item exists in an array or a substring exists in a string.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.6.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n }\n },\n \"index-of\": {\n doc: \"Returns the first position at which an item can be found in an array or a substring can be found in a string, or `-1` if the input cannot be found. Accepts an optional index from where to begin the search.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.10.0\"\n }\n }\n },\n slice: {\n doc: \"Returns an item from an array or a substring from a string from a specified start index, or between a start index and an end index if set. The return value is inclusive of the start index but not of the end index.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.10.0\"\n }\n }\n },\n \"case\": {\n doc: \"Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n match: {\n doc: \"Selects the output for which the label value matches the input value, or the fallback value if no match is found. The input can be any expression (for example, `[\\\"get\\\", \\\"building_type\\\"]`). Each label must be unique, and must be either:\\n - a single literal value; or\\n - an array of literal values, the values of which must be all strings or all numbers (for example `[100, 101]` or `[\\\"c\\\", \\\"b\\\"]`).\\n\\nThe input matches if any of the values in the array matches using strict equality, similar to the `\\\"in\\\"` operator.\\nIf the input type does not match the type of the labels, the result will be the fallback value.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n coalesce: {\n doc: \"Evaluates each expression in turn until the first non-null value is obtained, and returns that value.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n step: {\n doc: \"Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output values (\\\"stops\\\"). The `input` may be any numeric expression (e.g., `[\\\"get\\\", \\\"population\\\"]`). Stop inputs must be numeric literals in strictly ascending order. Returns the output value of the stop just less than the input, or the first output if the input is less than the first stop.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.42.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n interpolate: {\n doc: \"Produces continuous, smooth results by interpolating between pairs of input and output values (\\\"stops\\\"). The `input` may be any numeric expression (e.g., `[\\\"get\\\", \\\"population\\\"]`). Stop inputs must be numeric literals in strictly ascending order. The output type must be `number`, `array`, or `color`.\\n\\nInterpolation types:\\n- `[\\\"linear\\\"]`: Interpolates linearly between the pair of stops just less than and just greater than the input.\\n- `[\\\"exponential\\\", base]`: Interpolates exponentially between the stops just less than and just greater than the input. `base` controls the rate at which the output increases: higher values make the output increase more towards the high end of the range. With values close to 1 the output increases linearly.\\n- `[\\\"cubic-bezier\\\", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given control points.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.42.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"interpolate-hcl\": {\n doc: \"Produces continuous, smooth results by interpolating between pairs of input and output values (\\\"stops\\\"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the Hue-Chroma-Luminance color space.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.49.0\"\n }\n }\n },\n \"interpolate-lab\": {\n doc: \"Produces continuous, smooth results by interpolating between pairs of input and output values (\\\"stops\\\"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the CIELAB color space.\",\n group: \"Ramps, scales, curves\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.49.0\"\n }\n }\n },\n ln2: {\n doc: \"Returns mathematical constant ln(2).\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n pi: {\n doc: \"Returns the mathematical constant pi.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n e: {\n doc: \"Returns the mathematical constant e.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"typeof\": {\n doc: \"Returns a string describing the type of the given value.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n string: {\n doc: \"Asserts that the input value is a string. If multiple values are provided, each one is evaluated in order until a string is obtained. If none of the inputs are strings, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n number: {\n doc: \"Asserts that the input value is a number. If multiple values are provided, each one is evaluated in order until a number is obtained. If none of the inputs are numbers, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"boolean\": {\n doc: \"Asserts that the input value is a boolean. If multiple values are provided, each one is evaluated in order until a boolean is obtained. If none of the inputs are booleans, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n object: {\n doc: \"Asserts that the input value is an object. If multiple values are provided, each one is evaluated in order until an object is obtained. If none of the inputs are objects, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n collator: {\n doc: \"Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none is provided, the default locale is used. If the requested locale is not available, the `collator` will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n format: {\n doc: \"Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain a string literal or expression, including an [`'image'`](#types-image) expression. Strings may be followed by a style override object that supports the following properties:\\n- `\\\"text-font\\\"`: Overrides the font stack specified by the root layout property.\\n- `\\\"text-color\\\"`: Overrides the color specified by the root paint property.\\n- `\\\"font-scale\\\"`: Applies a scaling factor on `text-size` as specified by the root layout property.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.48.0\",\n android: \"6.7.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n },\n \"text-font\": {\n js: \"0.48.0\",\n android: \"6.7.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n },\n \"font-scale\": {\n js: \"0.48.0\",\n android: \"6.7.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n },\n \"text-color\": {\n js: \"1.3.0\",\n android: \"7.3.0\",\n ios: \"4.10.0\",\n macos: \"0.14.0\"\n },\n image: {\n js: \"1.6.0\",\n android: \"8.6.0\",\n ios: \"5.7.0\",\n macos: \"0.15.0\"\n }\n }\n },\n image: {\n doc: \"Returns an `image` type for use in `icon-image`, `*-pattern` entries and as a section in the `format` expression. If set, the `image` argument will check that the requested image exists in the style and will return either the resolved image name or `null`, depending on whether or not the image is currently in the style. This validation process is synchronous and requires the image to have been added to the style before requesting it in the `image` argument.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.4.0\",\n android: \"8.6.0\",\n ios: \"5.7.0\",\n macos: \"0.15.0\"\n }\n }\n },\n \"number-format\": {\n doc: \"Converts the input number into a string representation using the providing formatting rules. If set, the `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits` and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.54.0\"\n }\n }\n },\n \"to-string\": {\n doc: \"Converts the input value to a string. If the input is `null`, the result is `\\\"\\\"`. If the input is a boolean, the result is `\\\"true\\\"` or `\\\"false\\\"`. If the input is a number, it is converted to a string as specified by the [\\\"NumberToString\\\" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the ECMAScript Language Specification. If the input is a color, it is converted to a string of the form `\\\"rgba(r,g,b,a)\\\"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. Otherwise, the input is converted to a string in the format specified by the [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-number\": {\n doc: \"Converts the input value to a number, if possible. If the input is `null` or `false`, the result is 0. If the input is `true`, the result is 1. If the input is a string, it is converted to a number as specified by the [\\\"ToNumber Applied to the String Type\\\" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-boolean\": {\n doc: \"Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-rgba\": {\n doc: \"Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order.\",\n group: \"Color\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"to-color\": {\n doc: \"Converts the input value to a color. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\",\n group: \"Types\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n rgb: {\n doc: \"Creates a color value from red, green, and blue components, which must range between 0 and 255, and an alpha component of 1. If any component is out of range, the expression is an error.\",\n group: \"Color\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n rgba: {\n doc: \"Creates a color value from red, green, blue components, which must range between 0 and 255, and an alpha component which must range between 0 and 1. If any component is out of range, the expression is an error.\",\n group: \"Color\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n get: {\n doc: \"Retrieves a property value from the current feature's properties, or from another object if a second argument is provided. Returns null if the requested property is missing.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n has: {\n doc: \"Tests for the presence of an property value in the current feature's properties, or from another object if a second argument is provided.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n length: {\n doc: \"Gets the length of an array or string.\",\n group: \"Lookup\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n properties: {\n doc: \"Gets the feature properties object. Note that in some cases, it may be more efficient to use [\\\"get\\\", \\\"property_name\\\"] directly.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"feature-state\": {\n doc: \"Retrieves a property value from the current feature's state. Returns null if the requested property is not present on the feature's state. A feature's state is not part of the GeoJSON or vector tile data, and must be set programmatically on each feature. Features are identified by their `id` attribute, which must be an integer or a string that can be cast to an integer. Note that [\\\"feature-state\\\"] can only be used with paint properties that support data-driven styling.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.46.0\"\n }\n }\n },\n \"geometry-type\": {\n doc: \"Gets the feature's geometry type: `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n id: {\n doc: \"Gets the feature's id, if it has one.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n zoom: {\n doc: \"Gets the current zoom level. Note that in style layout and paint properties, [\\\"zoom\\\"] may only appear as the input to a top-level \\\"step\\\" or \\\"interpolate\\\" expression.\",\n group: \"Zoom\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"heatmap-density\": {\n doc: \"Gets the kernel density estimation of a pixel in a heatmap layer, which is a relative measure of how many data points are crowded around a particular pixel. Can only be used in the `heatmap-color` property.\",\n group: \"Heatmap\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"line-progress\": {\n doc: \"Gets the progress along a gradient line. Can only be used in the `line-gradient` property.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.6.0\",\n macos: \"0.12.0\"\n }\n }\n },\n \"sky-radial-progress\": {\n doc: \"Gets the distance of a point on the sky from the sun position. Returns 0 at sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient` property.\",\n group: \"sky\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n },\n accumulated: {\n doc: \"Gets the value of a cluster property accumulated so far. Can only be used in the `clusterProperties` option of a clustered GeoJSON source.\",\n group: \"Feature data\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.53.0\"\n }\n }\n },\n \"+\": {\n doc: \"Returns the sum of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"*\": {\n doc: \"Returns the product of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"-\": {\n doc: \"For two inputs, returns the result of subtracting the second input from the first. For a single input, returns the result of subtracting it from 0.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"/\": {\n doc: \"Returns the result of floating point division of the first input by the second.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"%\": {\n doc: \"Returns the remainder after integer division of the first input by the second.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"^\": {\n doc: \"Returns the result of raising the first input to the power specified by the second.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n sqrt: {\n doc: \"Returns the square root of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.42.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n log10: {\n doc: \"Returns the base-ten logarithm of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n ln: {\n doc: \"Returns the natural logarithm of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n log2: {\n doc: \"Returns the base-two logarithm of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n sin: {\n doc: \"Returns the sine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n cos: {\n doc: \"Returns the cosine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n tan: {\n doc: \"Returns the tangent of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n asin: {\n doc: \"Returns the arcsine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n acos: {\n doc: \"Returns the arccosine of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n atan: {\n doc: \"Returns the arctangent of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n min: {\n doc: \"Returns the minimum value of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n max: {\n doc: \"Returns the maximum value of the inputs.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n round: {\n doc: \"Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example, `[\\\"round\\\", -1.5]` evaluates to -2.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n abs: {\n doc: \"Returns the absolute value of the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n ceil: {\n doc: \"Returns the smallest integer that is greater than or equal to the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n floor: {\n doc: \"Returns the largest integer that is less than or equal to the input.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n distance: {\n doc: \"Returns the shortest distance in meters between the evaluated feature and the input geometry. The input value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries, particularly below zoom level 13.\",\n group: \"Math\",\n \"sdk-support\": {\n \"basic functionality\": {\n android: \"9.2.0\",\n ios: \"5.9.0\",\n macos: \"0.16.0\"\n }\n }\n },\n \"==\": {\n doc: \"Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \"!=\": {\n doc: \"Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \">\": {\n doc: \"Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \"<\": {\n doc: \"Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \">=\": {\n doc: \"Returns `true` if the first input is greater than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n \"<=\": {\n doc: \"Returns `true` if the first input is less than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n collator: {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n },\n all: {\n doc: \"Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and no further input expressions are evaluated.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n any: {\n doc: \"Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true` and no further input expressions are evaluated.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"!\": {\n doc: \"Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n within: {\n doc: \"Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry, `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Supported features for evaluation:\\n- `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\\n- `LineString`: Returns `false` if any part of a line falls outside the boundary, the line intersects the boundary, or a line's endpoint is on the boundary.\",\n group: \"Decision\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"1.9.0\",\n android: \"9.1.0\",\n ios: \"5.8.0\",\n macos: \"0.15.0\"\n }\n }\n },\n \"is-supported-script\": {\n doc: \"Returns `true` if the input string is expected to render legibly. Returns `false` if the input string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use in Mapbox GL JS).\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.6.0\"\n }\n }\n },\n upcase: {\n doc: \"Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n downcase: {\n doc: \"Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n concat: {\n doc: \"Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a string as if by `to-string`.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n }\n },\n \"resolved-locale\": {\n doc: \"Returns the IETF language tag of the locale being used by the provided `collator`. This can be used to determine the default system locale, or to determine if a requested locale was successfully loaded.\",\n group: \"String\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n }\n }\n }\n};\nvar fog = {\n range: {\n type: \"array\",\n \"default\": [0.5, 10],\n minimum: -20,\n maximum: 20,\n length: 2,\n value: \"number\",\n \"property-type\": \"data-constant\",\n transition: true,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n doc: \"The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away.\",\n example: [0.5, 10],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.3.0\"\n }\n }\n },\n color: {\n type: \"color\",\n \"property-type\": \"data-constant\",\n \"default\": \"#ffffff\",\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"The color of the fog. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.3.0\"\n }\n }\n },\n \"horizon-blend\": {\n type: \"number\",\n \"property-type\": \"data-constant\",\n \"default\": 0.1,\n minimum: 0,\n maximum: 1,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Horizon blend applies a smooth fade from the color of the fog to the color of the sky. A value of zero leaves a sharp transition from fog to sky. Increasing the value blends the color of fog into increasingly high angles of the sky.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.3.0\"\n }\n }\n }\n};\nvar light = {\n anchor: {\n type: \"enum\",\n \"default\": \"viewport\",\n values: {\n map: {\n doc: \"The position of the light source is aligned to the rotation of the map.\"\n },\n viewport: {\n doc: \"The position of the light source is aligned to the rotation of the viewport.\"\n }\n },\n \"property-type\": \"data-constant\",\n transition: false,\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n doc: \"Whether extruded geometries are lit relative to the map or viewport.\",\n example: \"map\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n position: {\n type: \"array\",\n \"default\": [1.15, 210, 30],\n length: 3,\n value: \"number\",\n \"property-type\": \"data-constant\",\n transition: true,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n doc: \"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).\",\n example: [1.5, 90, 80],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n color: {\n type: \"color\",\n \"property-type\": \"data-constant\",\n \"default\": \"#ffffff\",\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Color tint for lighting extruded geometries.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n },\n intensity: {\n type: \"number\",\n \"property-type\": \"data-constant\",\n \"default\": 0.5,\n minimum: 0,\n maximum: 1,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n }\n }\n};\nvar terrain = {\n source: {\n type: \"string\",\n doc: \"Name of a source of `raster_dem` type to be used for terrain elevation.\",\n required: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n },\n exaggeration: {\n type: \"number\",\n \"property-type\": \"data-constant\",\n \"default\": 1,\n minimum: 0,\n maximum: 1000,\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n transition: true,\n doc: \"Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n }\n }\n};\nvar paint = [\"paint_fill\", \"paint_line\", \"paint_circle\", \"paint_heatmap\", \"paint_fill-extrusion\", \"paint_symbol\", \"paint_raster\", \"paint_hillshade\", \"paint_background\", \"paint_sky\"];\nvar paint_fill = {\n \"fill-antialias\": {\n type: \"boolean\",\n \"default\": true,\n doc: \"Whether or not the fill should be antialiased.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.21.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.\",\n transition: true,\n requires: [{\n \"!\": \"fill-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.19.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-outline-color\": {\n type: \"color\",\n doc: \"The outline color of the fill. Matches the value of `fill-color` if unspecified.\",\n transition: true,\n requires: [{\n \"!\": \"fill-pattern\"\n }, {\n \"fill-antialias\": true\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.19.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The fill is translated relative to the map.\"\n },\n viewport: {\n doc: \"The fill is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `fill-translate`.\",\n \"default\": \"map\",\n requires: [\"fill-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.49.0\",\n android: \"6.5.0\",\n macos: \"0.11.0\",\n ios: \"4.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n }\n};\nvar paint_line = {\n \"line-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the line will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-color\": {\n type: \"color\",\n doc: \"The color with which the line will be drawn.\",\n \"default\": \"#000000\",\n transition: true,\n requires: [{\n \"!\": \"line-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.23.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The line is translated relative to the map.\"\n },\n viewport: {\n doc: \"The line is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `line-translate`.\",\n \"default\": \"map\",\n requires: [\"line-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"line-width\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Stroke thickness.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-gap-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n doc: \"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\",\n transition: true,\n units: \"pixels\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-offset\": {\n type: \"number\",\n \"default\": 0,\n doc: \"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.\",\n transition: true,\n units: \"pixels\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.12.1\",\n android: \"3.0.0\",\n ios: \"3.1.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-blur\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Blur applied to the line, in pixels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"line-dasharray\": {\n type: \"array\",\n value: \"number\",\n doc: \"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n minimum: 0,\n transition: true,\n units: \"line widths\",\n requires: [{\n \"!\": \"line-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"2.3.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n },\n \"line-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.49.0\",\n android: \"6.5.0\",\n macos: \"0.11.0\",\n ios: \"4.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n },\n \"line-gradient\": {\n type: \"color\",\n doc: \"Defines a gradient with which to color a line feature. Can only be used with GeoJSON sources that specify `\\\"lineMetrics\\\": true`.\",\n transition: false,\n requires: [{\n \"!\": \"line-dasharray\"\n }, {\n \"!\": \"line-pattern\"\n }, {\n source: \"geojson\",\n has: {\n lineMetrics: true\n }\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.45.0\",\n android: \"6.5.0\",\n ios: \"4.4.0\",\n macos: \"0.11.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: true,\n parameters: [\"line-progress\"]\n },\n \"property-type\": \"color-ramp\"\n }\n};\nvar paint_circle = {\n \"circle-radius\": {\n type: \"number\",\n \"default\": 5,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Circle radius.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.18.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The fill color of the circle.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.18.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-blur\": {\n type: \"number\",\n \"default\": 0,\n doc: \"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.20.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the circle will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.20.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The circle is translated relative to the map.\"\n },\n viewport: {\n doc: \"The circle is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `circle-translate`.\",\n \"default\": \"map\",\n requires: [\"circle-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-pitch-scale\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"Circles are scaled according to their apparent distance to the camera.\"\n },\n viewport: {\n doc: \"Circles are not scaled.\"\n }\n },\n \"default\": \"map\",\n doc: \"Controls the scaling behavior of the circle when the map is pitched.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.21.0\",\n android: \"4.2.0\",\n ios: \"3.4.0\",\n macos: \"0.2.1\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-pitch-alignment\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The circle is aligned to the plane of the map.\"\n },\n viewport: {\n doc: \"The circle is aligned to the plane of the viewport.\"\n }\n },\n \"default\": \"viewport\",\n doc: \"Orientation of circle when map is pitched.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.39.0\",\n android: \"5.2.0\",\n ios: \"3.7.0\",\n macos: \"0.6.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"circle-stroke-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-stroke-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The stroke color of the circle.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"circle-stroke-opacity\": {\n type: \"number\",\n doc: \"The opacity of the circle's stroke.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n },\n \"data-driven styling\": {\n js: \"0.29.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n }\n};\nvar paint_heatmap = {\n \"heatmap-radius\": {\n type: \"number\",\n \"default\": 30,\n minimum: 1,\n transition: true,\n units: \"pixels\",\n doc: \"Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n \"data-driven styling\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"heatmap-weight\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n transition: false,\n doc: \"A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n \"data-driven styling\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"heatmap-intensity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n transition: true,\n doc: \"Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"heatmap-color\": {\n type: \"color\",\n \"default\": [\"interpolate\", [\"linear\"], [\"heatmap-density\"], 0, \"rgba(0, 0, 255, 0)\", 0.1, \"royalblue\", 0.3, \"cyan\", 0.5, \"lime\", 0.7, \"yellow\", 1, \"red\"],\n doc: \"Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\\\"heatmap-density\\\"]` as input.\",\n transition: false,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: true,\n parameters: [\"heatmap-density\"]\n },\n \"property-type\": \"color-ramp\"\n },\n \"heatmap-opacity\": {\n type: \"number\",\n doc: \"The global opacity at which the heatmap layer will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.41.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_symbol = {\n \"icon-opacity\": {\n doc: \"The opacity at which the icon will be drawn.\",\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n transition: true,\n doc: \"The color of the icon. This can only be used with sdf icons.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-halo-color\": {\n type: \"color\",\n \"default\": \"rgba(0, 0, 0, 0)\",\n transition: true,\n doc: \"The color of the icon's halo. Icon halos can only be used with SDF icons.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-halo-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Distance of halo to the icon outline.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-halo-blur\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Fade out the halo towards the outside.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"icon-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\n requires: [\"icon-image\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"icon-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"Icons are translated relative to the map.\"\n },\n viewport: {\n doc: \"Icons are translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `icon-translate`.\",\n \"default\": \"map\",\n requires: [\"icon-image\", \"icon-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the text will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-color\": {\n type: \"color\",\n doc: \"The color with which the text will be drawn.\",\n \"default\": \"#000000\",\n transition: true,\n overridable: true,\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-halo-color\": {\n type: \"color\",\n \"default\": \"rgba(0, 0, 0, 0)\",\n transition: true,\n doc: \"The color of the text's halo, which helps it stand out from backgrounds.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-halo-width\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-halo-blur\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n transition: true,\n units: \"pixels\",\n doc: \"The halo's fadeout distance towards the outside.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {\n js: \"0.33.0\",\n android: \"5.0.0\",\n ios: \"3.5.0\",\n macos: \"0.4.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"text-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\n requires: [\"text-field\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"text-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The text is translated relative to the map.\"\n },\n viewport: {\n doc: \"The text is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `text-translate`.\",\n \"default\": \"map\",\n requires: [\"text-field\", \"text-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_raster = {\n \"raster-opacity\": {\n type: \"number\",\n doc: \"The opacity at which the image will be drawn.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-hue-rotate\": {\n type: \"number\",\n \"default\": 0,\n period: 360,\n transition: true,\n units: \"degrees\",\n doc: \"Rotates hues around the color wheel.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-brightness-min\": {\n type: \"number\",\n doc: \"Increase or reduce the brightness of the image. The value is the minimum brightness.\",\n \"default\": 0,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-brightness-max\": {\n type: \"number\",\n doc: \"Increase or reduce the brightness of the image. The value is the maximum brightness.\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-saturation\": {\n type: \"number\",\n doc: \"Increase or reduce the saturation of the image.\",\n \"default\": 0,\n minimum: -1,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-contrast\": {\n type: \"number\",\n doc: \"Increase or reduce the contrast of the image.\",\n \"default\": 0,\n minimum: -1,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-resampling\": {\n type: \"enum\",\n doc: \"The resampling/interpolation method to use for overscaling, also known as texture magnification filter\",\n values: {\n linear: {\n doc: \"(Bi)linear filtering interpolates pixel values using the weighted average of the four closest original source pixels creating a smooth but blurry look when overscaled\"\n },\n nearest: {\n doc: \"Nearest neighbor filtering interpolates pixel values using the nearest original source pixel creating a sharp but pixelated look when overscaled\"\n }\n },\n \"default\": \"linear\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.47.0\",\n android: \"6.3.0\",\n ios: \"4.2.0\",\n macos: \"0.9.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"raster-fade-duration\": {\n type: \"number\",\n \"default\": 300,\n minimum: 0,\n transition: false,\n units: \"milliseconds\",\n doc: \"Fade duration when a new tile is added.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_hillshade = {\n \"hillshade-illumination-direction\": {\n type: \"number\",\n \"default\": 335,\n minimum: 0,\n maximum: 359,\n doc: \"The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map`.\",\n transition: false,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-illumination-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The hillshade illumination is relative to the north direction.\"\n },\n viewport: {\n doc: \"The hillshade illumination is relative to the top of the viewport.\"\n }\n },\n \"default\": \"viewport\",\n doc: \"Direction of light source when map is rotated.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-exaggeration\": {\n type: \"number\",\n doc: \"Intensity of the hillshade\",\n \"default\": 0.5,\n minimum: 0,\n maximum: 1,\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-shadow-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The shading color of areas that face away from the light source.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-highlight-color\": {\n type: \"color\",\n \"default\": \"#FFFFFF\",\n doc: \"The shading color of areas that faces towards the light source.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"hillshade-accent-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The shading color used to accentuate rugged terrain like sharp cliffs and gorges.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.43.0\",\n android: \"6.0.0\",\n ios: \"4.0.0\",\n macos: \"0.7.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_background = {\n \"background-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The color with which the background will be drawn.\",\n transition: true,\n requires: [{\n \"!\": \"background-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"background-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"cross-faded\"\n },\n \"background-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity at which the background will be drawn.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.10.0\",\n android: \"2.0.1\",\n ios: \"2.0.0\",\n macos: \"0.1.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar paint_sky = {\n \"sky-type\": {\n type: \"enum\",\n values: {\n gradient: {\n doc: \"Renders the sky with a gradient that can be configured with `sky-gradient-radius` and `sky-gradient`.\"\n },\n atmosphere: {\n doc: \"Renders the sky with a simulated atmospheric scattering algorithm, the sun direction can be attached to the light position or explicitly set through `sky-atmosphere-sun`.\"\n }\n },\n \"default\": \"atmosphere\",\n doc: \"The type of the sky\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-atmosphere-sun\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n units: \"degrees\",\n minimum: [0, 0],\n maximum: [360, 180],\n transition: false,\n doc: \"Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0° is directly above, at zenith, and 90° at the horizon. When this property is ommitted, the sun center is directly inherited from the light position.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-atmosphere-sun-intensity\": {\n type: \"number\",\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n \"default\": 10,\n minimum: 0,\n maximum: 100,\n transition: false,\n doc: \"Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-gradient-center\": {\n type: \"array\",\n requires: [{\n \"sky-type\": \"gradient\"\n }],\n value: \"number\",\n \"default\": [0, 0],\n length: 2,\n units: \"degrees\",\n minimum: [0, 0],\n maximum: [360, 180],\n transition: false,\n doc: \"Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0° is directly above, at zenith, and 90° at the horizon.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-gradient-radius\": {\n type: \"number\",\n requires: [{\n \"sky-type\": \"gradient\"\n }],\n \"default\": 90,\n minimum: 0,\n maximum: 180,\n transition: false,\n doc: \"The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-gradient\": {\n type: \"color\",\n \"default\": [\"interpolate\", [\"linear\"], [\"sky-radial-progress\"], 0.8, \"#87ceeb\", 1, \"white\"],\n doc: \"Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`.\",\n transition: false,\n requires: [{\n \"sky-type\": \"gradient\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n },\n \"data-driven styling\": {}\n },\n expression: {\n interpolated: true,\n parameters: [\"sky-radial-progress\"]\n },\n \"property-type\": \"color-ramp\"\n },\n \"sky-atmosphere-halo-color\": {\n type: \"color\",\n \"default\": \"white\",\n doc: \"A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer.\",\n transition: false,\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-atmosphere-color\": {\n type: \"color\",\n \"default\": \"white\",\n doc: \"A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density.\",\n transition: false,\n requires: [{\n \"sky-type\": \"atmosphere\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n \"property-type\": \"data-constant\"\n },\n \"sky-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity of the entire sky layer.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"2.0.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n};\nvar transition = {\n duration: {\n type: \"number\",\n \"default\": 300,\n minimum: 0,\n units: \"milliseconds\",\n doc: \"Time allotted for transitions to complete.\"\n },\n delay: {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n units: \"milliseconds\",\n doc: \"Length of time before a transition begins.\"\n }\n};\nvar promoteId = {\n \"*\": {\n type: \"string\",\n doc: \"A name of a feature property to use as ID for feature state.\"\n }\n};\nvar v8 = {\n $version: $version,\n $root: $root,\n sources: sources,\n source: source,\n source_vector: source_vector,\n source_raster: source_raster,\n source_raster_dem: source_raster_dem,\n source_geojson: source_geojson,\n source_video: source_video,\n source_image: source_image,\n layer: layer,\n layout: layout,\n layout_background: layout_background,\n layout_sky: layout_sky,\n layout_fill: layout_fill,\n layout_circle: layout_circle,\n layout_heatmap: layout_heatmap,\n \"layout_fill-extrusion\": {\n visibility: {\n type: \"enum\",\n values: {\n visible: {\n doc: \"The layer is shown.\"\n },\n none: {\n doc: \"The layer is not shown.\"\n }\n },\n \"default\": \"visible\",\n doc: \"Whether this layer is displayed.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n \"property-type\": \"constant\"\n }\n },\n layout_line: layout_line,\n layout_symbol: layout_symbol,\n layout_raster: layout_raster,\n layout_hillshade: layout_hillshade,\n filter: filter,\n filter_operator: filter_operator,\n geometry_type: geometry_type,\n \"function\": {\n expression: {\n type: \"expression\",\n doc: \"An expression.\"\n },\n stops: {\n type: \"array\",\n doc: \"An array of stops.\",\n value: \"function_stop\"\n },\n base: {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n doc: \"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\"\n },\n property: {\n type: \"string\",\n doc: \"The name of a feature property to use as the function input.\",\n \"default\": \"$zoom\"\n },\n type: {\n type: \"enum\",\n values: {\n identity: {\n doc: \"Return the input value as the output value.\"\n },\n exponential: {\n doc: \"Generate an output by interpolating between stops just less than and just greater than the function input.\"\n },\n interval: {\n doc: \"Return the output value of the stop just less than the function input.\"\n },\n categorical: {\n doc: \"Return the output value of the stop equal to the function input.\"\n }\n },\n doc: \"The interpolation strategy to use in function evaluation.\",\n \"default\": \"exponential\"\n },\n colorSpace: {\n type: \"enum\",\n values: {\n rgb: {\n doc: \"Use the RGB color space to interpolate color values\"\n },\n lab: {\n doc: \"Use the LAB color space to interpolate color values.\"\n },\n hcl: {\n doc: \"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually.\"\n }\n },\n doc: \"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.\",\n \"default\": \"rgb\"\n },\n \"default\": {\n type: \"*\",\n required: false,\n doc: \"A value to serve as a fallback function result when a value isn't otherwise available. It is used in the following circumstances:\\n* In categorical functions, when the feature value does not match any of the stop domain values.\\n* In property and zoom-and-property functions, when a feature does not contain a value for the specified property.\\n* In identity functions, when the feature value is not valid for the style property (for example, if the function is being used for a `circle-color` property but the feature property value is not a string or not a valid color).\\n* In interval or exponential property and zoom-and-property functions, when the feature value is not numeric.\\nIf no default is provided, the style property's default is used in these circumstances.\"\n }\n },\n function_stop: function_stop,\n expression: expression,\n expression_name: expression_name,\n fog: fog,\n light: light,\n terrain: terrain,\n paint: paint,\n paint_fill: paint_fill,\n \"paint_fill-extrusion\": {\n \"fill-extrusion-opacity\": {\n type: \"number\",\n \"default\": 1,\n minimum: 0,\n maximum: 1,\n doc: \"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-extrusion-color\": {\n type: \"color\",\n \"default\": \"#000000\",\n doc: \"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.\",\n transition: true,\n requires: [{\n \"!\": \"fill-extrusion-pattern\"\n }],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-extrusion-translate\": {\n type: \"array\",\n value: \"number\",\n length: 2,\n \"default\": [0, 0],\n transition: true,\n units: \"pixels\",\n doc: \"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-extrusion-translate-anchor\": {\n type: \"enum\",\n values: {\n map: {\n doc: \"The fill extrusion is translated relative to the map.\"\n },\n viewport: {\n doc: \"The fill extrusion is translated relative to the viewport.\"\n }\n },\n doc: \"Controls the frame of reference for `fill-extrusion-translate`.\",\n \"default\": \"map\",\n requires: [\"fill-extrusion-translate\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n },\n \"fill-extrusion-pattern\": {\n type: \"resolvedImage\",\n transition: true,\n doc: \"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\",\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.49.0\",\n android: \"6.5.0\",\n macos: \"0.11.0\",\n ios: \"4.4.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\", \"feature\"]\n },\n \"property-type\": \"cross-faded-data-driven\"\n },\n \"fill-extrusion-height\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n units: \"meters\",\n doc: \"The height with which to extrude this layer.\",\n transition: true,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-extrusion-base\": {\n type: \"number\",\n \"default\": 0,\n minimum: 0,\n units: \"meters\",\n doc: \"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.\",\n transition: true,\n requires: [\"fill-extrusion-height\"],\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n },\n \"data-driven styling\": {\n js: \"0.27.0\",\n android: \"5.1.0\",\n ios: \"3.6.0\",\n macos: \"0.5.0\"\n }\n },\n expression: {\n interpolated: true,\n parameters: [\"zoom\", \"feature\", \"feature-state\"]\n },\n \"property-type\": \"data-driven\"\n },\n \"fill-extrusion-vertical-gradient\": {\n type: \"boolean\",\n \"default\": true,\n doc: \"Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down.\",\n transition: false,\n \"sdk-support\": {\n \"basic functionality\": {\n js: \"0.50.0\",\n ios: \"4.7.0\",\n macos: \"0.13.0\"\n }\n },\n expression: {\n interpolated: false,\n parameters: [\"zoom\"]\n },\n \"property-type\": \"data-constant\"\n }\n },\n paint_line: paint_line,\n paint_circle: paint_circle,\n paint_heatmap: paint_heatmap,\n paint_symbol: paint_symbol,\n paint_raster: paint_raster,\n paint_hillshade: paint_hillshade,\n paint_background: paint_background,\n paint_sky: paint_sky,\n transition: transition,\n \"property-type\": {\n \"data-driven\": {\n type: \"property-type\",\n doc: \"Property is interpolable and can be represented using a property expression.\"\n },\n \"cross-faded\": {\n type: \"property-type\",\n doc: \"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms.\"\n },\n \"cross-faded-data-driven\": {\n type: \"property-type\",\n doc: \"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms. It can be represented using a property expression.\"\n },\n \"color-ramp\": {\n type: \"property-type\",\n doc: \"Property should be specified using a color ramp from which the output color can be sampled based on a property calculation.\"\n },\n \"data-constant\": {\n type: \"property-type\",\n doc: \"Property is interpolable but cannot be represented using a property expression.\"\n },\n constant: {\n type: \"property-type\",\n doc: \"Property is constant across all zoom levels and property values.\"\n }\n },\n promoteId: promoteId\n};\n\n// Note: This regex matches even invalid JSON strings, but since we’re\n// working on the output of `JSON.stringify` we know that only valid strings\n// are present (unless the user supplied a weird `options.indent` but in\n// that case we don’t care since the output would be invalid anyway).\nvar stringOrChar = /(\"(?:[^\\\\\"]|\\\\.)*\")|[:,]/g;\nvar jsonStringifyPrettyCompact = function stringify(passedObj, options) {\n var indent, maxLength, replacer;\n options = options || {};\n indent = JSON.stringify([1], undefined, options.indent === undefined ? 2 : options.indent).slice(2, -3);\n maxLength = indent === \"\" ? Infinity : options.maxLength === undefined ? 80 : options.maxLength;\n replacer = options.replacer;\n return function _stringify(obj, currentIndent, reserved) {\n // prettier-ignore\n var end, index, items, key, keyPart, keys, length, nextIndent, prettified, start, string, value;\n if (obj && typeof obj.toJSON === \"function\") {\n obj = obj.toJSON();\n }\n string = JSON.stringify(obj, replacer);\n if (string === undefined) {\n return string;\n }\n length = maxLength - currentIndent.length - reserved;\n if (string.length <= length) {\n prettified = string.replace(stringOrChar, function (match, stringLiteral) {\n return stringLiteral || match + \" \";\n });\n if (prettified.length <= length) {\n return prettified;\n }\n }\n if (replacer != null) {\n obj = JSON.parse(string);\n replacer = undefined;\n }\n if (_typeof(obj) === \"object\" && obj !== null) {\n nextIndent = currentIndent + indent;\n items = [];\n index = 0;\n if (Array.isArray(obj)) {\n start = \"[\";\n end = \"]\";\n length = obj.length;\n for (; index < length; index++) {\n items.push(_stringify(obj[index], nextIndent, index === length - 1 ? 0 : 1) || \"null\");\n }\n } else {\n start = \"{\";\n end = \"}\";\n keys = Object.keys(obj);\n length = keys.length;\n for (; index < length; index++) {\n key = keys[index];\n keyPart = JSON.stringify(key) + \": \";\n value = _stringify(obj[key], nextIndent, keyPart.length + (index === length - 1 ? 0 : 1));\n if (value !== undefined) {\n items.push(keyPart + value);\n }\n }\n }\n if (items.length > 0) {\n return [start, indent + items.join(\",\\n\" + nextIndent), end].join(\"\\n\" + currentIndent);\n }\n }\n return string;\n }(passedObj, \"\", 0);\n};\nfunction sortKeysBy(obj, reference) {\n var result = {};\n for (var key in reference) {\n if (obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n for (var _key in obj) {\n if (result[_key] === undefined) {\n result[_key] = obj[_key];\n }\n }\n return result;\n}\nfunction format(style) {\n var space = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n style = sortKeysBy(style, v8.$root);\n if (style.layers) {\n style.layers = style.layers.map(function (layer) {\n return sortKeysBy(layer, v8.layer);\n });\n }\n return jsonStringifyPrettyCompact(style, {\n indent: space\n });\n}\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nfunction createCommonjsModule(fn) {\n var module = {\n exports: {}\n };\n return fn(module, module.exports), module.exports;\n}\nfunction commonjsRequire(target) {\n throw new Error('Could not dynamically require \"' + target + '\". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.');\n}\n\n/*! https://mths.be/punycode v1.3.2 by @mathias */\n\nvar punycode = createCommonjsModule(function (module, exports) {\n (function (root) {\n /** Detect free variables */\n var freeExports = exports && !exports.nodeType && exports;\n var freeModule = module && !module.nodeType && module;\n var freeGlobal = _typeof(commonjsGlobal) == 'object' && commonjsGlobal;\n if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) {\n root = freeGlobal;\n }\n\n /**\n * The `punycode` object.\n * @name punycode\n * @type Object\n */\n var punycode,\n /** Highest positive signed 32-bit float value */\n maxInt = 2147483647,\n // aka. 0x7FFFFFFF or 2^31-1\n\n /** Bootstring parameters */\n base = 36,\n tMin = 1,\n tMax = 26,\n skew = 38,\n damp = 700,\n initialBias = 72,\n initialN = 128,\n // 0x80\n delimiter = '-',\n // '\\x2D'\n\n /** Regular expressions */\n regexPunycode = /^xn--/,\n regexNonASCII = /[^\\x20-\\x7E]/,\n // unprintable ASCII chars + non-ASCII chars\n regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g,\n // RFC 3490 separators\n\n /** Error messages */\n errors = {\n 'overflow': 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n },\n /** Convenience shortcuts */\n baseMinusTMin = base - tMin,\n floor = Math.floor,\n stringFromCharCode = String.fromCharCode,\n /** Temporary variable */\n key;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\n function error(type) {\n throw RangeError(errors[type]);\n }\n\n /**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\n function map(array, fn) {\n var length = array.length;\n var result = [];\n while (length--) {\n result[length] = fn(array[length]);\n }\n return result;\n }\n\n /**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\n function mapDomain(string, fn) {\n var parts = string.split('@');\n var result = '';\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n string = parts[1];\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n string = string.replace(regexSeparators, '\\x2E');\n var labels = string.split('.');\n var encoded = map(labels, fn).join('.');\n return result + encoded;\n }\n\n /**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\n function ucs2decode(string) {\n var output = [],\n counter = 0,\n length = string.length,\n value,\n extra;\n while (counter < length) {\n value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // high surrogate, and there is a next character\n extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) {\n // low surrogate\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // unmatched surrogate; only append this code unit, in case the next\n // code unit is the high surrogate of a surrogate pair\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n }\n\n /**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\n function ucs2encode(array) {\n return map(array, function (value) {\n var output = '';\n if (value > 0xFFFF) {\n value -= 0x10000;\n output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n value = 0xDC00 | value & 0x3FF;\n }\n output += stringFromCharCode(value);\n return output;\n }).join('');\n }\n\n /**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\n function basicToDigit(codePoint) {\n if (codePoint - 48 < 10) {\n return codePoint - 22;\n }\n if (codePoint - 65 < 26) {\n return codePoint - 65;\n }\n if (codePoint - 97 < 26) {\n return codePoint - 97;\n }\n return base;\n }\n\n /**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\n function digitToBasic(digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n }\n\n /**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * http://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\n function adapt(delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for /* no initialization */\n (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n }\n\n /**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\n function decode(input) {\n // Don't use UCS-2\n var output = [],\n inputLength = input.length,\n out,\n i = 0,\n n = initialN,\n bias = initialBias,\n basic,\n j,\n index,\n oldi,\n w,\n k,\n digit,\n t,\n /** Cached calculation results */\n baseMinusT;\n\n // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) {\n basic = 0;\n }\n for (j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n for /* no final expression */\n (index = basic > 0 ? basic + 1 : 0; index < inputLength;) {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n for /* no condition */\n (oldi = i, w = 1, k = base;; k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n digit = basicToDigit(input.charCodeAt(index++));\n if (digit >= base || digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n i += digit * w;\n t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (digit < t) {\n break;\n }\n baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n w *= baseMinusT;\n }\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0);\n\n // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n n += floor(i / out);\n i %= out;\n\n // Insert `n` at position `i` of the output\n output.splice(i++, 0, n);\n }\n return ucs2encode(output);\n }\n\n /**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\n function encode(input) {\n var n,\n delta,\n handledCPCount,\n basicLength,\n bias,\n j,\n m,\n q,\n k,\n t,\n currentValue,\n output = [],\n /** `inputLength` will hold the number of code points in `input`. */\n inputLength,\n /** Cached calculation results */\n handledCPCountPlusOne,\n baseMinusT,\n qMinusT;\n\n // Convert the input in UCS-2 to Unicode\n input = ucs2decode(input);\n\n // Cache the length\n inputLength = input.length;\n\n // Initialize the state\n n = initialN;\n delta = 0;\n bias = initialBias;\n\n // Handle the basic code points\n for (j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n handledCPCount = basicLength = output.length;\n\n // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n\n // Finish the basic string - if it is not empty - with a delimiter\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n for (m = maxInt, j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to ,\n // but guard against overflow\n handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n for (j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer\n for /* no condition */\n (q = delta, k = base;; k += base) {\n t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) {\n break;\n }\n qMinusT = q - t;\n baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));\n q = floor(qMinusT / baseMinusT);\n }\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n ++delta;\n ++n;\n }\n return output.join('');\n }\n\n /**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\n function toUnicode(input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n }\n\n /**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\n function toASCII(input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n }\n\n /*--------------------------------------------------------------------------*/\n\n /** Define the public API */\n punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n 'version': '1.3.2',\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see \n * @memberOf punycode\n * @type Object\n */\n 'ucs2': {\n 'decode': ucs2decode,\n 'encode': ucs2encode\n },\n 'decode': decode,\n 'encode': encode,\n 'toASCII': toASCII,\n 'toUnicode': toUnicode\n };\n\n /** Expose `punycode` */\n // Some AMD build optimizers, like r.js, check for specific condition patterns\n // like the following:\n if (freeExports && freeModule) {\n if (module.exports == freeExports) {\n // in Node.js or RingoJS v0.8.0+\n freeModule.exports = punycode;\n } else {\n // in Narwhal or RingoJS v0.7.0-\n for (key in punycode) {\n punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n }\n }\n } else {\n // in Rhino or a web browser\n root.punycode = punycode;\n }\n })(commonjsGlobal);\n});\nvar util = {\n isString: function isString(arg) {\n return typeof arg === 'string';\n },\n isObject: function isObject(arg) {\n return _typeof(arg) === 'object' && arg !== null;\n },\n isNull: function isNull(arg) {\n return arg === null;\n },\n isNullOrUndefined: function isNullOrUndefined(arg) {\n return arg == null;\n }\n};\n\n// Copyright Joyent, Inc. and other Node contributors.\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nvar decode = function decode(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n var regexp = /\\+/g;\n qs = qs.split(sep);\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr,\n vstr,\n k,\n v;\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (Array.isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n return obj;\n};\n\n// Copyright Joyent, Inc. and other Node contributors.\n\nvar stringifyPrimitive = function stringifyPrimitive(v) {\n switch (_typeof(v)) {\n case 'string':\n return v;\n case 'boolean':\n return v ? 'true' : 'false';\n case 'number':\n return isFinite(v) ? v : '';\n default:\n return '';\n }\n};\nvar encode = function encode(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n if (_typeof(obj) === 'object') {\n return Object.keys(obj).map(function (k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (Array.isArray(obj[k])) {\n return obj[k].map(function (v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n }\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));\n};\nvar querystring = createCommonjsModule(function (module, exports) {\n exports.decode = exports.parse = decode;\n exports.encode = exports.stringify = encode;\n});\nvar parse = urlParse;\nvar resolve = urlResolve;\nvar resolveObject = urlResolveObject;\nvar format$1 = urlFormat;\nvar Url_1 = Url;\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n var u = new Url();\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\nUrl.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + _typeof(url));\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) hostEnd = rest.length;\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1) continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\nUrl.prototype.format = function () {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n var search = this.search || query && '?' + query || '';\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n pathname = pathname.replace(/[?#]/g, function (match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n return protocol + host + pathname + search + hash;\n};\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\nUrl.prototype.resolve = function (relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\nUrl.prototype.resolveObject = function (relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol') result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n result.href = result.format();\n return result;\n }\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/',\n isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/',\n mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname,\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n if (isRelAbs) {\n // it's absolute.\n result.host = relative.host || relative.host === '' ? relative.host : result.host;\n result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === '';\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {\n srcPath.push('');\n }\n var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/';\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n mustEndAbs = mustEndAbs || result.host && srcPath.length;\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\nUrl.prototype.parseHost = function () {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\nvar url = {\n parse: parse,\n resolve: resolve,\n resolveObject: resolveObject,\n format: format$1,\n Url: Url_1\n};\nfunction getPropertyReference(propertyName) {\n for (var i = 0; i < v8.layout.length; i++) {\n for (var key in v8[v8.layout[i]]) {\n if (key === propertyName) return v8[v8.layout[i]][key];\n }\n }\n for (var _i = 0; _i < v8.paint.length; _i++) {\n for (var _key2 in v8[v8.paint[_i]]) {\n if (_key2 === propertyName) return v8[v8.paint[_i]][_key2];\n }\n }\n return null;\n}\nfunction eachSource(style, callback) {\n for (var k in style.sources) {\n callback(style.sources[k]);\n }\n}\nfunction eachLayer(style, callback) {\n var _iterator = _createForOfIteratorHelper(style.layers),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _layer = _step.value;\n callback(_layer);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n}\nfunction eachProperty(style, options, callback) {\n function inner(layer, propertyType) {\n var properties = layer[propertyType];\n if (!properties) return;\n Object.keys(properties).forEach(function (key) {\n callback({\n path: [layer.id, propertyType, key],\n key: key,\n value: properties[key],\n reference: getPropertyReference(key),\n set: function set(x) {\n properties[key] = x;\n }\n });\n });\n }\n eachLayer(style, function (layer) {\n if (options.paint) {\n inner(layer, 'paint');\n }\n if (options.layout) {\n inner(layer, 'layout');\n }\n });\n}\nfunction eachLayout(layer, callback) {\n for (var k in layer) {\n if (k.indexOf('layout') === 0) {\n callback(layer[k], k);\n }\n }\n}\nfunction eachPaint(layer, callback) {\n for (var k in layer) {\n if (k.indexOf('paint') === 0) {\n callback(layer[k], k);\n }\n }\n}\nfunction resolveConstant(style, value) {\n if (typeof value === 'string' && value[0] === '@') {\n return resolveConstant(style, style.constants[value]);\n } else {\n return value;\n }\n}\nfunction isFunction(value) {\n return Array.isArray(value.stops);\n}\nfunction renameProperty(obj, from, to) {\n obj[to] = obj[from];\n delete obj[from];\n}\nfunction migrateToV8(style) {\n style.version = 8;\n eachSource(style, function (source) {\n if (source.type === 'video' && source.url !== undefined) {\n renameProperty(source, 'url', 'urls');\n }\n if (source.type === 'video') {\n source.coordinates.forEach(function (coord) {\n return coord.reverse();\n });\n }\n });\n eachLayer(style, function (layer) {\n eachLayout(layer, function (layout) {\n if (layout['symbol-min-distance'] !== undefined) {\n renameProperty(layout, 'symbol-min-distance', 'symbol-spacing');\n }\n });\n eachPaint(layer, function (paint) {\n if (paint['background-image'] !== undefined) {\n renameProperty(paint, 'background-image', 'background-pattern');\n }\n if (paint['line-image'] !== undefined) {\n renameProperty(paint, 'line-image', 'line-pattern');\n }\n if (paint['fill-image'] !== undefined) {\n renameProperty(paint, 'fill-image', 'fill-pattern');\n }\n });\n });\n eachProperty(style, {\n paint: true,\n layout: true\n }, function (property) {\n var value = resolveConstant(style, property.value);\n if (isFunction(value)) {\n value.stops.forEach(function (stop) {\n stop[1] = resolveConstant(style, stop[1]);\n });\n }\n property.set(value);\n });\n delete style.constants;\n eachLayer(style, function (layer) {\n eachLayout(layer, function (layout) {\n delete layout['text-max-size'];\n delete layout['icon-max-size'];\n });\n eachPaint(layer, function (paint) {\n if (paint['text-size']) {\n if (!layer.layout) layer.layout = {};\n layer.layout['text-size'] = paint['text-size'];\n delete paint['text-size'];\n }\n if (paint['icon-size']) {\n if (!layer.layout) layer.layout = {};\n layer.layout['icon-size'] = paint['icon-size'];\n delete paint['icon-size'];\n }\n });\n });\n function migrateFontstackURL(input) {\n var inputParsed = url.parse(input);\n var inputPathnameParts = inputParsed.pathname.split('/');\n if (inputParsed.protocol !== 'mapbox:') {\n return input;\n } else if (inputParsed.hostname === 'fontstack') {\n return 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf';\n } else if (inputParsed.hostname === 'fonts') {\n return \"mapbox://fonts/\".concat(inputPathnameParts[2], \"/{fontstack}/{range}.pbf\");\n } else ;\n }\n if (style.glyphs) {\n style.glyphs = migrateFontstackURL(style.glyphs);\n }\n function migrateFontStack(font) {\n function splitAndTrim(string) {\n return string.split(',').map(function (s) {\n return s.trim();\n });\n }\n if (Array.isArray(font)) {\n return font;\n } else if (typeof font === 'string') {\n return splitAndTrim(font);\n } else if (_typeof(font) === 'object') {\n font.stops.forEach(function (stop) {\n stop[1] = splitAndTrim(stop[1]);\n });\n return font;\n } else {\n throw new Error('unexpected font value');\n }\n }\n eachLayer(style, function (layer) {\n eachLayout(layer, function (layout) {\n if (layout['text-font']) {\n layout['text-font'] = migrateFontStack(layout['text-font']);\n }\n });\n });\n var firstSymbolLayer = 0;\n for (var i = style.layers.length - 1; i >= 0; i--) {\n var _layer2 = style.layers[i];\n if (_layer2.type !== 'symbol') {\n firstSymbolLayer = i + 1;\n break;\n }\n }\n var symbolLayers = style.layers.splice(firstSymbolLayer);\n symbolLayers.reverse();\n style.layers = style.layers.concat(symbolLayers);\n return style;\n}\nfunction extend(output) {\n for (var _len = arguments.length, inputs = new Array(_len > 1 ? _len - 1 : 0), _key3 = 1; _key3 < _len; _key3++) {\n inputs[_key3 - 1] = arguments[_key3];\n }\n for (var _i2 = 0, _inputs = inputs; _i2 < _inputs.length; _i2++) {\n var input = _inputs[_i2];\n for (var k in input) {\n output[k] = input[k];\n }\n }\n return output;\n}\nvar ParsingError = /*#__PURE__*/function (_Error) {\n function ParsingError(key, message) {\n var _this;\n _classCallCheck(this, ParsingError);\n _this = _callSuper(this, ParsingError, [message]);\n _this.message = message;\n _this.key = key;\n return _this;\n }\n _inherits(ParsingError, _Error);\n return _createClass(ParsingError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nvar Scope = /*#__PURE__*/function () {\n function Scope(parent) {\n var bindings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n _classCallCheck(this, Scope);\n this.parent = parent;\n this.bindings = {};\n var _iterator2 = _createForOfIteratorHelper(bindings),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _step2$value = _slicedToArray(_step2.value, 2),\n name = _step2$value[0],\n _expression = _step2$value[1];\n this.bindings[name] = _expression;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n return _createClass(Scope, [{\n key: \"concat\",\n value: function concat(bindings) {\n return new Scope(this, bindings);\n }\n }, {\n key: \"get\",\n value: function get(name) {\n if (this.bindings[name]) {\n return this.bindings[name];\n }\n if (this.parent) {\n return this.parent.get(name);\n }\n throw new Error(\"\".concat(name, \" not found in scope.\"));\n }\n }, {\n key: \"has\",\n value: function has(name) {\n if (this.bindings[name]) return true;\n return this.parent ? this.parent.has(name) : false;\n }\n }]);\n}();\nvar NullType = {\n kind: 'null'\n};\nvar NumberType = {\n kind: 'number'\n};\nvar StringType = {\n kind: 'string'\n};\nvar BooleanType = {\n kind: 'boolean'\n};\nvar ColorType = {\n kind: 'color'\n};\nvar ObjectType = {\n kind: 'object'\n};\nvar ValueType = {\n kind: 'value'\n};\nvar ErrorType = {\n kind: 'error'\n};\nvar CollatorType = {\n kind: 'collator'\n};\nvar FormattedType = {\n kind: 'formatted'\n};\nvar ResolvedImageType = {\n kind: 'resolvedImage'\n};\nfunction array(itemType, N) {\n return {\n kind: 'array',\n itemType: itemType,\n N: N\n };\n}\nfunction toString(type) {\n if (type.kind === 'array') {\n var itemType = toString(type.itemType);\n return typeof type.N === 'number' ? \"array<\".concat(itemType, \", \").concat(type.N, \">\") : type.itemType.kind === 'value' ? 'array' : \"array<\".concat(itemType, \">\");\n } else {\n return type.kind;\n }\n}\nvar valueMemberTypes = [NullType, NumberType, StringType, BooleanType, ColorType, FormattedType, ObjectType, array(ValueType), ResolvedImageType];\nfunction _checkSubtype(expected, t) {\n if (t.kind === 'error') {\n return null;\n } else if (expected.kind === 'array') {\n if (t.kind === 'array' && (t.N === 0 && t.itemType.kind === 'value' || !_checkSubtype(expected.itemType, t.itemType)) && (typeof expected.N !== 'number' || expected.N === t.N)) {\n return null;\n }\n } else if (expected.kind === t.kind) {\n return null;\n } else if (expected.kind === 'value') {\n for (var _i3 = 0, _valueMemberTypes = valueMemberTypes; _i3 < _valueMemberTypes.length; _i3++) {\n var memberType = _valueMemberTypes[_i3];\n if (!_checkSubtype(memberType, t)) {\n return null;\n }\n }\n }\n return \"Expected \".concat(toString(expected), \" but found \").concat(toString(t), \" instead.\");\n}\nfunction isValidType(provided, allowedTypes) {\n return allowedTypes.some(function (t) {\n return t.kind === provided.kind;\n });\n}\nfunction isValidNativeType(provided, allowedTypes) {\n return allowedTypes.some(function (t) {\n if (t === 'null') {\n return provided === null;\n } else if (t === 'array') {\n return Array.isArray(provided);\n } else if (t === 'object') {\n return provided && !Array.isArray(provided) && _typeof(provided) === 'object';\n } else {\n return t === _typeof(provided);\n }\n });\n}\nvar csscolorparser = createCommonjsModule(function (module, exports) {\n // (c) Dean McNamee , 2012.\n //\n // https://github.com/deanm/css-color-parser-js\n //\n // Permission is hereby granted, free of charge, to any person obtaining a copy\n // of this software and associated documentation files (the \"Software\"), to\n // deal in the Software without restriction, including without limitation the\n // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n // sell copies of the Software, and to permit persons to whom the Software is\n // furnished to do so, subject to the following conditions:\n //\n // The above copyright notice and this permission notice shall be included in\n // all copies or substantial portions of the Software.\n //\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n // IN THE SOFTWARE.\n\n // http://www.w3.org/TR/css3-color/\n var kCSSColorTable = {\n \"transparent\": [0, 0, 0, 0],\n \"aliceblue\": [240, 248, 255, 1],\n \"antiquewhite\": [250, 235, 215, 1],\n \"aqua\": [0, 255, 255, 1],\n \"aquamarine\": [127, 255, 212, 1],\n \"azure\": [240, 255, 255, 1],\n \"beige\": [245, 245, 220, 1],\n \"bisque\": [255, 228, 196, 1],\n \"black\": [0, 0, 0, 1],\n \"blanchedalmond\": [255, 235, 205, 1],\n \"blue\": [0, 0, 255, 1],\n \"blueviolet\": [138, 43, 226, 1],\n \"brown\": [165, 42, 42, 1],\n \"burlywood\": [222, 184, 135, 1],\n \"cadetblue\": [95, 158, 160, 1],\n \"chartreuse\": [127, 255, 0, 1],\n \"chocolate\": [210, 105, 30, 1],\n \"coral\": [255, 127, 80, 1],\n \"cornflowerblue\": [100, 149, 237, 1],\n \"cornsilk\": [255, 248, 220, 1],\n \"crimson\": [220, 20, 60, 1],\n \"cyan\": [0, 255, 255, 1],\n \"darkblue\": [0, 0, 139, 1],\n \"darkcyan\": [0, 139, 139, 1],\n \"darkgoldenrod\": [184, 134, 11, 1],\n \"darkgray\": [169, 169, 169, 1],\n \"darkgreen\": [0, 100, 0, 1],\n \"darkgrey\": [169, 169, 169, 1],\n \"darkkhaki\": [189, 183, 107, 1],\n \"darkmagenta\": [139, 0, 139, 1],\n \"darkolivegreen\": [85, 107, 47, 1],\n \"darkorange\": [255, 140, 0, 1],\n \"darkorchid\": [153, 50, 204, 1],\n \"darkred\": [139, 0, 0, 1],\n \"darksalmon\": [233, 150, 122, 1],\n \"darkseagreen\": [143, 188, 143, 1],\n \"darkslateblue\": [72, 61, 139, 1],\n \"darkslategray\": [47, 79, 79, 1],\n \"darkslategrey\": [47, 79, 79, 1],\n \"darkturquoise\": [0, 206, 209, 1],\n \"darkviolet\": [148, 0, 211, 1],\n \"deeppink\": [255, 20, 147, 1],\n \"deepskyblue\": [0, 191, 255, 1],\n \"dimgray\": [105, 105, 105, 1],\n \"dimgrey\": [105, 105, 105, 1],\n \"dodgerblue\": [30, 144, 255, 1],\n \"firebrick\": [178, 34, 34, 1],\n \"floralwhite\": [255, 250, 240, 1],\n \"forestgreen\": [34, 139, 34, 1],\n \"fuchsia\": [255, 0, 255, 1],\n \"gainsboro\": [220, 220, 220, 1],\n \"ghostwhite\": [248, 248, 255, 1],\n \"gold\": [255, 215, 0, 1],\n \"goldenrod\": [218, 165, 32, 1],\n \"gray\": [128, 128, 128, 1],\n \"green\": [0, 128, 0, 1],\n \"greenyellow\": [173, 255, 47, 1],\n \"grey\": [128, 128, 128, 1],\n \"honeydew\": [240, 255, 240, 1],\n \"hotpink\": [255, 105, 180, 1],\n \"indianred\": [205, 92, 92, 1],\n \"indigo\": [75, 0, 130, 1],\n \"ivory\": [255, 255, 240, 1],\n \"khaki\": [240, 230, 140, 1],\n \"lavender\": [230, 230, 250, 1],\n \"lavenderblush\": [255, 240, 245, 1],\n \"lawngreen\": [124, 252, 0, 1],\n \"lemonchiffon\": [255, 250, 205, 1],\n \"lightblue\": [173, 216, 230, 1],\n \"lightcoral\": [240, 128, 128, 1],\n \"lightcyan\": [224, 255, 255, 1],\n \"lightgoldenrodyellow\": [250, 250, 210, 1],\n \"lightgray\": [211, 211, 211, 1],\n \"lightgreen\": [144, 238, 144, 1],\n \"lightgrey\": [211, 211, 211, 1],\n \"lightpink\": [255, 182, 193, 1],\n \"lightsalmon\": [255, 160, 122, 1],\n \"lightseagreen\": [32, 178, 170, 1],\n \"lightskyblue\": [135, 206, 250, 1],\n \"lightslategray\": [119, 136, 153, 1],\n \"lightslategrey\": [119, 136, 153, 1],\n \"lightsteelblue\": [176, 196, 222, 1],\n \"lightyellow\": [255, 255, 224, 1],\n \"lime\": [0, 255, 0, 1],\n \"limegreen\": [50, 205, 50, 1],\n \"linen\": [250, 240, 230, 1],\n \"magenta\": [255, 0, 255, 1],\n \"maroon\": [128, 0, 0, 1],\n \"mediumaquamarine\": [102, 205, 170, 1],\n \"mediumblue\": [0, 0, 205, 1],\n \"mediumorchid\": [186, 85, 211, 1],\n \"mediumpurple\": [147, 112, 219, 1],\n \"mediumseagreen\": [60, 179, 113, 1],\n \"mediumslateblue\": [123, 104, 238, 1],\n \"mediumspringgreen\": [0, 250, 154, 1],\n \"mediumturquoise\": [72, 209, 204, 1],\n \"mediumvioletred\": [199, 21, 133, 1],\n \"midnightblue\": [25, 25, 112, 1],\n \"mintcream\": [245, 255, 250, 1],\n \"mistyrose\": [255, 228, 225, 1],\n \"moccasin\": [255, 228, 181, 1],\n \"navajowhite\": [255, 222, 173, 1],\n \"navy\": [0, 0, 128, 1],\n \"oldlace\": [253, 245, 230, 1],\n \"olive\": [128, 128, 0, 1],\n \"olivedrab\": [107, 142, 35, 1],\n \"orange\": [255, 165, 0, 1],\n \"orangered\": [255, 69, 0, 1],\n \"orchid\": [218, 112, 214, 1],\n \"palegoldenrod\": [238, 232, 170, 1],\n \"palegreen\": [152, 251, 152, 1],\n \"paleturquoise\": [175, 238, 238, 1],\n \"palevioletred\": [219, 112, 147, 1],\n \"papayawhip\": [255, 239, 213, 1],\n \"peachpuff\": [255, 218, 185, 1],\n \"peru\": [205, 133, 63, 1],\n \"pink\": [255, 192, 203, 1],\n \"plum\": [221, 160, 221, 1],\n \"powderblue\": [176, 224, 230, 1],\n \"purple\": [128, 0, 128, 1],\n \"rebeccapurple\": [102, 51, 153, 1],\n \"red\": [255, 0, 0, 1],\n \"rosybrown\": [188, 143, 143, 1],\n \"royalblue\": [65, 105, 225, 1],\n \"saddlebrown\": [139, 69, 19, 1],\n \"salmon\": [250, 128, 114, 1],\n \"sandybrown\": [244, 164, 96, 1],\n \"seagreen\": [46, 139, 87, 1],\n \"seashell\": [255, 245, 238, 1],\n \"sienna\": [160, 82, 45, 1],\n \"silver\": [192, 192, 192, 1],\n \"skyblue\": [135, 206, 235, 1],\n \"slateblue\": [106, 90, 205, 1],\n \"slategray\": [112, 128, 144, 1],\n \"slategrey\": [112, 128, 144, 1],\n \"snow\": [255, 250, 250, 1],\n \"springgreen\": [0, 255, 127, 1],\n \"steelblue\": [70, 130, 180, 1],\n \"tan\": [210, 180, 140, 1],\n \"teal\": [0, 128, 128, 1],\n \"thistle\": [216, 191, 216, 1],\n \"tomato\": [255, 99, 71, 1],\n \"turquoise\": [64, 224, 208, 1],\n \"violet\": [238, 130, 238, 1],\n \"wheat\": [245, 222, 179, 1],\n \"white\": [255, 255, 255, 1],\n \"whitesmoke\": [245, 245, 245, 1],\n \"yellow\": [255, 255, 0, 1],\n \"yellowgreen\": [154, 205, 50, 1]\n };\n function clamp_css_byte(i) {\n // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n }\n function clamp_css_float(f) {\n // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n }\n function parse_css_int(str) {\n // int or percentage.\n if (str[str.length - 1] === '%') return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n }\n function parse_css_float(str) {\n // float or percentage.\n if (str[str.length - 1] === '%') return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n }\n function css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;else if (h > 1) h -= 1;\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n return m1;\n }\n function parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [(iv & 0xf00) >> 4 | (iv & 0xf00) >> 8, iv & 0xf0 | (iv & 0xf0) >> 4, iv & 0xf | (iv & 0xf) << 4, 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1];\n }\n return null;\n }\n var op = str.indexOf('('),\n ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op + 1, ep - (op + 1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]), parse_css_int(params[1]), parse_css_int(params[2]), alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (parseFloat(params[0]) % 360 + 360) % 360 / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h + 1 / 3) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h - 1 / 3) * 255), alpha];\n default:\n return null;\n }\n }\n return null;\n }\n try {\n exports.parseCSSColor = parseCSSColor;\n } catch (e) {}\n});\nvar Color = /*#__PURE__*/function () {\n function Color(r, g, b) {\n var a = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n _classCallCheck(this, Color);\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n }\n return _createClass(Color, [{\n key: \"toString\",\n value: function toString() {\n var _this$toArray = this.toArray(),\n _this$toArray2 = _slicedToArray(_this$toArray, 4),\n r = _this$toArray2[0],\n g = _this$toArray2[1],\n b = _this$toArray2[2],\n a = _this$toArray2[3];\n return \"rgba(\".concat(Math.round(r), \",\").concat(Math.round(g), \",\").concat(Math.round(b), \",\").concat(a, \")\");\n }\n }, {\n key: \"toArray\",\n value: function toArray() {\n var r = this.r,\n g = this.g,\n b = this.b,\n a = this.a;\n return a === 0 ? [0, 0, 0, 0] : [r * 255 / a, g * 255 / a, b * 255 / a, a];\n }\n }], [{\n key: \"parse\",\n value: function parse(input) {\n if (!input) {\n return undefined;\n }\n if (input instanceof Color) {\n return input;\n }\n if (typeof input !== 'string') {\n return undefined;\n }\n var rgba = csscolorparser.parseCSSColor(input);\n if (!rgba) {\n return undefined;\n }\n return new Color(rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3]);\n }\n }]);\n}();\nColor.black = new Color(0, 0, 0, 1);\nColor.white = new Color(1, 1, 1, 1);\nColor.transparent = new Color(0, 0, 0, 0);\nColor.red = new Color(1, 0, 0, 1);\nColor.blue = new Color(0, 0, 1, 1);\nvar Collator = /*#__PURE__*/function () {\n function Collator(caseSensitive, diacriticSensitive, locale) {\n _classCallCheck(this, Collator);\n if (caseSensitive) this.sensitivity = diacriticSensitive ? 'variant' : 'case';else this.sensitivity = diacriticSensitive ? 'accent' : 'base';\n this.locale = locale;\n this.collator = new Intl.Collator(this.locale ? this.locale : [], {\n sensitivity: this.sensitivity,\n usage: 'search'\n });\n }\n return _createClass(Collator, [{\n key: \"compare\",\n value: function compare(lhs, rhs) {\n return this.collator.compare(lhs, rhs);\n }\n }, {\n key: \"resolvedLocale\",\n value: function resolvedLocale() {\n return new Intl.Collator(this.locale ? this.locale : []).resolvedOptions().locale;\n }\n }]);\n}();\nvar FormattedSection = /*#__PURE__*/_createClass(function FormattedSection(text, image, scale, fontStack, textColor) {\n _classCallCheck(this, FormattedSection);\n this.text = text;\n this.image = image;\n this.scale = scale;\n this.fontStack = fontStack;\n this.textColor = textColor;\n});\nvar Formatted = /*#__PURE__*/function () {\n function Formatted(sections) {\n _classCallCheck(this, Formatted);\n this.sections = sections;\n }\n return _createClass(Formatted, [{\n key: \"isEmpty\",\n value: function isEmpty() {\n if (this.sections.length === 0) return true;\n return !this.sections.some(function (section) {\n return section.text.length !== 0 || section.image && section.image.name.length !== 0;\n });\n }\n }, {\n key: \"toString\",\n value: function toString() {\n if (this.sections.length === 0) return '';\n return this.sections.map(function (section) {\n return section.text;\n }).join('');\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['format'];\n var _iterator3 = _createForOfIteratorHelper(this.sections),\n _step3;\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var section = _step3.value;\n if (section.image) {\n serialized.push(['image', section.image.name]);\n continue;\n }\n serialized.push(section.text);\n var options = {};\n if (section.fontStack) {\n options['text-font'] = ['literal', section.fontStack.split(',')];\n }\n if (section.scale) {\n options['font-scale'] = section.scale;\n }\n if (section.textColor) {\n options['text-color'] = ['rgba'].concat(section.textColor.toArray());\n }\n serialized.push(options);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n return serialized;\n }\n }], [{\n key: \"fromString\",\n value: function fromString(unformatted) {\n return new Formatted([new FormattedSection(unformatted, null, null, null, null)]);\n }\n }, {\n key: \"factory\",\n value: function factory(text) {\n if (text instanceof Formatted) {\n return text;\n } else {\n return Formatted.fromString(text);\n }\n }\n }]);\n}();\nvar ResolvedImage = /*#__PURE__*/function () {\n function ResolvedImage(options) {\n _classCallCheck(this, ResolvedImage);\n this.name = options.name;\n this.available = options.available;\n }\n return _createClass(ResolvedImage, [{\n key: \"toString\",\n value: function toString() {\n return this.name;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['image', this.name];\n }\n }], [{\n key: \"fromString\",\n value: function fromString(name) {\n if (!name) return null;\n return new ResolvedImage({\n name: name,\n available: false\n });\n }\n }]);\n}();\nfunction validateRGBA(r, g, b, a) {\n if (!(typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255)) {\n var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b];\n return \"Invalid rgba value [\".concat(value.join(', '), \"]: 'r', 'g', and 'b' must be between 0 and 255.\");\n }\n if (!(typeof a === 'undefined' || typeof a === 'number' && a >= 0 && a <= 1)) {\n return \"Invalid rgba value [\".concat([r, g, b, a].join(', '), \"]: 'a' must be between 0 and 1.\");\n }\n return null;\n}\nfunction isValue(mixed) {\n if (mixed === null) {\n return true;\n } else if (typeof mixed === 'string') {\n return true;\n } else if (typeof mixed === 'boolean') {\n return true;\n } else if (typeof mixed === 'number') {\n return true;\n } else if (mixed instanceof Color) {\n return true;\n } else if (mixed instanceof Collator) {\n return true;\n } else if (mixed instanceof Formatted) {\n return true;\n } else if (mixed instanceof ResolvedImage) {\n return true;\n } else if (Array.isArray(mixed)) {\n var _iterator4 = _createForOfIteratorHelper(mixed),\n _step4;\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var item = _step4.value;\n if (!isValue(item)) {\n return false;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n return true;\n } else if (_typeof(mixed) === 'object') {\n for (var key in mixed) {\n if (!isValue(mixed[key])) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n}\nfunction typeOf(value) {\n if (value === null) {\n return NullType;\n } else if (typeof value === 'string') {\n return StringType;\n } else if (typeof value === 'boolean') {\n return BooleanType;\n } else if (typeof value === 'number') {\n return NumberType;\n } else if (value instanceof Color) {\n return ColorType;\n } else if (value instanceof Collator) {\n return CollatorType;\n } else if (value instanceof Formatted) {\n return FormattedType;\n } else if (value instanceof ResolvedImage) {\n return ResolvedImageType;\n } else if (Array.isArray(value)) {\n var length = value.length;\n var itemType;\n var _iterator5 = _createForOfIteratorHelper(value),\n _step5;\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var item = _step5.value;\n var t = typeOf(item);\n if (!itemType) {\n itemType = t;\n } else if (itemType === t) {\n continue;\n } else {\n itemType = ValueType;\n break;\n }\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n return array(itemType || ValueType, length);\n } else {\n return ObjectType;\n }\n}\nfunction toString$1(value) {\n var type = _typeof(value);\n if (value === null) {\n return '';\n } else if (type === 'string' || type === 'number' || type === 'boolean') {\n return String(value);\n } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) {\n return value.toString();\n } else {\n return JSON.stringify(value);\n }\n}\nvar Literal = /*#__PURE__*/function () {\n function Literal(type, value) {\n _classCallCheck(this, Literal);\n this.type = type;\n this.value = value;\n }\n return _createClass(Literal, [{\n key: \"evaluate\",\n value: function evaluate() {\n return this.value;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild() {}\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.type.kind === 'array' || this.type.kind === 'object') {\n return ['literal', this.value];\n } else if (this.value instanceof Color) {\n return ['rgba'].concat(this.value.toArray());\n } else if (this.value instanceof Formatted) {\n return this.value.serialize();\n } else {\n return this.value;\n }\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"'literal' expression requires exactly one argument, but found \".concat(args.length - 1, \" instead.\"));\n if (!isValue(args[1])) return context.error(\"invalid value\");\n var value = args[1];\n var type = typeOf(value);\n var expected = context.expectedType;\n if (type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0)) {\n type = expected;\n }\n return new Literal(type, value);\n }\n }]);\n}();\nvar RuntimeError = /*#__PURE__*/function () {\n function RuntimeError(message) {\n _classCallCheck(this, RuntimeError);\n this.name = 'ExpressionEvaluationError';\n this.message = message;\n }\n return _createClass(RuntimeError, [{\n key: \"toJSON\",\n value: function toJSON() {\n return this.message;\n }\n }]);\n}();\nvar types = {\n string: StringType,\n number: NumberType,\n \"boolean\": BooleanType,\n object: ObjectType\n};\nvar Assertion = /*#__PURE__*/function () {\n function Assertion(type, args) {\n _classCallCheck(this, Assertion);\n this.type = type;\n this.args = args;\n }\n return _createClass(Assertion, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n for (var i = 0; i < this.args.length; i++) {\n var value = this.args[i].evaluate(ctx);\n var _error = _checkSubtype(this.type, typeOf(value));\n if (!_error) {\n return value;\n } else if (i === this.args.length - 1) {\n throw new RuntimeError(\"Expected value to be of type \".concat(toString(this.type), \", but found \").concat(toString(typeOf(value)), \" instead.\"));\n }\n }\n return null;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.args.every(function (arg) {\n return arg.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var type = this.type;\n var serialized = [type.kind];\n if (type.kind === 'array') {\n var itemType = type.itemType;\n if (itemType.kind === 'string' || itemType.kind === 'number' || itemType.kind === 'boolean') {\n serialized.push(itemType.kind);\n var N = type.N;\n if (typeof N === 'number' || this.args.length > 1) {\n serialized.push(N);\n }\n }\n }\n return serialized.concat(this.args.map(function (arg) {\n return arg.serialize();\n }));\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) return context.error(\"Expected at least one argument.\");\n var i = 1;\n var type;\n var name = args[0];\n if (name === 'array') {\n var itemType;\n if (args.length > 2) {\n var _type = args[1];\n if (typeof _type !== 'string' || !(_type in types) || _type === 'object') return context.error('The item type argument of \"array\" must be one of string, number, boolean', 1);\n itemType = types[_type];\n i++;\n } else {\n itemType = ValueType;\n }\n var N;\n if (args.length > 3) {\n if (args[2] !== null && (typeof args[2] !== 'number' || args[2] < 0 || args[2] !== Math.floor(args[2]))) {\n return context.error('The length argument to \"array\" must be a positive integer literal', 2);\n }\n N = args[2];\n i++;\n }\n type = array(itemType, N);\n } else {\n type = types[name];\n }\n var parsed = [];\n for (; i < args.length; i++) {\n var input = context.parse(args[i], i, ValueType);\n if (!input) return null;\n parsed.push(input);\n }\n return new Assertion(type, parsed);\n }\n }]);\n}();\nvar FormatExpression = /*#__PURE__*/function () {\n function FormatExpression(sections) {\n _classCallCheck(this, FormatExpression);\n this.type = FormattedType;\n this.sections = sections;\n }\n return _createClass(FormatExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var evaluateSection = function evaluateSection(section) {\n var evaluatedContent = section.content.evaluate(ctx);\n if (typeOf(evaluatedContent) === ResolvedImageType) {\n return new FormattedSection('', evaluatedContent, null, null, null);\n }\n return new FormattedSection(toString$1(evaluatedContent), null, section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null);\n };\n return new Formatted(this.sections.map(evaluateSection));\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n var _iterator6 = _createForOfIteratorHelper(this.sections),\n _step6;\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var section = _step6.value;\n fn(section.content);\n if (section.scale) {\n fn(section.scale);\n }\n if (section.font) {\n fn(section.font);\n }\n if (section.textColor) {\n fn(section.textColor);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['format'];\n var _iterator7 = _createForOfIteratorHelper(this.sections),\n _step7;\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var section = _step7.value;\n serialized.push(section.content.serialize());\n var options = {};\n if (section.scale) {\n options['font-scale'] = section.scale.serialize();\n }\n if (section.font) {\n options['text-font'] = section.font.serialize();\n }\n if (section.textColor) {\n options['text-color'] = section.textColor.serialize();\n }\n serialized.push(options);\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) {\n return context.error(\"Expected at least one argument.\");\n }\n var firstArg = args[1];\n if (!Array.isArray(firstArg) && _typeof(firstArg) === 'object') {\n return context.error(\"First argument must be an image or text section.\");\n }\n var sections = [];\n var nextTokenMayBeObject = false;\n for (var i = 1; i <= args.length - 1; ++i) {\n var arg = args[i];\n if (nextTokenMayBeObject && _typeof(arg) === 'object' && !Array.isArray(arg)) {\n nextTokenMayBeObject = false;\n var scale = null;\n if (arg['font-scale']) {\n scale = context.parse(arg['font-scale'], 1, NumberType);\n if (!scale) return null;\n }\n var font = null;\n if (arg['text-font']) {\n font = context.parse(arg['text-font'], 1, array(StringType));\n if (!font) return null;\n }\n var textColor = null;\n if (arg['text-color']) {\n textColor = context.parse(arg['text-color'], 1, ColorType);\n if (!textColor) return null;\n }\n var lastExpression = sections[sections.length - 1];\n lastExpression.scale = scale;\n lastExpression.font = font;\n lastExpression.textColor = textColor;\n } else {\n var content = context.parse(args[i], 1, ValueType);\n if (!content) return null;\n var kind = content.type.kind;\n if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') return context.error(\"Formatted text type must be 'string', 'value', 'image' or 'null'.\");\n nextTokenMayBeObject = true;\n sections.push({\n content: content,\n scale: null,\n font: null,\n textColor: null\n });\n }\n }\n return new FormatExpression(sections);\n }\n }]);\n}();\nvar ImageExpression = /*#__PURE__*/function () {\n function ImageExpression(input) {\n _classCallCheck(this, ImageExpression);\n this.type = ResolvedImageType;\n this.input = input;\n }\n return _createClass(ImageExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var evaluatedImageName = this.input.evaluate(ctx);\n var value = ResolvedImage.fromString(evaluatedImageName);\n if (value && ctx.availableImages) value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1;\n return value;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['image', this.input.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) {\n return context.error(\"Expected two arguments.\");\n }\n var name = context.parse(args[1], 1, StringType);\n if (!name) return context.error(\"No image name provided.\");\n return new ImageExpression(name);\n }\n }]);\n}();\nvar types$1 = {\n 'to-boolean': BooleanType,\n 'to-color': ColorType,\n 'to-number': NumberType,\n 'to-string': StringType\n};\nvar Coercion = /*#__PURE__*/function () {\n function Coercion(type, args) {\n _classCallCheck(this, Coercion);\n this.type = type;\n this.args = args;\n }\n return _createClass(Coercion, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n if (this.type.kind === 'boolean') {\n return Boolean(this.args[0].evaluate(ctx));\n } else if (this.type.kind === 'color') {\n var input;\n var _error2;\n var _iterator8 = _createForOfIteratorHelper(this.args),\n _step8;\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n var arg = _step8.value;\n input = arg.evaluate(ctx);\n _error2 = null;\n if (input instanceof Color) {\n return input;\n } else if (typeof input === 'string') {\n var c = ctx.parseColor(input);\n if (c) return c;\n } else if (Array.isArray(input)) {\n if (input.length < 3 || input.length > 4) {\n _error2 = \"Invalid rbga value \".concat(JSON.stringify(input), \": expected an array containing either three or four numeric values.\");\n } else {\n _error2 = validateRGBA(input[0], input[1], input[2], input[3]);\n }\n if (!_error2) {\n return new Color(input[0] / 255, input[1] / 255, input[2] / 255, input[3]);\n }\n }\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n throw new RuntimeError(_error2 || \"Could not parse color from value '\".concat(typeof input === 'string' ? input : String(JSON.stringify(input)), \"'\"));\n } else if (this.type.kind === 'number') {\n var value = null;\n var _iterator9 = _createForOfIteratorHelper(this.args),\n _step9;\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n var _arg = _step9.value;\n value = _arg.evaluate(ctx);\n if (value === null) return 0;\n var num = Number(value);\n if (isNaN(num)) continue;\n return num;\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n throw new RuntimeError(\"Could not convert \".concat(JSON.stringify(value), \" to number.\"));\n } else if (this.type.kind === 'formatted') {\n return Formatted.fromString(toString$1(this.args[0].evaluate(ctx)));\n } else if (this.type.kind === 'resolvedImage') {\n return ResolvedImage.fromString(toString$1(this.args[0].evaluate(ctx)));\n } else {\n return toString$1(this.args[0].evaluate(ctx));\n }\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.args.every(function (arg) {\n return arg.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.type.kind === 'formatted') {\n return new FormatExpression([{\n content: this.args[0],\n scale: null,\n font: null,\n textColor: null\n }]).serialize();\n }\n if (this.type.kind === 'resolvedImage') {\n return new ImageExpression(this.args[0]).serialize();\n }\n var serialized = [\"to-\".concat(this.type.kind)];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) return context.error(\"Expected at least one argument.\");\n var name = args[0];\n if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) return context.error(\"Expected one argument.\");\n var type = types$1[name];\n var parsed = [];\n for (var i = 1; i < args.length; i++) {\n var input = context.parse(args[i], i, ValueType);\n if (!input) return null;\n parsed.push(input);\n }\n return new Coercion(type, parsed);\n }\n }]);\n}();\nvar geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];\nvar EvaluationContext = /*#__PURE__*/function () {\n function EvaluationContext() {\n _classCallCheck(this, EvaluationContext);\n this.globals = null;\n this.feature = null;\n this.featureState = null;\n this.formattedSection = null;\n this._parseColorCache = {};\n this.availableImages = null;\n this.canonical = null;\n }\n return _createClass(EvaluationContext, [{\n key: \"id\",\n value: function id() {\n return this.feature && 'id' in this.feature ? this.feature.id : null;\n }\n }, {\n key: \"geometryType\",\n value: function geometryType() {\n return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null;\n }\n }, {\n key: \"geometry\",\n value: function geometry() {\n return this.feature && 'geometry' in this.feature ? this.feature.geometry : null;\n }\n }, {\n key: \"canonicalID\",\n value: function canonicalID() {\n return this.canonical;\n }\n }, {\n key: \"properties\",\n value: function properties() {\n return this.feature && this.feature.properties || {};\n }\n }, {\n key: \"parseColor\",\n value: function parseColor(input) {\n var cached = this._parseColorCache[input];\n if (!cached) {\n cached = this._parseColorCache[input] = Color.parse(input);\n }\n return cached;\n }\n }]);\n}();\nvar CompoundExpression = /*#__PURE__*/function () {\n function CompoundExpression(name, type, evaluate, args) {\n _classCallCheck(this, CompoundExpression);\n this.name = name;\n this.type = type;\n this._evaluate = evaluate;\n this.args = args;\n }\n return _createClass(CompoundExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return this._evaluate(ctx, this.args);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return [this.name].concat(this.args.map(function (arg) {\n return arg.serialize();\n }));\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n var op = args[0];\n var definition = CompoundExpression.definitions[op];\n if (!definition) {\n return context.error(\"Unknown expression \\\"\".concat(op, \"\\\". If you wanted a literal array, use [\\\"literal\\\", [...]].\"), 0);\n }\n var type = Array.isArray(definition) ? definition[0] : definition.type;\n var availableOverloads = Array.isArray(definition) ? [[definition[1], definition[2]]] : definition.overloads;\n var overloads = availableOverloads.filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 1),\n signature = _ref2[0];\n return !Array.isArray(signature) || signature.length === args.length - 1;\n });\n var signatureContext = null;\n var _iterator10 = _createForOfIteratorHelper(overloads),\n _step10;\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n var _step10$value = _slicedToArray(_step10.value, 2),\n params = _step10$value[0],\n evaluate = _step10$value[1];\n signatureContext = new ParsingContext(context.registry, context.path, null, context.scope);\n var parsedArgs = [];\n var argParseFailed = false;\n for (var _i4 = 1; _i4 < args.length; _i4++) {\n var arg = args[_i4];\n var expectedType = Array.isArray(params) ? params[_i4 - 1] : params.type;\n var _parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType);\n if (!_parsed) {\n argParseFailed = true;\n break;\n }\n parsedArgs.push(_parsed);\n }\n if (argParseFailed) {\n continue;\n }\n if (Array.isArray(params)) {\n if (params.length !== parsedArgs.length) {\n signatureContext.error(\"Expected \".concat(params.length, \" arguments, but found \").concat(parsedArgs.length, \" instead.\"));\n continue;\n }\n }\n for (var _i5 = 0; _i5 < parsedArgs.length; _i5++) {\n var _expected = Array.isArray(params) ? params[_i5] : params.type;\n var _arg2 = parsedArgs[_i5];\n signatureContext.concat(_i5 + 1).checkSubtype(_expected, _arg2.type);\n }\n if (signatureContext.errors.length === 0) {\n return new CompoundExpression(op, type, evaluate, parsedArgs);\n }\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n if (overloads.length === 1) {\n var _context$errors;\n (_context$errors = context.errors).push.apply(_context$errors, _toConsumableArray(signatureContext.errors));\n } else {\n var expected = overloads.length ? overloads : availableOverloads;\n var signatures = expected.map(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 1),\n params = _ref4[0];\n return stringifySignature(params);\n }).join(' | ');\n var actualTypes = [];\n for (var i = 1; i < args.length; i++) {\n var parsed = context.parse(args[i], 1 + actualTypes.length);\n if (!parsed) return null;\n actualTypes.push(toString(parsed.type));\n }\n context.error(\"Expected arguments of type \".concat(signatures, \", but found (\").concat(actualTypes.join(', '), \") instead.\"));\n }\n return null;\n }\n }, {\n key: \"register\",\n value: function register(registry, definitions) {\n CompoundExpression.definitions = definitions;\n for (var name in definitions) {\n registry[name] = CompoundExpression;\n }\n }\n }]);\n}();\nfunction stringifySignature(signature) {\n if (Array.isArray(signature)) {\n return \"(\".concat(signature.map(toString).join(', '), \")\");\n } else {\n return \"(\".concat(toString(signature.type), \"...)\");\n }\n}\nvar CollatorExpression = /*#__PURE__*/function () {\n function CollatorExpression(caseSensitive, diacriticSensitive, locale) {\n _classCallCheck(this, CollatorExpression);\n this.type = CollatorType;\n this.locale = locale;\n this.caseSensitive = caseSensitive;\n this.diacriticSensitive = diacriticSensitive;\n }\n return _createClass(CollatorExpression, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.caseSensitive);\n fn(this.diacriticSensitive);\n if (this.locale) {\n fn(this.locale);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var options = {};\n options['case-sensitive'] = this.caseSensitive.serialize();\n options['diacritic-sensitive'] = this.diacriticSensitive.serialize();\n if (this.locale) {\n options['locale'] = this.locale.serialize();\n }\n return ['collator', options];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"Expected one argument.\");\n var options = args[1];\n if (_typeof(options) !== 'object' || Array.isArray(options)) return context.error(\"Collator options argument must be an object.\");\n var caseSensitive = context.parse(options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType);\n if (!caseSensitive) return null;\n var diacriticSensitive = context.parse(options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType);\n if (!diacriticSensitive) return null;\n var locale = null;\n if (options['locale']) {\n locale = context.parse(options['locale'], 1, StringType);\n if (!locale) return null;\n }\n return new CollatorExpression(caseSensitive, diacriticSensitive, locale);\n }\n }]);\n}();\nvar EXTENT = 8192;\nfunction updateBBox(bbox, coord) {\n bbox[0] = Math.min(bbox[0], coord[0]);\n bbox[1] = Math.min(bbox[1], coord[1]);\n bbox[2] = Math.max(bbox[2], coord[0]);\n bbox[3] = Math.max(bbox[3], coord[1]);\n}\nfunction mercatorXfromLng(lng) {\n return (180 + lng) / 360;\n}\nfunction mercatorYfromLat(lat) {\n return (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))) / 360;\n}\nfunction boxWithinBox(bbox1, bbox2) {\n if (bbox1[0] <= bbox2[0]) return false;\n if (bbox1[2] >= bbox2[2]) return false;\n if (bbox1[1] <= bbox2[1]) return false;\n if (bbox1[3] >= bbox2[3]) return false;\n return true;\n}\nfunction getTileCoordinates(p, canonical) {\n var x = mercatorXfromLng(p[0]);\n var y = mercatorYfromLat(p[1]);\n var tilesAtZoom = Math.pow(2, canonical.z);\n return [Math.round(x * tilesAtZoom * EXTENT), Math.round(y * tilesAtZoom * EXTENT)];\n}\nfunction onBoundary(p, p1, p2) {\n var x1 = p[0] - p1[0];\n var y1 = p[1] - p1[1];\n var x2 = p[0] - p2[0];\n var y2 = p[1] - p2[1];\n return x1 * y2 - x2 * y1 === 0 && x1 * x2 <= 0 && y1 * y2 <= 0;\n}\nfunction rayIntersect(p, p1, p2) {\n return p1[1] > p[1] !== p2[1] > p[1] && p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0];\n}\nfunction pointWithinPolygon(point, rings) {\n var inside = false;\n for (var i = 0, len = rings.length; i < len; i++) {\n var ring = rings[i];\n for (var j = 0, len2 = ring.length; j < len2 - 1; j++) {\n if (onBoundary(point, ring[j], ring[j + 1])) return false;\n if (rayIntersect(point, ring[j], ring[j + 1])) inside = !inside;\n }\n }\n return inside;\n}\nfunction pointWithinPolygons(point, polygons) {\n for (var i = 0; i < polygons.length; i++) {\n if (pointWithinPolygon(point, polygons[i])) return true;\n }\n return false;\n}\nfunction perp(v1, v2) {\n return v1[0] * v2[1] - v1[1] * v2[0];\n}\nfunction twoSided(p1, p2, q1, q2) {\n var x1 = p1[0] - q1[0];\n var y1 = p1[1] - q1[1];\n var x2 = p2[0] - q1[0];\n var y2 = p2[1] - q1[1];\n var x3 = q2[0] - q1[0];\n var y3 = q2[1] - q1[1];\n var det1 = x1 * y3 - x3 * y1;\n var det2 = x2 * y3 - x3 * y2;\n if (det1 > 0 && det2 < 0 || det1 < 0 && det2 > 0) return true;\n return false;\n}\nfunction lineIntersectLine(a, b, c, d) {\n var vectorP = [b[0] - a[0], b[1] - a[1]];\n var vectorQ = [d[0] - c[0], d[1] - c[1]];\n if (perp(vectorQ, vectorP) === 0) return false;\n if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) return true;\n return false;\n}\nfunction lineIntersectPolygon(p1, p2, polygon) {\n var _iterator11 = _createForOfIteratorHelper(polygon),\n _step11;\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n var ring = _step11.value;\n for (var j = 0; j < ring.length - 1; ++j) {\n if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) {\n return true;\n }\n }\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n return false;\n}\nfunction lineStringWithinPolygon(line, polygon) {\n for (var i = 0; i < line.length; ++i) {\n if (!pointWithinPolygon(line[i], polygon)) {\n return false;\n }\n }\n for (var _i6 = 0; _i6 < line.length - 1; ++_i6) {\n if (lineIntersectPolygon(line[_i6], line[_i6 + 1], polygon)) {\n return false;\n }\n }\n return true;\n}\nfunction lineStringWithinPolygons(line, polygons) {\n for (var i = 0; i < polygons.length; i++) {\n if (lineStringWithinPolygon(line, polygons[i])) return true;\n }\n return false;\n}\nfunction getTilePolygon(coordinates, bbox, canonical) {\n var polygon = [];\n for (var i = 0; i < coordinates.length; i++) {\n var ring = [];\n for (var j = 0; j < coordinates[i].length; j++) {\n var coord = getTileCoordinates(coordinates[i][j], canonical);\n updateBBox(bbox, coord);\n ring.push(coord);\n }\n polygon.push(ring);\n }\n return polygon;\n}\nfunction getTilePolygons(coordinates, bbox, canonical) {\n var polygons = [];\n for (var i = 0; i < coordinates.length; i++) {\n var polygon = getTilePolygon(coordinates[i], bbox, canonical);\n polygons.push(polygon);\n }\n return polygons;\n}\nfunction updatePoint(p, bbox, polyBBox, worldSize) {\n if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) {\n var halfWorldSize = worldSize * 0.5;\n var shift = p[0] - polyBBox[0] > halfWorldSize ? -worldSize : polyBBox[0] - p[0] > halfWorldSize ? worldSize : 0;\n if (shift === 0) {\n shift = p[0] - polyBBox[2] > halfWorldSize ? -worldSize : polyBBox[2] - p[0] > halfWorldSize ? worldSize : 0;\n }\n p[0] += shift;\n }\n updateBBox(bbox, p);\n}\nfunction resetBBox(bbox) {\n bbox[0] = bbox[1] = Infinity;\n bbox[2] = bbox[3] = -Infinity;\n}\nfunction getTilePoints(geometry, pointBBox, polyBBox, canonical) {\n var worldSize = Math.pow(2, canonical.z) * EXTENT;\n var shifts = [canonical.x * EXTENT, canonical.y * EXTENT];\n var tilePoints = [];\n var _iterator12 = _createForOfIteratorHelper(geometry),\n _step12;\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n var points = _step12.value;\n var _iterator13 = _createForOfIteratorHelper(points),\n _step13;\n try {\n for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {\n var point = _step13.value;\n var p = [point.x + shifts[0], point.y + shifts[1]];\n updatePoint(p, pointBBox, polyBBox, worldSize);\n tilePoints.push(p);\n }\n } catch (err) {\n _iterator13.e(err);\n } finally {\n _iterator13.f();\n }\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n return tilePoints;\n}\nfunction getTileLines(geometry, lineBBox, polyBBox, canonical) {\n var worldSize = Math.pow(2, canonical.z) * EXTENT;\n var shifts = [canonical.x * EXTENT, canonical.y * EXTENT];\n var tileLines = [];\n var _iterator14 = _createForOfIteratorHelper(geometry),\n _step14;\n try {\n for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {\n var _line = _step14.value;\n var tileLine = [];\n var _iterator17 = _createForOfIteratorHelper(_line),\n _step17;\n try {\n for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {\n var point = _step17.value;\n var _p = [point.x + shifts[0], point.y + shifts[1]];\n updateBBox(lineBBox, _p);\n tileLine.push(_p);\n }\n } catch (err) {\n _iterator17.e(err);\n } finally {\n _iterator17.f();\n }\n tileLines.push(tileLine);\n }\n } catch (err) {\n _iterator14.e(err);\n } finally {\n _iterator14.f();\n }\n if (lineBBox[2] - lineBBox[0] <= worldSize / 2) {\n resetBBox(lineBBox);\n var _iterator15 = _createForOfIteratorHelper(tileLines),\n _step15;\n try {\n for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {\n var line = _step15.value;\n var _iterator16 = _createForOfIteratorHelper(line),\n _step16;\n try {\n for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {\n var p = _step16.value;\n updatePoint(p, lineBBox, polyBBox, worldSize);\n }\n } catch (err) {\n _iterator16.e(err);\n } finally {\n _iterator16.f();\n }\n }\n } catch (err) {\n _iterator15.e(err);\n } finally {\n _iterator15.f();\n }\n }\n return tileLines;\n}\nfunction pointsWithinPolygons(ctx, polygonGeometry) {\n var pointBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var polyBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var canonical = ctx.canonicalID();\n if (polygonGeometry.type === 'Polygon') {\n var tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);\n var tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);\n if (!boxWithinBox(pointBBox, polyBBox)) return false;\n var _iterator18 = _createForOfIteratorHelper(tilePoints),\n _step18;\n try {\n for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {\n var point = _step18.value;\n if (!pointWithinPolygon(point, tilePolygon)) return false;\n }\n } catch (err) {\n _iterator18.e(err);\n } finally {\n _iterator18.f();\n }\n }\n if (polygonGeometry.type === 'MultiPolygon') {\n var tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);\n var _tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);\n if (!boxWithinBox(pointBBox, polyBBox)) return false;\n var _iterator19 = _createForOfIteratorHelper(_tilePoints),\n _step19;\n try {\n for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {\n var _point = _step19.value;\n if (!pointWithinPolygons(_point, tilePolygons)) return false;\n }\n } catch (err) {\n _iterator19.e(err);\n } finally {\n _iterator19.f();\n }\n }\n return true;\n}\nfunction linesWithinPolygons(ctx, polygonGeometry) {\n var lineBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var polyBBox = [Infinity, Infinity, -Infinity, -Infinity];\n var canonical = ctx.canonicalID();\n if (polygonGeometry.type === 'Polygon') {\n var tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);\n var tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);\n if (!boxWithinBox(lineBBox, polyBBox)) return false;\n var _iterator20 = _createForOfIteratorHelper(tileLines),\n _step20;\n try {\n for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {\n var line = _step20.value;\n if (!lineStringWithinPolygon(line, tilePolygon)) return false;\n }\n } catch (err) {\n _iterator20.e(err);\n } finally {\n _iterator20.f();\n }\n }\n if (polygonGeometry.type === 'MultiPolygon') {\n var tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);\n var _tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);\n if (!boxWithinBox(lineBBox, polyBBox)) return false;\n var _iterator21 = _createForOfIteratorHelper(_tileLines),\n _step21;\n try {\n for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {\n var _line2 = _step21.value;\n if (!lineStringWithinPolygons(_line2, tilePolygons)) return false;\n }\n } catch (err) {\n _iterator21.e(err);\n } finally {\n _iterator21.f();\n }\n }\n return true;\n}\nvar Within = /*#__PURE__*/function () {\n function Within(geojson, geometries) {\n _classCallCheck(this, Within);\n this.type = BooleanType;\n this.geojson = geojson;\n this.geometries = geometries;\n }\n return _createClass(Within, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n if (ctx.geometry() != null && ctx.canonicalID() != null) {\n if (ctx.geometryType() === 'Point') {\n return pointsWithinPolygons(ctx, this.geometries);\n } else if (ctx.geometryType() === 'LineString') {\n return linesWithinPolygons(ctx, this.geometries);\n }\n }\n return false;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild() {}\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['within', this.geojson];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"'within' expression requires exactly one argument, but found \".concat(args.length - 1, \" instead.\"));\n if (isValue(args[1])) {\n var geojson = args[1];\n if (geojson.type === 'FeatureCollection') {\n for (var i = 0; i < geojson.features.length; ++i) {\n var type = geojson.features[i].geometry.type;\n if (type === 'Polygon' || type === 'MultiPolygon') {\n return new Within(geojson, geojson.features[i].geometry);\n }\n }\n } else if (geojson.type === 'Feature') {\n var _type2 = geojson.geometry.type;\n if (_type2 === 'Polygon' || _type2 === 'MultiPolygon') {\n return new Within(geojson, geojson.geometry);\n }\n } else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') {\n return new Within(geojson, geojson);\n }\n }\n return context.error(\"'within' expression requires valid geojson object that contains polygon geometry type.\");\n }\n }]);\n}();\nfunction isFeatureConstant(e) {\n if (e instanceof CompoundExpression) {\n if (e.name === 'get' && e.args.length === 1) {\n return false;\n } else if (e.name === 'feature-state') {\n return false;\n } else if (e.name === 'has' && e.args.length === 1) {\n return false;\n } else if (e.name === 'properties' || e.name === 'geometry-type' || e.name === 'id') {\n return false;\n } else if (/^filter-/.test(e.name)) {\n return false;\n }\n }\n if (e instanceof Within) {\n return false;\n }\n var result = true;\n e.eachChild(function (arg) {\n if (result && !isFeatureConstant(arg)) {\n result = false;\n }\n });\n return result;\n}\nfunction isStateConstant(e) {\n if (e instanceof CompoundExpression) {\n if (e.name === 'feature-state') {\n return false;\n }\n }\n var result = true;\n e.eachChild(function (arg) {\n if (result && !isStateConstant(arg)) {\n result = false;\n }\n });\n return result;\n}\nfunction isGlobalPropertyConstant(e, properties) {\n if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) {\n return false;\n }\n var result = true;\n e.eachChild(function (arg) {\n if (result && !isGlobalPropertyConstant(arg, properties)) {\n result = false;\n }\n });\n return result;\n}\nvar Var = /*#__PURE__*/function () {\n function Var(name, boundExpression) {\n _classCallCheck(this, Var);\n this.type = boundExpression.type;\n this.name = name;\n this.boundExpression = boundExpression;\n }\n return _createClass(Var, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return this.boundExpression.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild() {}\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['var', this.name];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2 || typeof args[1] !== 'string') return context.error(\"'var' expression requires exactly one string literal argument.\");\n var name = args[1];\n if (!context.scope.has(name)) {\n return context.error(\"Unknown variable \\\"\".concat(name, \"\\\". Make sure \\\"\").concat(name, \"\\\" has been bound in an enclosing \\\"let\\\" expression before using it.\"), 1);\n }\n return new Var(name, context.scope.get(name));\n }\n }]);\n}();\nvar ParsingContext = /*#__PURE__*/function () {\n function ParsingContext(registry) {\n var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var expectedType = arguments.length > 2 ? arguments[2] : undefined;\n var scope = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Scope();\n var errors = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n _classCallCheck(this, ParsingContext);\n this.registry = registry;\n this.path = path;\n this.key = path.map(function (part) {\n return \"[\".concat(part, \"]\");\n }).join('');\n this.scope = scope;\n this.errors = errors;\n this.expectedType = expectedType;\n }\n return _createClass(ParsingContext, [{\n key: \"parse\",\n value: function parse(expr, index, expectedType, bindings) {\n var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n if (index) {\n return this.concat(index, expectedType, bindings)._parse(expr, options);\n }\n return this._parse(expr, options);\n }\n }, {\n key: \"_parse\",\n value: function _parse(expr, options) {\n if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {\n expr = ['literal', expr];\n }\n function annotate(parsed, type, typeAnnotation) {\n if (typeAnnotation === 'assert') {\n return new Assertion(type, [parsed]);\n } else if (typeAnnotation === 'coerce') {\n return new Coercion(type, [parsed]);\n } else {\n return parsed;\n }\n }\n if (Array.isArray(expr)) {\n if (expr.length === 0) {\n return this.error(\"Expected an array with at least one element. If you wanted a literal array, use [\\\"literal\\\", []].\");\n }\n var op = expr[0];\n if (typeof op !== 'string') {\n this.error(\"Expression name must be a string, but found \".concat(_typeof(op), \" instead. If you wanted a literal array, use [\\\"literal\\\", [...]].\"), 0);\n return null;\n }\n var Expr = this.registry[op];\n if (Expr) {\n var parsed = Expr.parse(expr, this);\n if (!parsed) return null;\n if (this.expectedType) {\n var expected = this.expectedType;\n var actual = parsed.type;\n if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {\n parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');\n } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {\n parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');\n } else if (this.checkSubtype(expected, actual)) {\n return null;\n }\n }\n if (!(parsed instanceof Literal) && parsed.type.kind !== 'resolvedImage' && isConstant(parsed)) {\n var ec = new EvaluationContext();\n try {\n parsed = new Literal(parsed.type, parsed.evaluate(ec));\n } catch (e) {\n this.error(e.message);\n return null;\n }\n }\n return parsed;\n }\n return this.error(\"Unknown expression \\\"\".concat(op, \"\\\". If you wanted a literal array, use [\\\"literal\\\", [...]].\"), 0);\n } else if (typeof expr === 'undefined') {\n return this.error(\"'undefined' value invalid. Use null instead.\");\n } else if (_typeof(expr) === 'object') {\n return this.error(\"Bare objects invalid. Use [\\\"literal\\\", {...}] instead.\");\n } else {\n return this.error(\"Expected an array, but found \".concat(_typeof(expr), \" instead.\"));\n }\n }\n }, {\n key: \"concat\",\n value: function concat(index, expectedType, bindings) {\n var path = typeof index === 'number' ? this.path.concat(index) : this.path;\n var scope = bindings ? this.scope.concat(bindings) : this.scope;\n return new ParsingContext(this.registry, path, expectedType || null, scope, this.errors);\n }\n }, {\n key: \"error\",\n value: function error(_error3) {\n for (var _len2 = arguments.length, keys = new Array(_len2 > 1 ? _len2 - 1 : 0), _key4 = 1; _key4 < _len2; _key4++) {\n keys[_key4 - 1] = arguments[_key4];\n }\n var key = \"\".concat(this.key).concat(keys.map(function (k) {\n return \"[\".concat(k, \"]\");\n }).join(''));\n this.errors.push(new ParsingError(key, _error3));\n }\n }, {\n key: \"checkSubtype\",\n value: function checkSubtype(expected, t) {\n var error = _checkSubtype(expected, t);\n if (error) this.error(error);\n return error;\n }\n }]);\n}();\nfunction isConstant(expression) {\n if (expression instanceof Var) {\n return isConstant(expression.boundExpression);\n } else if (expression instanceof CompoundExpression && expression.name === 'error') {\n return false;\n } else if (expression instanceof CollatorExpression) {\n return false;\n } else if (expression instanceof Within) {\n return false;\n }\n var isTypeAnnotation = expression instanceof Coercion || expression instanceof Assertion;\n var childrenConstant = true;\n expression.eachChild(function (child) {\n if (isTypeAnnotation) {\n childrenConstant = childrenConstant && isConstant(child);\n } else {\n childrenConstant = childrenConstant && child instanceof Literal;\n }\n });\n if (!childrenConstant) {\n return false;\n }\n return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'sky-radial-progress', 'accumulated', 'is-supported-script']);\n}\nfunction findStopLessThanOrEqualTo(stops, input) {\n var lastIndex = stops.length - 1;\n var lowerIndex = 0;\n var upperIndex = lastIndex;\n var currentIndex = 0;\n var currentValue, nextValue;\n while (lowerIndex <= upperIndex) {\n currentIndex = Math.floor((lowerIndex + upperIndex) / 2);\n currentValue = stops[currentIndex];\n nextValue = stops[currentIndex + 1];\n if (currentValue <= input) {\n if (currentIndex === lastIndex || input < nextValue) {\n return currentIndex;\n }\n lowerIndex = currentIndex + 1;\n } else if (currentValue > input) {\n upperIndex = currentIndex - 1;\n } else {\n throw new RuntimeError('Input is not a number.');\n }\n }\n return 0;\n}\nvar Step = /*#__PURE__*/function () {\n function Step(type, input, stops) {\n _classCallCheck(this, Step);\n this.type = type;\n this.input = input;\n this.labels = [];\n this.outputs = [];\n var _iterator22 = _createForOfIteratorHelper(stops),\n _step22;\n try {\n for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {\n var _step22$value = _slicedToArray(_step22.value, 2),\n label = _step22$value[0],\n _expression2 = _step22$value[1];\n this.labels.push(label);\n this.outputs.push(_expression2);\n }\n } catch (err) {\n _iterator22.e(err);\n } finally {\n _iterator22.f();\n }\n }\n return _createClass(Step, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var labels = this.labels;\n var outputs = this.outputs;\n if (labels.length === 1) {\n return outputs[0].evaluate(ctx);\n }\n var value = this.input.evaluate(ctx);\n if (value <= labels[0]) {\n return outputs[0].evaluate(ctx);\n }\n var stopCount = labels.length;\n if (value >= labels[stopCount - 1]) {\n return outputs[stopCount - 1].evaluate(ctx);\n }\n var index = findStopLessThanOrEqualTo(labels, value);\n return outputs[index].evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n var _iterator23 = _createForOfIteratorHelper(this.outputs),\n _step23;\n try {\n for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {\n var _expression3 = _step23.value;\n fn(_expression3);\n }\n } catch (err) {\n _iterator23.e(err);\n } finally {\n _iterator23.f();\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.outputs.every(function (out) {\n return out.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['step', this.input.serialize()];\n for (var i = 0; i < this.labels.length; i++) {\n if (i > 0) {\n serialized.push(this.labels[i]);\n }\n serialized.push(this.outputs[i].serialize());\n }\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length - 1 < 4) {\n return context.error(\"Expected at least 4 arguments, but found only \".concat(args.length - 1, \".\"));\n }\n if ((args.length - 1) % 2 !== 0) {\n return context.error(\"Expected an even number of arguments.\");\n }\n var input = context.parse(args[1], 1, NumberType);\n if (!input) return null;\n var stops = [];\n var outputType = null;\n if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n for (var i = 1; i < args.length; i += 2) {\n var label = i === 1 ? -Infinity : args[i];\n var value = args[i + 1];\n var labelKey = i;\n var valueKey = i + 1;\n if (typeof label !== 'number') {\n return context.error('Input/output pairs for \"step\" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);\n }\n if (stops.length && stops[stops.length - 1][0] >= label) {\n return context.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.', labelKey);\n }\n var parsed = context.parse(value, valueKey, outputType);\n if (!parsed) return null;\n outputType = outputType || parsed.type;\n stops.push([label, parsed]);\n }\n return new Step(outputType, input, stops);\n }\n }]);\n}();\n/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Ported from Webkit\n * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h\n */\nvar unitbezier = UnitBezier;\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n this.cx = 3.0 * p1x;\n this.bx = 3.0 * (p2x - p1x) - this.cx;\n this.ax = 1.0 - this.cx - this.bx;\n this.cy = 3.0 * p1y;\n this.by = 3.0 * (p2y - p1y) - this.cy;\n this.ay = 1.0 - this.cy - this.by;\n this.p1x = p1x;\n this.p1y = p2y;\n this.p2x = p2x;\n this.p2y = p2y;\n}\nUnitBezier.prototype.sampleCurveX = function (t) {\n // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n return ((this.ax * t + this.bx) * t + this.cx) * t;\n};\nUnitBezier.prototype.sampleCurveY = function (t) {\n return ((this.ay * t + this.by) * t + this.cy) * t;\n};\nUnitBezier.prototype.sampleCurveDerivativeX = function (t) {\n return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n};\nUnitBezier.prototype.solveCurveX = function (x, epsilon) {\n if (typeof epsilon === 'undefined') epsilon = 1e-6;\n var t0, t1, t2, x2, i;\n\n // First try a few iterations of Newton's method -- normally very fast.\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = this.sampleCurveX(t2) - x;\n if (Math.abs(x2) < epsilon) return t2;\n var d2 = this.sampleCurveDerivativeX(t2);\n if (Math.abs(d2) < 1e-6) break;\n t2 = t2 - x2 / d2;\n }\n\n // Fall back to the bisection method for reliability.\n t0 = 0.0;\n t1 = 1.0;\n t2 = x;\n if (t2 < t0) return t0;\n if (t2 > t1) return t1;\n while (t0 < t1) {\n x2 = this.sampleCurveX(t2);\n if (Math.abs(x2 - x) < epsilon) return t2;\n if (x > x2) {\n t0 = t2;\n } else {\n t1 = t2;\n }\n t2 = (t1 - t0) * 0.5 + t0;\n }\n\n // Failure.\n return t2;\n};\nUnitBezier.prototype.solve = function (x, epsilon) {\n return this.sampleCurveY(this.solveCurveX(x, epsilon));\n};\nfunction number(a, b, t) {\n return a * (1 - t) + b * t;\n}\nfunction color(from, to, t) {\n return new Color(number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t));\n}\nfunction array$1(from, to, t) {\n return from.map(function (d, i) {\n return number(d, to[i], t);\n });\n}\nvar interpolate = /*#__PURE__*/Object.freeze({\n __proto__: null,\n number: number,\n color: color,\n array: array$1\n});\nvar Xn = 0.95047,\n Yn = 1,\n Zn = 1.08883,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1,\n deg2rad = Math.PI / 180,\n rad2deg = 180 / Math.PI;\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\nfunction xyz2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\nfunction rgb2xyz(x) {\n x /= 255;\n return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\nfunction rgbToLab(rgbColor) {\n var b = rgb2xyz(rgbColor.r),\n a = rgb2xyz(rgbColor.g),\n l = rgb2xyz(rgbColor.b),\n x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),\n y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.072175 * l) / Yn),\n z = xyz2lab((0.0193339 * b + 0.119192 * a + 0.9503041 * l) / Zn);\n return {\n l: 116 * y - 16,\n a: 500 * (x - y),\n b: 200 * (y - z),\n alpha: rgbColor.a\n };\n}\nfunction labToRgb(labColor) {\n var y = (labColor.l + 16) / 116,\n x = isNaN(labColor.a) ? y : y + labColor.a / 500,\n z = isNaN(labColor.b) ? y : y - labColor.b / 200;\n y = Yn * lab2xyz(y);\n x = Xn * lab2xyz(x);\n z = Zn * lab2xyz(z);\n return new Color(xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), xyz2rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha);\n}\nfunction interpolateLab(from, to, t) {\n return {\n l: number(from.l, to.l, t),\n a: number(from.a, to.a, t),\n b: number(from.b, to.b, t),\n alpha: number(from.alpha, to.alpha, t)\n };\n}\nfunction rgbToHcl(rgbColor) {\n var _rgbToLab = rgbToLab(rgbColor),\n l = _rgbToLab.l,\n a = _rgbToLab.a,\n b = _rgbToLab.b;\n var h = Math.atan2(b, a) * rad2deg;\n return {\n h: h < 0 ? h + 360 : h,\n c: Math.sqrt(a * a + b * b),\n l: l,\n alpha: rgbColor.a\n };\n}\nfunction hclToRgb(hclColor) {\n var h = hclColor.h * deg2rad,\n c = hclColor.c,\n l = hclColor.l;\n return labToRgb({\n l: l,\n a: Math.cos(h) * c,\n b: Math.sin(h) * c,\n alpha: hclColor.alpha\n });\n}\nfunction interpolateHue(a, b, t) {\n var d = b - a;\n return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d);\n}\nfunction interpolateHcl(from, to, t) {\n return {\n h: interpolateHue(from.h, to.h, t),\n c: number(from.c, to.c, t),\n l: number(from.l, to.l, t),\n alpha: number(from.alpha, to.alpha, t)\n };\n}\nvar lab = {\n forward: rgbToLab,\n reverse: labToRgb,\n interpolate: interpolateLab\n};\nvar hcl = {\n forward: rgbToHcl,\n reverse: hclToRgb,\n interpolate: interpolateHcl\n};\nvar colorSpaces = /*#__PURE__*/Object.freeze({\n __proto__: null,\n lab: lab,\n hcl: hcl\n});\nvar Interpolate = /*#__PURE__*/function () {\n function Interpolate(type, operator, interpolation, input, stops) {\n _classCallCheck(this, Interpolate);\n this.type = type;\n this.operator = operator;\n this.interpolation = interpolation;\n this.input = input;\n this.labels = [];\n this.outputs = [];\n var _iterator24 = _createForOfIteratorHelper(stops),\n _step24;\n try {\n for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {\n var _step24$value = _slicedToArray(_step24.value, 2),\n label = _step24$value[0],\n _expression4 = _step24$value[1];\n this.labels.push(label);\n this.outputs.push(_expression4);\n }\n } catch (err) {\n _iterator24.e(err);\n } finally {\n _iterator24.f();\n }\n }\n return _createClass(Interpolate, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var labels = this.labels;\n var outputs = this.outputs;\n if (labels.length === 1) {\n return outputs[0].evaluate(ctx);\n }\n var value = this.input.evaluate(ctx);\n if (value <= labels[0]) {\n return outputs[0].evaluate(ctx);\n }\n var stopCount = labels.length;\n if (value >= labels[stopCount - 1]) {\n return outputs[stopCount - 1].evaluate(ctx);\n }\n var index = findStopLessThanOrEqualTo(labels, value);\n var lower = labels[index];\n var upper = labels[index + 1];\n var t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper);\n var outputLower = outputs[index].evaluate(ctx);\n var outputUpper = outputs[index + 1].evaluate(ctx);\n if (this.operator === 'interpolate') {\n return interpolate[this.type.kind.toLowerCase()](outputLower, outputUpper, t);\n } else if (this.operator === 'interpolate-hcl') {\n return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t));\n } else {\n return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t));\n }\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n var _iterator25 = _createForOfIteratorHelper(this.outputs),\n _step25;\n try {\n for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {\n var _expression5 = _step25.value;\n fn(_expression5);\n }\n } catch (err) {\n _iterator25.e(err);\n } finally {\n _iterator25.f();\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.outputs.every(function (out) {\n return out.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var interpolation;\n if (this.interpolation.name === 'linear') {\n interpolation = ['linear'];\n } else if (this.interpolation.name === 'exponential') {\n if (this.interpolation.base === 1) {\n interpolation = ['linear'];\n } else {\n interpolation = ['exponential', this.interpolation.base];\n }\n } else {\n interpolation = ['cubic-bezier'].concat(this.interpolation.controlPoints);\n }\n var serialized = [this.operator, interpolation, this.input.serialize()];\n for (var i = 0; i < this.labels.length; i++) {\n serialized.push(this.labels[i], this.outputs[i].serialize());\n }\n return serialized;\n }\n }], [{\n key: \"interpolationFactor\",\n value: function interpolationFactor(interpolation, input, lower, upper) {\n var t = 0;\n if (interpolation.name === 'exponential') {\n t = exponentialInterpolation(input, interpolation.base, lower, upper);\n } else if (interpolation.name === 'linear') {\n t = exponentialInterpolation(input, 1, lower, upper);\n } else if (interpolation.name === 'cubic-bezier') {\n var c = interpolation.controlPoints;\n var ub = new unitbezier(c[0], c[1], c[2], c[3]);\n t = ub.solve(exponentialInterpolation(input, 1, lower, upper));\n }\n return t;\n }\n }, {\n key: \"parse\",\n value: function parse(args, context) {\n var _args = _toArray(args),\n operator = _args[0],\n interpolation = _args[1],\n input = _args[2],\n rest = _args.slice(3);\n if (!Array.isArray(interpolation) || interpolation.length === 0) {\n return context.error(\"Expected an interpolation type expression.\", 1);\n }\n if (interpolation[0] === 'linear') {\n interpolation = {\n name: 'linear'\n };\n } else if (interpolation[0] === 'exponential') {\n var base = interpolation[1];\n if (typeof base !== 'number') return context.error(\"Exponential interpolation requires a numeric base.\", 1, 1);\n interpolation = {\n name: 'exponential',\n base: base\n };\n } else if (interpolation[0] === 'cubic-bezier') {\n var controlPoints = interpolation.slice(1);\n if (controlPoints.length !== 4 || controlPoints.some(function (t) {\n return typeof t !== 'number' || t < 0 || t > 1;\n })) {\n return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1);\n }\n interpolation = {\n name: 'cubic-bezier',\n controlPoints: controlPoints\n };\n } else {\n return context.error(\"Unknown interpolation type \".concat(String(interpolation[0])), 1, 0);\n }\n if (args.length - 1 < 4) {\n return context.error(\"Expected at least 4 arguments, but found only \".concat(args.length - 1, \".\"));\n }\n if ((args.length - 1) % 2 !== 0) {\n return context.error(\"Expected an even number of arguments.\");\n }\n input = context.parse(input, 2, NumberType);\n if (!input) return null;\n var stops = [];\n var outputType = null;\n if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') {\n outputType = ColorType;\n } else if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n for (var i = 0; i < rest.length; i += 2) {\n var label = rest[i];\n var value = rest[i + 1];\n var labelKey = i + 3;\n var valueKey = i + 4;\n if (typeof label !== 'number') {\n return context.error('Input/output pairs for \"interpolate\" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);\n }\n if (stops.length && stops[stops.length - 1][0] >= label) {\n return context.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.', labelKey);\n }\n var parsed = context.parse(value, valueKey, outputType);\n if (!parsed) return null;\n outputType = outputType || parsed.type;\n stops.push([label, parsed]);\n }\n if (outputType.kind !== 'number' && outputType.kind !== 'color' && !(outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number')) {\n return context.error(\"Type \".concat(toString(outputType), \" is not interpolatable.\"));\n }\n return new Interpolate(outputType, operator, interpolation, input, stops);\n }\n }]);\n}();\nfunction exponentialInterpolation(input, base, lowerValue, upperValue) {\n var difference = upperValue - lowerValue;\n var progress = input - lowerValue;\n if (difference === 0) {\n return 0;\n } else if (base === 1) {\n return progress / difference;\n } else {\n return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n }\n}\nvar Coalesce = /*#__PURE__*/function () {\n function Coalesce(type, args) {\n _classCallCheck(this, Coalesce);\n this.type = type;\n this.args = args;\n }\n return _createClass(Coalesce, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var result = null;\n var argCount = 0;\n var requestedImageName;\n var _iterator26 = _createForOfIteratorHelper(this.args),\n _step26;\n try {\n for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {\n var arg = _step26.value;\n argCount++;\n result = arg.evaluate(ctx);\n if (result && result instanceof ResolvedImage && !result.available) {\n if (!requestedImageName) {\n requestedImageName = result.name;\n }\n result = null;\n if (argCount === this.args.length) {\n result = requestedImageName;\n }\n }\n if (result !== null) break;\n }\n } catch (err) {\n _iterator26.e(err);\n } finally {\n _iterator26.f();\n }\n return result;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n this.args.forEach(fn);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.args.every(function (arg) {\n return arg.outputDefined();\n });\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['coalesce'];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 2) {\n return context.error('Expectected at least one argument.');\n }\n var outputType = null;\n var expectedType = context.expectedType;\n if (expectedType && expectedType.kind !== 'value') {\n outputType = expectedType;\n }\n var parsedArgs = [];\n var _iterator27 = _createForOfIteratorHelper(args.slice(1)),\n _step27;\n try {\n for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {\n var arg = _step27.value;\n var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {\n typeAnnotation: 'omit'\n });\n if (!parsed) return null;\n outputType = outputType || parsed.type;\n parsedArgs.push(parsed);\n }\n } catch (err) {\n _iterator27.e(err);\n } finally {\n _iterator27.f();\n }\n var needsAnnotation = expectedType && parsedArgs.some(function (arg) {\n return _checkSubtype(expectedType, arg.type);\n });\n return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce(outputType, parsedArgs);\n }\n }]);\n}();\nvar Let = /*#__PURE__*/function () {\n function Let(bindings, result) {\n _classCallCheck(this, Let);\n this.type = result.type;\n this.bindings = [].concat(bindings);\n this.result = result;\n }\n return _createClass(Let, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return this.result.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n var _iterator28 = _createForOfIteratorHelper(this.bindings),\n _step28;\n try {\n for (_iterator28.s(); !(_step28 = _iterator28.n()).done;) {\n var binding = _step28.value;\n fn(binding[1]);\n }\n } catch (err) {\n _iterator28.e(err);\n } finally {\n _iterator28.f();\n }\n fn(this.result);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.result.outputDefined();\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['let'];\n var _iterator29 = _createForOfIteratorHelper(this.bindings),\n _step29;\n try {\n for (_iterator29.s(); !(_step29 = _iterator29.n()).done;) {\n var _step29$value = _slicedToArray(_step29.value, 2),\n name = _step29$value[0],\n expr = _step29$value[1];\n serialized.push(name, expr.serialize());\n }\n } catch (err) {\n _iterator29.e(err);\n } finally {\n _iterator29.f();\n }\n serialized.push(this.result.serialize());\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 4) return context.error(\"Expected at least 3 arguments, but found \".concat(args.length - 1, \" instead.\"));\n var bindings = [];\n for (var i = 1; i < args.length - 1; i += 2) {\n var name = args[i];\n if (typeof name !== 'string') {\n return context.error(\"Expected string, but found \".concat(_typeof(name), \" instead.\"), i);\n }\n if (/[^a-zA-Z0-9_]/.test(name)) {\n return context.error(\"Variable names must contain only alphanumeric characters or '_'.\", i);\n }\n var value = context.parse(args[i + 1], i + 1);\n if (!value) return null;\n bindings.push([name, value]);\n }\n var result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings);\n if (!result) return null;\n return new Let(bindings, result);\n }\n }]);\n}();\nvar At = /*#__PURE__*/function () {\n function At(type, index, input) {\n _classCallCheck(this, At);\n this.type = type;\n this.index = index;\n this.input = input;\n }\n return _createClass(At, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var index = this.index.evaluate(ctx);\n var array = this.input.evaluate(ctx);\n if (index < 0) {\n throw new RuntimeError(\"Array index out of bounds: \".concat(index, \" < 0.\"));\n }\n if (index >= array.length) {\n throw new RuntimeError(\"Array index out of bounds: \".concat(index, \" > \").concat(array.length - 1, \".\"));\n }\n if (index !== Math.floor(index)) {\n throw new RuntimeError(\"Array index must be an integer, but found \".concat(index, \" instead.\"));\n }\n return array[index];\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.index);\n fn(this.input);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['at', this.index.serialize(), this.input.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3) return context.error(\"Expected 2 arguments, but found \".concat(args.length - 1, \" instead.\"));\n var index = context.parse(args[1], 1, NumberType);\n var input = context.parse(args[2], 2, array(context.expectedType || ValueType));\n if (!index || !input) return null;\n var t = input.type;\n return new At(t.itemType, index, input);\n }\n }]);\n}();\nvar In = /*#__PURE__*/function () {\n function In(needle, haystack) {\n _classCallCheck(this, In);\n this.type = BooleanType;\n this.needle = needle;\n this.haystack = haystack;\n }\n return _createClass(In, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var needle = this.needle.evaluate(ctx);\n var haystack = this.haystack.evaluate(ctx);\n if (!haystack) return false;\n if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {\n throw new RuntimeError(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(typeOf(needle)), \" instead.\"));\n }\n if (!isValidNativeType(haystack, ['string', 'array'])) {\n throw new RuntimeError(\"Expected second argument to be of type array or string, but found \".concat(toString(typeOf(haystack)), \" instead.\"));\n }\n return haystack.indexOf(needle) >= 0;\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.needle);\n fn(this.haystack);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n return ['in', this.needle.serialize(), this.haystack.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3) {\n return context.error(\"Expected 2 arguments, but found \".concat(args.length - 1, \" instead.\"));\n }\n var needle = context.parse(args[1], 1, ValueType);\n var haystack = context.parse(args[2], 2, ValueType);\n if (!needle || !haystack) return null;\n if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {\n return context.error(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(needle.type), \" instead\"));\n }\n return new In(needle, haystack);\n }\n }]);\n}();\nvar IndexOf = /*#__PURE__*/function () {\n function IndexOf(needle, haystack, fromIndex) {\n _classCallCheck(this, IndexOf);\n this.type = NumberType;\n this.needle = needle;\n this.haystack = haystack;\n this.fromIndex = fromIndex;\n }\n return _createClass(IndexOf, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var needle = this.needle.evaluate(ctx);\n var haystack = this.haystack.evaluate(ctx);\n if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {\n throw new RuntimeError(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(typeOf(needle)), \" instead.\"));\n }\n if (!isValidNativeType(haystack, ['string', 'array'])) {\n throw new RuntimeError(\"Expected second argument to be of type array or string, but found \".concat(toString(typeOf(haystack)), \" instead.\"));\n }\n if (this.fromIndex) {\n var fromIndex = this.fromIndex.evaluate(ctx);\n return haystack.indexOf(needle, fromIndex);\n }\n return haystack.indexOf(needle);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.needle);\n fn(this.haystack);\n if (this.fromIndex) {\n fn(this.fromIndex);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.fromIndex != null && this.fromIndex !== undefined) {\n var fromIndex = this.fromIndex.serialize();\n return ['index-of', this.needle.serialize(), this.haystack.serialize(), fromIndex];\n }\n return ['index-of', this.needle.serialize(), this.haystack.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length <= 2 || args.length >= 5) {\n return context.error(\"Expected 3 or 4 arguments, but found \".concat(args.length - 1, \" instead.\"));\n }\n var needle = context.parse(args[1], 1, ValueType);\n var haystack = context.parse(args[2], 2, ValueType);\n if (!needle || !haystack) return null;\n if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {\n return context.error(\"Expected first argument to be of type boolean, string, number or null, but found \".concat(toString(needle.type), \" instead\"));\n }\n if (args.length === 4) {\n var fromIndex = context.parse(args[3], 3, NumberType);\n if (!fromIndex) return null;\n return new IndexOf(needle, haystack, fromIndex);\n } else {\n return new IndexOf(needle, haystack);\n }\n }\n }]);\n}();\nvar Match = /*#__PURE__*/function () {\n function Match(inputType, outputType, input, cases, outputs, otherwise) {\n _classCallCheck(this, Match);\n this.inputType = inputType;\n this.type = outputType;\n this.input = input;\n this.cases = cases;\n this.outputs = outputs;\n this.otherwise = otherwise;\n }\n return _createClass(Match, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var input = this.input.evaluate(ctx);\n var output = typeOf(input) === this.inputType && this.outputs[this.cases[input]] || this.otherwise;\n return output.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n this.outputs.forEach(fn);\n fn(this.otherwise);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.outputs.every(function (out) {\n return out.outputDefined();\n }) && this.otherwise.outputDefined();\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var _this2 = this;\n var serialized = ['match', this.input.serialize()];\n var sortedLabels = Object.keys(this.cases).sort();\n var groupedByOutput = [];\n var outputLookup = {};\n var _iterator30 = _createForOfIteratorHelper(sortedLabels),\n _step30;\n try {\n for (_iterator30.s(); !(_step30 = _iterator30.n()).done;) {\n var label = _step30.value;\n var _outputIndex = outputLookup[this.cases[label]];\n if (_outputIndex === undefined) {\n outputLookup[this.cases[label]] = groupedByOutput.length;\n groupedByOutput.push([this.cases[label], [label]]);\n } else {\n groupedByOutput[_outputIndex][1].push(label);\n }\n }\n } catch (err) {\n _iterator30.e(err);\n } finally {\n _iterator30.f();\n }\n var coerceLabel = function coerceLabel(label) {\n return _this2.inputType.kind === 'number' ? Number(label) : label;\n };\n for (var _i7 = 0, _groupedByOutput = groupedByOutput; _i7 < _groupedByOutput.length; _i7++) {\n var _groupedByOutput$_i = _slicedToArray(_groupedByOutput[_i7], 2),\n outputIndex = _groupedByOutput$_i[0],\n labels = _groupedByOutput$_i[1];\n if (labels.length === 1) {\n serialized.push(coerceLabel(labels[0]));\n } else {\n serialized.push(labels.map(coerceLabel));\n }\n serialized.push(this.outputs[outputIndex].serialize());\n }\n serialized.push(this.otherwise.serialize());\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 5) return context.error(\"Expected at least 4 arguments, but found only \".concat(args.length - 1, \".\"));\n if (args.length % 2 !== 1) return context.error(\"Expected an even number of arguments.\");\n var inputType;\n var outputType;\n if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n var cases = {};\n var outputs = [];\n for (var i = 2; i < args.length - 1; i += 2) {\n var labels = args[i];\n var value = args[i + 1];\n if (!Array.isArray(labels)) {\n labels = [labels];\n }\n var labelContext = context.concat(i);\n if (labels.length === 0) {\n return labelContext.error('Expected at least one branch label.');\n }\n var _iterator31 = _createForOfIteratorHelper(labels),\n _step31;\n try {\n for (_iterator31.s(); !(_step31 = _iterator31.n()).done;) {\n var label = _step31.value;\n if (typeof label !== 'number' && typeof label !== 'string') {\n return labelContext.error(\"Branch labels must be numbers or strings.\");\n } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) {\n return labelContext.error(\"Branch labels must be integers no larger than \".concat(Number.MAX_SAFE_INTEGER, \".\"));\n } else if (typeof label === 'number' && Math.floor(label) !== label) {\n return labelContext.error(\"Numeric branch labels must be integer values.\");\n } else if (!inputType) {\n inputType = typeOf(label);\n } else if (labelContext.checkSubtype(inputType, typeOf(label))) {\n return null;\n }\n if (typeof cases[String(label)] !== 'undefined') {\n return labelContext.error('Branch labels must be unique.');\n }\n cases[String(label)] = outputs.length;\n }\n } catch (err) {\n _iterator31.e(err);\n } finally {\n _iterator31.f();\n }\n var result = context.parse(value, i, outputType);\n if (!result) return null;\n outputType = outputType || result.type;\n outputs.push(result);\n }\n var input = context.parse(args[1], 1, ValueType);\n if (!input) return null;\n var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);\n if (!otherwise) return null;\n if (input.type.kind !== 'value' && context.concat(1).checkSubtype(inputType, input.type)) {\n return null;\n }\n return new Match(inputType, outputType, input, cases, outputs, otherwise);\n }\n }]);\n}();\nvar Case = /*#__PURE__*/function () {\n function Case(type, branches, otherwise) {\n _classCallCheck(this, Case);\n this.type = type;\n this.branches = branches;\n this.otherwise = otherwise;\n }\n return _createClass(Case, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var _iterator32 = _createForOfIteratorHelper(this.branches),\n _step32;\n try {\n for (_iterator32.s(); !(_step32 = _iterator32.n()).done;) {\n var _step32$value = _slicedToArray(_step32.value, 2),\n test = _step32$value[0],\n _expression6 = _step32$value[1];\n if (test.evaluate(ctx)) {\n return _expression6.evaluate(ctx);\n }\n }\n } catch (err) {\n _iterator32.e(err);\n } finally {\n _iterator32.f();\n }\n return this.otherwise.evaluate(ctx);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n var _iterator33 = _createForOfIteratorHelper(this.branches),\n _step33;\n try {\n for (_iterator33.s(); !(_step33 = _iterator33.n()).done;) {\n var _step33$value = _slicedToArray(_step33.value, 2),\n test = _step33$value[0],\n _expression7 = _step33$value[1];\n fn(test);\n fn(_expression7);\n }\n } catch (err) {\n _iterator33.e(err);\n } finally {\n _iterator33.f();\n }\n fn(this.otherwise);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return this.branches.every(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n _ = _ref6[0],\n out = _ref6[1];\n return out.outputDefined();\n }) && this.otherwise.outputDefined();\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['case'];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length < 4) return context.error(\"Expected at least 3 arguments, but found only \".concat(args.length - 1, \".\"));\n if (args.length % 2 !== 0) return context.error(\"Expected an odd number of arguments.\");\n var outputType;\n if (context.expectedType && context.expectedType.kind !== 'value') {\n outputType = context.expectedType;\n }\n var branches = [];\n for (var i = 1; i < args.length - 1; i += 2) {\n var test = context.parse(args[i], i, BooleanType);\n if (!test) return null;\n var result = context.parse(args[i + 1], i + 1, outputType);\n if (!result) return null;\n branches.push([test, result]);\n outputType = outputType || result.type;\n }\n var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);\n if (!otherwise) return null;\n return new Case(outputType, branches, otherwise);\n }\n }]);\n}();\nvar Slice = /*#__PURE__*/function () {\n function Slice(type, input, beginIndex, endIndex) {\n _classCallCheck(this, Slice);\n this.type = type;\n this.input = input;\n this.beginIndex = beginIndex;\n this.endIndex = endIndex;\n }\n return _createClass(Slice, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var input = this.input.evaluate(ctx);\n var beginIndex = this.beginIndex.evaluate(ctx);\n if (!isValidNativeType(input, ['string', 'array'])) {\n throw new RuntimeError(\"Expected first argument to be of type array or string, but found \".concat(toString(typeOf(input)), \" instead.\"));\n }\n if (this.endIndex) {\n var endIndex = this.endIndex.evaluate(ctx);\n return input.slice(beginIndex, endIndex);\n }\n return input.slice(beginIndex);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n fn(this.beginIndex);\n if (this.endIndex) {\n fn(this.endIndex);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n if (this.endIndex != null && this.endIndex !== undefined) {\n var endIndex = this.endIndex.serialize();\n return ['slice', this.input.serialize(), this.beginIndex.serialize(), endIndex];\n }\n return ['slice', this.input.serialize(), this.beginIndex.serialize()];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length <= 2 || args.length >= 5) {\n return context.error(\"Expected 3 or 4 arguments, but found \".concat(args.length - 1, \" instead.\"));\n }\n var input = context.parse(args[1], 1, ValueType);\n var beginIndex = context.parse(args[2], 2, NumberType);\n if (!input || !beginIndex) return null;\n if (!isValidType(input.type, [array(ValueType), StringType, ValueType])) {\n return context.error(\"Expected first argument to be of type array or string, but found \".concat(toString(input.type), \" instead\"));\n }\n if (args.length === 4) {\n var endIndex = context.parse(args[3], 3, NumberType);\n if (!endIndex) return null;\n return new Slice(input.type, input, beginIndex, endIndex);\n } else {\n return new Slice(input.type, input, beginIndex);\n }\n }\n }]);\n}();\nfunction isComparableType(op, type) {\n if (op === '==' || op === '!=') {\n return type.kind === 'boolean' || type.kind === 'string' || type.kind === 'number' || type.kind === 'null' || type.kind === 'value';\n } else {\n return type.kind === 'string' || type.kind === 'number' || type.kind === 'value';\n }\n}\nfunction eq(ctx, a, b) {\n return a === b;\n}\nfunction neq(ctx, a, b) {\n return a !== b;\n}\nfunction lt(ctx, a, b) {\n return a < b;\n}\nfunction gt(ctx, a, b) {\n return a > b;\n}\nfunction lteq(ctx, a, b) {\n return a <= b;\n}\nfunction gteq(ctx, a, b) {\n return a >= b;\n}\nfunction eqCollate(ctx, a, b, c) {\n return c.compare(a, b) === 0;\n}\nfunction neqCollate(ctx, a, b, c) {\n return !eqCollate(ctx, a, b, c);\n}\nfunction ltCollate(ctx, a, b, c) {\n return c.compare(a, b) < 0;\n}\nfunction gtCollate(ctx, a, b, c) {\n return c.compare(a, b) > 0;\n}\nfunction lteqCollate(ctx, a, b, c) {\n return c.compare(a, b) <= 0;\n}\nfunction gteqCollate(ctx, a, b, c) {\n return c.compare(a, b) >= 0;\n}\nfunction makeComparison(op, compareBasic, compareWithCollator) {\n var isOrderComparison = op !== '==' && op !== '!=';\n return /*#__PURE__*/function () {\n function Comparison(lhs, rhs, collator) {\n _classCallCheck(this, Comparison);\n this.type = BooleanType;\n this.lhs = lhs;\n this.rhs = rhs;\n this.collator = collator;\n this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value';\n }\n return _createClass(Comparison, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var lhs = this.lhs.evaluate(ctx);\n var rhs = this.rhs.evaluate(ctx);\n if (isOrderComparison && this.hasUntypedArgument) {\n var _lt = typeOf(lhs);\n var rt = typeOf(rhs);\n if (_lt.kind !== rt.kind || !(_lt.kind === 'string' || _lt.kind === 'number')) {\n throw new RuntimeError(\"Expected arguments for \\\"\".concat(op, \"\\\" to be (string, string) or (number, number), but found (\").concat(_lt.kind, \", \").concat(rt.kind, \") instead.\"));\n }\n }\n if (this.collator && !isOrderComparison && this.hasUntypedArgument) {\n var _lt2 = typeOf(lhs);\n var _rt = typeOf(rhs);\n if (_lt2.kind !== 'string' || _rt.kind !== 'string') {\n return compareBasic(ctx, lhs, rhs);\n }\n }\n return this.collator ? compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : compareBasic(ctx, lhs, rhs);\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.lhs);\n fn(this.rhs);\n if (this.collator) {\n fn(this.collator);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return true;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = [op];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3 && args.length !== 4) return context.error(\"Expected two or three arguments.\");\n var op = args[0];\n var lhs = context.parse(args[1], 1, ValueType);\n if (!lhs) return null;\n if (!isComparableType(op, lhs.type)) {\n return context.concat(1).error(\"\\\"\".concat(op, \"\\\" comparisons are not supported for type '\").concat(toString(lhs.type), \"'.\"));\n }\n var rhs = context.parse(args[2], 2, ValueType);\n if (!rhs) return null;\n if (!isComparableType(op, rhs.type)) {\n return context.concat(2).error(\"\\\"\".concat(op, \"\\\" comparisons are not supported for type '\").concat(toString(rhs.type), \"'.\"));\n }\n if (lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') {\n return context.error(\"Cannot compare types '\".concat(toString(lhs.type), \"' and '\").concat(toString(rhs.type), \"'.\"));\n }\n if (isOrderComparison) {\n if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') {\n lhs = new Assertion(rhs.type, [lhs]);\n } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') {\n rhs = new Assertion(lhs.type, [rhs]);\n }\n }\n var collator = null;\n if (args.length === 4) {\n if (lhs.type.kind !== 'string' && rhs.type.kind !== 'string' && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') {\n return context.error(\"Cannot use collator to compare non-string types.\");\n }\n collator = context.parse(args[3], 3, CollatorType);\n if (!collator) return null;\n }\n return new Comparison(lhs, rhs, collator);\n }\n }]);\n }();\n}\nvar Equals = makeComparison('==', eq, eqCollate);\nvar NotEquals = makeComparison('!=', neq, neqCollate);\nvar LessThan = makeComparison('<', lt, ltCollate);\nvar GreaterThan = makeComparison('>', gt, gtCollate);\nvar LessThanOrEqual = makeComparison('<=', lteq, lteqCollate);\nvar GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate);\nvar NumberFormat = /*#__PURE__*/function () {\n function NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits) {\n _classCallCheck(this, NumberFormat);\n this.type = StringType;\n this.number = number;\n this.locale = locale;\n this.currency = currency;\n this.minFractionDigits = minFractionDigits;\n this.maxFractionDigits = maxFractionDigits;\n }\n return _createClass(NumberFormat, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], {\n style: this.currency ? 'currency' : 'decimal',\n currency: this.currency ? this.currency.evaluate(ctx) : undefined,\n minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined,\n maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined\n }).format(this.number.evaluate(ctx));\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.number);\n if (this.locale) {\n fn(this.locale);\n }\n if (this.currency) {\n fn(this.currency);\n }\n if (this.minFractionDigits) {\n fn(this.minFractionDigits);\n }\n if (this.maxFractionDigits) {\n fn(this.maxFractionDigits);\n }\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var options = {};\n if (this.locale) {\n options['locale'] = this.locale.serialize();\n }\n if (this.currency) {\n options['currency'] = this.currency.serialize();\n }\n if (this.minFractionDigits) {\n options['min-fraction-digits'] = this.minFractionDigits.serialize();\n }\n if (this.maxFractionDigits) {\n options['max-fraction-digits'] = this.maxFractionDigits.serialize();\n }\n return ['number-format', this.number.serialize(), options];\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 3) return context.error(\"Expected two arguments.\");\n var number = context.parse(args[1], 1, NumberType);\n if (!number) return null;\n var options = args[2];\n if (_typeof(options) !== 'object' || Array.isArray(options)) return context.error(\"NumberFormat options argument must be an object.\");\n var locale = null;\n if (options['locale']) {\n locale = context.parse(options['locale'], 1, StringType);\n if (!locale) return null;\n }\n var currency = null;\n if (options['currency']) {\n currency = context.parse(options['currency'], 1, StringType);\n if (!currency) return null;\n }\n var minFractionDigits = null;\n if (options['min-fraction-digits']) {\n minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType);\n if (!minFractionDigits) return null;\n }\n var maxFractionDigits = null;\n if (options['max-fraction-digits']) {\n maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType);\n if (!maxFractionDigits) return null;\n }\n return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits);\n }\n }]);\n}();\nvar Length = /*#__PURE__*/function () {\n function Length(input) {\n _classCallCheck(this, Length);\n this.type = NumberType;\n this.input = input;\n }\n return _createClass(Length, [{\n key: \"evaluate\",\n value: function evaluate(ctx) {\n var input = this.input.evaluate(ctx);\n if (typeof input === 'string') {\n return input.length;\n } else if (Array.isArray(input)) {\n return input.length;\n } else {\n throw new RuntimeError(\"Expected value to be of type string or array, but found \".concat(toString(typeOf(input)), \" instead.\"));\n }\n }\n }, {\n key: \"eachChild\",\n value: function eachChild(fn) {\n fn(this.input);\n }\n }, {\n key: \"outputDefined\",\n value: function outputDefined() {\n return false;\n }\n }, {\n key: \"serialize\",\n value: function serialize() {\n var serialized = ['length'];\n this.eachChild(function (child) {\n serialized.push(child.serialize());\n });\n return serialized;\n }\n }], [{\n key: \"parse\",\n value: function parse(args, context) {\n if (args.length !== 2) return context.error(\"Expected 1 argument, but found \".concat(args.length - 1, \" instead.\"));\n var input = context.parse(args[1], 1);\n if (!input) return null;\n if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') return context.error(\"Expected argument of type string or array, but found \".concat(toString(input.type), \" instead.\"));\n return new Length(input);\n }\n }]);\n}();\nvar expressions = {\n '==': Equals,\n '!=': NotEquals,\n '>': GreaterThan,\n '<': LessThan,\n '>=': GreaterThanOrEqual,\n '<=': LessThanOrEqual,\n 'array': Assertion,\n 'at': At,\n 'boolean': Assertion,\n 'case': Case,\n 'coalesce': Coalesce,\n 'collator': CollatorExpression,\n 'format': FormatExpression,\n 'image': ImageExpression,\n 'in': In,\n 'index-of': IndexOf,\n 'interpolate': Interpolate,\n 'interpolate-hcl': Interpolate,\n 'interpolate-lab': Interpolate,\n 'length': Length,\n 'let': Let,\n 'literal': Literal,\n 'match': Match,\n 'number': Assertion,\n 'number-format': NumberFormat,\n 'object': Assertion,\n 'slice': Slice,\n 'step': Step,\n 'string': Assertion,\n 'to-boolean': Coercion,\n 'to-color': Coercion,\n 'to-number': Coercion,\n 'to-string': Coercion,\n 'var': Var,\n 'within': Within\n};\nfunction rgba(ctx, _ref7) {\n var _ref8 = _slicedToArray(_ref7, 4),\n r = _ref8[0],\n g = _ref8[1],\n b = _ref8[2],\n a = _ref8[3];\n r = r.evaluate(ctx);\n g = g.evaluate(ctx);\n b = b.evaluate(ctx);\n var alpha = a ? a.evaluate(ctx) : 1;\n var error = validateRGBA(r, g, b, alpha);\n if (error) throw new RuntimeError(error);\n return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha);\n}\nfunction has(key, obj) {\n return key in obj;\n}\nfunction get(key, obj) {\n var v = obj[key];\n return typeof v === 'undefined' ? null : v;\n}\nfunction binarySearch(v, a, i, j) {\n while (i <= j) {\n var m = i + j >> 1;\n if (a[m] === v) return true;\n if (a[m] > v) j = m - 1;else i = m + 1;\n }\n return false;\n}\nfunction varargs(type) {\n return {\n type: type\n };\n}\nCompoundExpression.register(expressions, {\n 'error': [ErrorType, [StringType], function (ctx, _ref9) {\n var _ref10 = _slicedToArray(_ref9, 1),\n v = _ref10[0];\n throw new RuntimeError(v.evaluate(ctx));\n }],\n 'typeof': [StringType, [ValueType], function (ctx, _ref11) {\n var _ref12 = _slicedToArray(_ref11, 1),\n v = _ref12[0];\n return toString(typeOf(v.evaluate(ctx)));\n }],\n 'to-rgba': [array(NumberType, 4), [ColorType], function (ctx, _ref13) {\n var _ref14 = _slicedToArray(_ref13, 1),\n v = _ref14[0];\n return v.evaluate(ctx).toArray();\n }],\n 'rgb': [ColorType, [NumberType, NumberType, NumberType], rgba],\n 'rgba': [ColorType, [NumberType, NumberType, NumberType, NumberType], rgba],\n 'has': {\n type: BooleanType,\n overloads: [[[StringType], function (ctx, _ref15) {\n var _ref16 = _slicedToArray(_ref15, 1),\n key = _ref16[0];\n return has(key.evaluate(ctx), ctx.properties());\n }], [[StringType, ObjectType], function (ctx, _ref17) {\n var _ref18 = _slicedToArray(_ref17, 2),\n key = _ref18[0],\n obj = _ref18[1];\n return has(key.evaluate(ctx), obj.evaluate(ctx));\n }]]\n },\n 'get': {\n type: ValueType,\n overloads: [[[StringType], function (ctx, _ref19) {\n var _ref20 = _slicedToArray(_ref19, 1),\n key = _ref20[0];\n return get(key.evaluate(ctx), ctx.properties());\n }], [[StringType, ObjectType], function (ctx, _ref21) {\n var _ref22 = _slicedToArray(_ref21, 2),\n key = _ref22[0],\n obj = _ref22[1];\n return get(key.evaluate(ctx), obj.evaluate(ctx));\n }]]\n },\n 'feature-state': [ValueType, [StringType], function (ctx, _ref23) {\n var _ref24 = _slicedToArray(_ref23, 1),\n key = _ref24[0];\n return get(key.evaluate(ctx), ctx.featureState || {});\n }],\n 'properties': [ObjectType, [], function (ctx) {\n return ctx.properties();\n }],\n 'geometry-type': [StringType, [], function (ctx) {\n return ctx.geometryType();\n }],\n 'id': [ValueType, [], function (ctx) {\n return ctx.id();\n }],\n 'zoom': [NumberType, [], function (ctx) {\n return ctx.globals.zoom;\n }],\n 'heatmap-density': [NumberType, [], function (ctx) {\n return ctx.globals.heatmapDensity || 0;\n }],\n 'line-progress': [NumberType, [], function (ctx) {\n return ctx.globals.lineProgress || 0;\n }],\n 'sky-radial-progress': [NumberType, [], function (ctx) {\n return ctx.globals.skyRadialProgress || 0;\n }],\n 'accumulated': [ValueType, [], function (ctx) {\n return ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated;\n }],\n '+': [NumberType, varargs(NumberType), function (ctx, args) {\n var result = 0;\n var _iterator34 = _createForOfIteratorHelper(args),\n _step34;\n try {\n for (_iterator34.s(); !(_step34 = _iterator34.n()).done;) {\n var arg = _step34.value;\n result += arg.evaluate(ctx);\n }\n } catch (err) {\n _iterator34.e(err);\n } finally {\n _iterator34.f();\n }\n return result;\n }],\n '*': [NumberType, varargs(NumberType), function (ctx, args) {\n var result = 1;\n var _iterator35 = _createForOfIteratorHelper(args),\n _step35;\n try {\n for (_iterator35.s(); !(_step35 = _iterator35.n()).done;) {\n var arg = _step35.value;\n result *= arg.evaluate(ctx);\n }\n } catch (err) {\n _iterator35.e(err);\n } finally {\n _iterator35.f();\n }\n return result;\n }],\n '-': {\n type: NumberType,\n overloads: [[[NumberType, NumberType], function (ctx, _ref25) {\n var _ref26 = _slicedToArray(_ref25, 2),\n a = _ref26[0],\n b = _ref26[1];\n return a.evaluate(ctx) - b.evaluate(ctx);\n }], [[NumberType], function (ctx, _ref27) {\n var _ref28 = _slicedToArray(_ref27, 1),\n a = _ref28[0];\n return -a.evaluate(ctx);\n }]]\n },\n '/': [NumberType, [NumberType, NumberType], function (ctx, _ref29) {\n var _ref30 = _slicedToArray(_ref29, 2),\n a = _ref30[0],\n b = _ref30[1];\n return a.evaluate(ctx) / b.evaluate(ctx);\n }],\n '%': [NumberType, [NumberType, NumberType], function (ctx, _ref31) {\n var _ref32 = _slicedToArray(_ref31, 2),\n a = _ref32[0],\n b = _ref32[1];\n return a.evaluate(ctx) % b.evaluate(ctx);\n }],\n 'ln2': [NumberType, [], function () {\n return Math.LN2;\n }],\n 'pi': [NumberType, [], function () {\n return Math.PI;\n }],\n 'e': [NumberType, [], function () {\n return Math.E;\n }],\n '^': [NumberType, [NumberType, NumberType], function (ctx, _ref33) {\n var _ref34 = _slicedToArray(_ref33, 2),\n b = _ref34[0],\n e = _ref34[1];\n return Math.pow(b.evaluate(ctx), e.evaluate(ctx));\n }],\n 'sqrt': [NumberType, [NumberType], function (ctx, _ref35) {\n var _ref36 = _slicedToArray(_ref35, 1),\n x = _ref36[0];\n return Math.sqrt(x.evaluate(ctx));\n }],\n 'log10': [NumberType, [NumberType], function (ctx, _ref37) {\n var _ref38 = _slicedToArray(_ref37, 1),\n n = _ref38[0];\n return Math.log(n.evaluate(ctx)) / Math.LN10;\n }],\n 'ln': [NumberType, [NumberType], function (ctx, _ref39) {\n var _ref40 = _slicedToArray(_ref39, 1),\n n = _ref40[0];\n return Math.log(n.evaluate(ctx));\n }],\n 'log2': [NumberType, [NumberType], function (ctx, _ref41) {\n var _ref42 = _slicedToArray(_ref41, 1),\n n = _ref42[0];\n return Math.log(n.evaluate(ctx)) / Math.LN2;\n }],\n 'sin': [NumberType, [NumberType], function (ctx, _ref43) {\n var _ref44 = _slicedToArray(_ref43, 1),\n n = _ref44[0];\n return Math.sin(n.evaluate(ctx));\n }],\n 'cos': [NumberType, [NumberType], function (ctx, _ref45) {\n var _ref46 = _slicedToArray(_ref45, 1),\n n = _ref46[0];\n return Math.cos(n.evaluate(ctx));\n }],\n 'tan': [NumberType, [NumberType], function (ctx, _ref47) {\n var _ref48 = _slicedToArray(_ref47, 1),\n n = _ref48[0];\n return Math.tan(n.evaluate(ctx));\n }],\n 'asin': [NumberType, [NumberType], function (ctx, _ref49) {\n var _ref50 = _slicedToArray(_ref49, 1),\n n = _ref50[0];\n return Math.asin(n.evaluate(ctx));\n }],\n 'acos': [NumberType, [NumberType], function (ctx, _ref51) {\n var _ref52 = _slicedToArray(_ref51, 1),\n n = _ref52[0];\n return Math.acos(n.evaluate(ctx));\n }],\n 'atan': [NumberType, [NumberType], function (ctx, _ref53) {\n var _ref54 = _slicedToArray(_ref53, 1),\n n = _ref54[0];\n return Math.atan(n.evaluate(ctx));\n }],\n 'min': [NumberType, varargs(NumberType), function (ctx, args) {\n return Math.min.apply(Math, _toConsumableArray(args.map(function (arg) {\n return arg.evaluate(ctx);\n })));\n }],\n 'max': [NumberType, varargs(NumberType), function (ctx, args) {\n return Math.max.apply(Math, _toConsumableArray(args.map(function (arg) {\n return arg.evaluate(ctx);\n })));\n }],\n 'abs': [NumberType, [NumberType], function (ctx, _ref55) {\n var _ref56 = _slicedToArray(_ref55, 1),\n n = _ref56[0];\n return Math.abs(n.evaluate(ctx));\n }],\n 'round': [NumberType, [NumberType], function (ctx, _ref57) {\n var _ref58 = _slicedToArray(_ref57, 1),\n n = _ref58[0];\n var v = n.evaluate(ctx);\n return v < 0 ? -Math.round(-v) : Math.round(v);\n }],\n 'floor': [NumberType, [NumberType], function (ctx, _ref59) {\n var _ref60 = _slicedToArray(_ref59, 1),\n n = _ref60[0];\n return Math.floor(n.evaluate(ctx));\n }],\n 'ceil': [NumberType, [NumberType], function (ctx, _ref61) {\n var _ref62 = _slicedToArray(_ref61, 1),\n n = _ref62[0];\n return Math.ceil(n.evaluate(ctx));\n }],\n 'filter-==': [BooleanType, [StringType, ValueType], function (ctx, _ref63) {\n var _ref64 = _slicedToArray(_ref63, 2),\n k = _ref64[0],\n v = _ref64[1];\n return ctx.properties()[k.value] === v.value;\n }],\n 'filter-id-==': [BooleanType, [ValueType], function (ctx, _ref65) {\n var _ref66 = _slicedToArray(_ref65, 1),\n v = _ref66[0];\n return ctx.id() === v.value;\n }],\n 'filter-type-==': [BooleanType, [StringType], function (ctx, _ref67) {\n var _ref68 = _slicedToArray(_ref67, 1),\n v = _ref68[0];\n return ctx.geometryType() === v.value;\n }],\n 'filter-<': [BooleanType, [StringType, ValueType], function (ctx, _ref69) {\n var _ref70 = _slicedToArray(_ref69, 2),\n k = _ref70[0],\n v = _ref70[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a < b;\n }],\n 'filter-id-<': [BooleanType, [ValueType], function (ctx, _ref71) {\n var _ref72 = _slicedToArray(_ref71, 1),\n v = _ref72[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a < b;\n }],\n 'filter->': [BooleanType, [StringType, ValueType], function (ctx, _ref73) {\n var _ref74 = _slicedToArray(_ref73, 2),\n k = _ref74[0],\n v = _ref74[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a > b;\n }],\n 'filter-id->': [BooleanType, [ValueType], function (ctx, _ref75) {\n var _ref76 = _slicedToArray(_ref75, 1),\n v = _ref76[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a > b;\n }],\n 'filter-<=': [BooleanType, [StringType, ValueType], function (ctx, _ref77) {\n var _ref78 = _slicedToArray(_ref77, 2),\n k = _ref78[0],\n v = _ref78[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a <= b;\n }],\n 'filter-id-<=': [BooleanType, [ValueType], function (ctx, _ref79) {\n var _ref80 = _slicedToArray(_ref79, 1),\n v = _ref80[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a <= b;\n }],\n 'filter->=': [BooleanType, [StringType, ValueType], function (ctx, _ref81) {\n var _ref82 = _slicedToArray(_ref81, 2),\n k = _ref82[0],\n v = _ref82[1];\n var a = ctx.properties()[k.value];\n var b = v.value;\n return _typeof(a) === _typeof(b) && a >= b;\n }],\n 'filter-id->=': [BooleanType, [ValueType], function (ctx, _ref83) {\n var _ref84 = _slicedToArray(_ref83, 1),\n v = _ref84[0];\n var a = ctx.id();\n var b = v.value;\n return _typeof(a) === _typeof(b) && a >= b;\n }],\n 'filter-has': [BooleanType, [ValueType], function (ctx, _ref85) {\n var _ref86 = _slicedToArray(_ref85, 1),\n k = _ref86[0];\n return k.value in ctx.properties();\n }],\n 'filter-has-id': [BooleanType, [], function (ctx) {\n return ctx.id() !== null && ctx.id() !== undefined;\n }],\n 'filter-type-in': [BooleanType, [array(StringType)], function (ctx, _ref87) {\n var _ref88 = _slicedToArray(_ref87, 1),\n v = _ref88[0];\n return v.value.indexOf(ctx.geometryType()) >= 0;\n }],\n 'filter-id-in': [BooleanType, [array(ValueType)], function (ctx, _ref89) {\n var _ref90 = _slicedToArray(_ref89, 1),\n v = _ref90[0];\n return v.value.indexOf(ctx.id()) >= 0;\n }],\n 'filter-in-small': [BooleanType, [StringType, array(ValueType)], function (ctx, _ref91) {\n var _ref92 = _slicedToArray(_ref91, 2),\n k = _ref92[0],\n v = _ref92[1];\n return v.value.indexOf(ctx.properties()[k.value]) >= 0;\n }],\n 'filter-in-large': [BooleanType, [StringType, array(ValueType)], function (ctx, _ref93) {\n var _ref94 = _slicedToArray(_ref93, 2),\n k = _ref94[0],\n v = _ref94[1];\n return binarySearch(ctx.properties()[k.value], v.value, 0, v.value.length - 1);\n }],\n 'all': {\n type: BooleanType,\n overloads: [[[BooleanType, BooleanType], function (ctx, _ref95) {\n var _ref96 = _slicedToArray(_ref95, 2),\n a = _ref96[0],\n b = _ref96[1];\n return a.evaluate(ctx) && b.evaluate(ctx);\n }], [varargs(BooleanType), function (ctx, args) {\n var _iterator36 = _createForOfIteratorHelper(args),\n _step36;\n try {\n for (_iterator36.s(); !(_step36 = _iterator36.n()).done;) {\n var arg = _step36.value;\n if (!arg.evaluate(ctx)) return false;\n }\n } catch (err) {\n _iterator36.e(err);\n } finally {\n _iterator36.f();\n }\n return true;\n }]]\n },\n 'any': {\n type: BooleanType,\n overloads: [[[BooleanType, BooleanType], function (ctx, _ref97) {\n var _ref98 = _slicedToArray(_ref97, 2),\n a = _ref98[0],\n b = _ref98[1];\n return a.evaluate(ctx) || b.evaluate(ctx);\n }], [varargs(BooleanType), function (ctx, args) {\n var _iterator37 = _createForOfIteratorHelper(args),\n _step37;\n try {\n for (_iterator37.s(); !(_step37 = _iterator37.n()).done;) {\n var arg = _step37.value;\n if (arg.evaluate(ctx)) return true;\n }\n } catch (err) {\n _iterator37.e(err);\n } finally {\n _iterator37.f();\n }\n return false;\n }]]\n },\n '!': [BooleanType, [BooleanType], function (ctx, _ref99) {\n var _ref100 = _slicedToArray(_ref99, 1),\n b = _ref100[0];\n return !b.evaluate(ctx);\n }],\n 'is-supported-script': [BooleanType, [StringType], function (ctx, _ref101) {\n var _ref102 = _slicedToArray(_ref101, 1),\n s = _ref102[0];\n var isSupportedScript = ctx.globals && ctx.globals.isSupportedScript;\n if (isSupportedScript) {\n return isSupportedScript(s.evaluate(ctx));\n }\n return true;\n }],\n 'upcase': [StringType, [StringType], function (ctx, _ref103) {\n var _ref104 = _slicedToArray(_ref103, 1),\n s = _ref104[0];\n return s.evaluate(ctx).toUpperCase();\n }],\n 'downcase': [StringType, [StringType], function (ctx, _ref105) {\n var _ref106 = _slicedToArray(_ref105, 1),\n s = _ref106[0];\n return s.evaluate(ctx).toLowerCase();\n }],\n 'concat': [StringType, varargs(ValueType), function (ctx, args) {\n return args.map(function (arg) {\n return toString$1(arg.evaluate(ctx));\n }).join('');\n }],\n 'resolved-locale': [StringType, [CollatorType], function (ctx, _ref107) {\n var _ref108 = _slicedToArray(_ref107, 1),\n collator = _ref108[0];\n return collator.evaluate(ctx).resolvedLocale();\n }]\n});\nfunction success(value) {\n return {\n result: 'success',\n value: value\n };\n}\nfunction error(value) {\n return {\n result: 'error',\n value: value\n };\n}\nfunction supportsPropertyExpression(spec) {\n return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven';\n}\nfunction supportsZoomExpression(spec) {\n return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1;\n}\nfunction supportsInterpolation(spec) {\n return !!spec.expression && spec.expression.interpolated;\n}\nfunction getType(val) {\n if (val instanceof Number) {\n return 'number';\n } else if (val instanceof String) {\n return 'string';\n } else if (val instanceof Boolean) {\n return 'boolean';\n } else if (Array.isArray(val)) {\n return 'array';\n } else if (val === null) {\n return 'null';\n } else {\n return _typeof(val);\n }\n}\nfunction isFunction$1(value) {\n return _typeof(value) === 'object' && value !== null && !Array.isArray(value);\n}\nfunction identityFunction(x) {\n return x;\n}\nfunction createFunction(parameters, propertySpec) {\n var isColor = propertySpec.type === 'color';\n var zoomAndFeatureDependent = parameters.stops && _typeof(parameters.stops[0][0]) === 'object';\n var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n var zoomDependent = zoomAndFeatureDependent || !featureDependent;\n var type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');\n if (isColor) {\n parameters = extend({}, parameters);\n if (parameters.stops) {\n parameters.stops = parameters.stops.map(function (stop) {\n return [stop[0], Color.parse(stop[1])];\n });\n }\n if (parameters[\"default\"]) {\n parameters[\"default\"] = Color.parse(parameters[\"default\"]);\n } else {\n parameters[\"default\"] = Color.parse(propertySpec[\"default\"]);\n }\n }\n if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) {\n throw new Error(\"Unknown color space: \".concat(parameters.colorSpace));\n }\n var innerFun;\n var hashedStops;\n var categoricalKeyType;\n if (type === 'exponential') {\n innerFun = evaluateExponentialFunction;\n } else if (type === 'interval') {\n innerFun = evaluateIntervalFunction;\n } else if (type === 'categorical') {\n innerFun = evaluateCategoricalFunction;\n hashedStops = Object.create(null);\n var _iterator38 = _createForOfIteratorHelper(parameters.stops),\n _step38;\n try {\n for (_iterator38.s(); !(_step38 = _iterator38.n()).done;) {\n var stop = _step38.value;\n hashedStops[stop[0]] = stop[1];\n }\n } catch (err) {\n _iterator38.e(err);\n } finally {\n _iterator38.f();\n }\n categoricalKeyType = _typeof(parameters.stops[0][0]);\n } else if (type === 'identity') {\n innerFun = evaluateIdentityFunction;\n } else {\n throw new Error(\"Unknown function type \\\"\".concat(type, \"\\\"\"));\n }\n if (zoomAndFeatureDependent) {\n var featureFunctions = {};\n var zoomStops = [];\n for (var s = 0; s < parameters.stops.length; s++) {\n var _stop = parameters.stops[s];\n var zoom = _stop[0].zoom;\n if (featureFunctions[zoom] === undefined) {\n featureFunctions[zoom] = {\n zoom: zoom,\n type: parameters.type,\n property: parameters.property,\n \"default\": parameters[\"default\"],\n stops: []\n };\n zoomStops.push(zoom);\n }\n featureFunctions[zoom].stops.push([_stop[0].value, _stop[1]]);\n }\n var featureFunctionStops = [];\n for (var _i8 = 0, _zoomStops = zoomStops; _i8 < _zoomStops.length; _i8++) {\n var z = _zoomStops[_i8];\n featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);\n }\n var interpolationType = {\n name: 'linear'\n };\n return {\n kind: 'composite',\n interpolationType: interpolationType,\n interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),\n zoomStops: featureFunctionStops.map(function (s) {\n return s[0];\n }),\n evaluate: function evaluate(_ref109, properties) {\n var zoom = _ref109.zoom;\n return evaluateExponentialFunction({\n stops: featureFunctionStops,\n base: parameters.base\n }, propertySpec, zoom).evaluate(zoom, properties);\n }\n };\n } else if (zoomDependent) {\n var _interpolationType = type === 'exponential' ? {\n name: 'exponential',\n base: parameters.base !== undefined ? parameters.base : 1\n } : null;\n return {\n kind: 'camera',\n interpolationType: _interpolationType,\n interpolationFactor: Interpolate.interpolationFactor.bind(undefined, _interpolationType),\n zoomStops: parameters.stops.map(function (s) {\n return s[0];\n }),\n evaluate: function evaluate(_ref110) {\n var zoom = _ref110.zoom;\n return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType);\n }\n };\n } else {\n return {\n kind: 'source',\n evaluate: function evaluate(_, feature) {\n var value = feature && feature.properties ? feature.properties[parameters.property] : undefined;\n if (value === undefined) {\n return coalesce(parameters[\"default\"], propertySpec[\"default\"]);\n }\n return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);\n }\n };\n }\n}\nfunction coalesce(a, b, c) {\n if (a !== undefined) return a;\n if (b !== undefined) return b;\n if (c !== undefined) return c;\n}\nfunction evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {\n var evaluated = _typeof(input) === keyType ? hashedStops[input] : undefined;\n return coalesce(evaluated, parameters[\"default\"], propertySpec[\"default\"]);\n}\nfunction evaluateIntervalFunction(parameters, propertySpec, input) {\n if (getType(input) !== 'number') return coalesce(parameters[\"default\"], propertySpec[\"default\"]);\n var n = parameters.stops.length;\n if (n === 1) return parameters.stops[0][1];\n if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) {\n return stop[0];\n }), input);\n return parameters.stops[index][1];\n}\nfunction evaluateExponentialFunction(parameters, propertySpec, input) {\n var base = parameters.base !== undefined ? parameters.base : 1;\n if (getType(input) !== 'number') return coalesce(parameters[\"default\"], propertySpec[\"default\"]);\n var n = parameters.stops.length;\n if (n === 1) return parameters.stops[0][1];\n if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) {\n return stop[0];\n }), input);\n var t = interpolationFactor(input, base, parameters.stops[index][0], parameters.stops[index + 1][0]);\n var outputLower = parameters.stops[index][1];\n var outputUpper = parameters.stops[index + 1][1];\n var interp = interpolate[propertySpec.type] || identityFunction;\n if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {\n var colorspace = colorSpaces[parameters.colorSpace];\n interp = function interp(a, b) {\n return colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t));\n };\n }\n if (typeof outputLower.evaluate === 'function') {\n return {\n evaluate: function evaluate() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key5 = 0; _key5 < _len3; _key5++) {\n args[_key5] = arguments[_key5];\n }\n var evaluatedLower = outputLower.evaluate.apply(undefined, args);\n var evaluatedUpper = outputUpper.evaluate.apply(undefined, args);\n if (evaluatedLower === undefined || evaluatedUpper === undefined) {\n return undefined;\n }\n return interp(evaluatedLower, evaluatedUpper, t);\n }\n };\n }\n return interp(outputLower, outputUpper, t);\n}\nfunction evaluateIdentityFunction(parameters, propertySpec, input) {\n if (propertySpec.type === 'color') {\n input = Color.parse(input);\n } else if (propertySpec.type === 'formatted') {\n input = Formatted.fromString(input.toString());\n } else if (propertySpec.type === 'resolvedImage') {\n input = ResolvedImage.fromString(input.toString());\n } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) {\n input = undefined;\n }\n return coalesce(input, parameters[\"default\"], propertySpec[\"default\"]);\n}\nfunction interpolationFactor(input, base, lowerValue, upperValue) {\n var difference = upperValue - lowerValue;\n var progress = input - lowerValue;\n if (difference === 0) {\n return 0;\n } else if (base === 1) {\n return progress / difference;\n } else {\n return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n }\n}\nvar StyleExpression = /*#__PURE__*/function () {\n function StyleExpression(expression, propertySpec) {\n _classCallCheck(this, StyleExpression);\n this.expression = expression;\n this._warningHistory = {};\n this._evaluator = new EvaluationContext();\n this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;\n this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;\n }\n return _createClass(StyleExpression, [{\n key: \"evaluateWithoutErrorHandling\",\n value: function evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {\n this._evaluator.globals = globals;\n this._evaluator.feature = feature;\n this._evaluator.featureState = featureState;\n this._evaluator.canonical = canonical;\n this._evaluator.availableImages = availableImages || null;\n this._evaluator.formattedSection = formattedSection;\n return this.expression.evaluate(this._evaluator);\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {\n this._evaluator.globals = globals;\n this._evaluator.feature = feature || null;\n this._evaluator.featureState = featureState || null;\n this._evaluator.canonical = canonical;\n this._evaluator.availableImages = availableImages || null;\n this._evaluator.formattedSection = formattedSection || null;\n try {\n var val = this.expression.evaluate(this._evaluator);\n if (val === null || val === undefined || typeof val === 'number' && val !== val) {\n return this._defaultValue;\n }\n if (this._enumValues && !(val in this._enumValues)) {\n throw new RuntimeError(\"Expected value to be one of \".concat(Object.keys(this._enumValues).map(function (v) {\n return JSON.stringify(v);\n }).join(', '), \", but found \").concat(JSON.stringify(val), \" instead.\"));\n }\n return val;\n } catch (e) {\n if (!this._warningHistory[e.message]) {\n this._warningHistory[e.message] = true;\n if (typeof console !== 'undefined') {\n console.warn(e.message);\n }\n }\n return this._defaultValue;\n }\n }\n }]);\n}();\nfunction isExpression(expression) {\n return Array.isArray(expression) && expression.length > 0 && typeof expression[0] === 'string' && expression[0] in expressions;\n}\nfunction createExpression(expression, propertySpec) {\n var parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined);\n var parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? {\n typeAnnotation: 'coerce'\n } : undefined);\n if (!parsed) {\n return error(parser.errors);\n }\n return success(new StyleExpression(parsed, propertySpec));\n}\nvar ZoomConstantExpression = /*#__PURE__*/function () {\n function ZoomConstantExpression(kind, expression) {\n _classCallCheck(this, ZoomConstantExpression);\n this.kind = kind;\n this._styleExpression = expression;\n this.isStateDependent = kind !== 'constant' && !isStateConstant(expression.expression);\n }\n return _createClass(ZoomConstantExpression, [{\n key: \"evaluateWithoutErrorHandling\",\n value: function evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }]);\n}();\nvar ZoomDependentExpression = /*#__PURE__*/function () {\n function ZoomDependentExpression(kind, expression, zoomStops, interpolationType) {\n _classCallCheck(this, ZoomDependentExpression);\n this.kind = kind;\n this.zoomStops = zoomStops;\n this._styleExpression = expression;\n this.isStateDependent = kind !== 'camera' && !isStateConstant(expression.expression);\n this.interpolationType = interpolationType;\n }\n return _createClass(ZoomDependentExpression, [{\n key: \"evaluateWithoutErrorHandling\",\n value: function evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {\n return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);\n }\n }, {\n key: \"interpolationFactor\",\n value: function interpolationFactor(input, lower, upper) {\n if (this.interpolationType) {\n return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper);\n } else {\n return 0;\n }\n }\n }]);\n}();\nfunction createPropertyExpression(expression, propertySpec) {\n expression = createExpression(expression, propertySpec);\n if (expression.result === 'error') {\n return expression;\n }\n var parsed = expression.value.expression;\n var isFeatureConstant$1 = isFeatureConstant(parsed);\n if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) {\n return error([new ParsingError('', 'data expressions not supported')]);\n }\n var isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']);\n if (!isZoomConstant && !supportsZoomExpression(propertySpec)) {\n return error([new ParsingError('', 'zoom expressions not supported')]);\n }\n var zoomCurve = findZoomCurve(parsed);\n if (!zoomCurve && !isZoomConstant) {\n return error([new ParsingError('', '\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.')]);\n } else if (zoomCurve instanceof ParsingError) {\n return error([zoomCurve]);\n } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) {\n return error([new ParsingError('', '\"interpolate\" expressions cannot be used with this property')]);\n }\n if (!zoomCurve) {\n return success(isFeatureConstant$1 ? new ZoomConstantExpression('constant', expression.value) : new ZoomConstantExpression('source', expression.value));\n }\n var interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined;\n return success(isFeatureConstant$1 ? new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) : new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType));\n}\nvar StylePropertyFunction = /*#__PURE__*/function () {\n function StylePropertyFunction(parameters, specification) {\n _classCallCheck(this, StylePropertyFunction);\n this._parameters = parameters;\n this._specification = specification;\n extend(this, createFunction(this._parameters, this._specification));\n }\n return _createClass(StylePropertyFunction, null, [{\n key: \"deserialize\",\n value: function deserialize(serialized) {\n return new StylePropertyFunction(serialized._parameters, serialized._specification);\n }\n }, {\n key: \"serialize\",\n value: function serialize(input) {\n return {\n _parameters: input._parameters,\n _specification: input._specification\n };\n }\n }]);\n}();\nfunction normalizePropertyExpression(value, specification) {\n if (isFunction$1(value)) {\n return new StylePropertyFunction(value, specification);\n } else if (isExpression(value)) {\n var _expression8 = createPropertyExpression(value, specification);\n if (_expression8.result === 'error') {\n throw new Error(_expression8.value.map(function (err) {\n return \"\".concat(err.key, \": \").concat(err.message);\n }).join(', '));\n }\n return _expression8.value;\n } else {\n var constant = value;\n if (typeof value === 'string' && specification.type === 'color') {\n constant = Color.parse(value);\n }\n return {\n kind: 'constant',\n evaluate: function evaluate() {\n return constant;\n }\n };\n }\n}\nfunction findZoomCurve(expression) {\n var result = null;\n if (expression instanceof Let) {\n result = findZoomCurve(expression.result);\n } else if (expression instanceof Coalesce) {\n var _iterator39 = _createForOfIteratorHelper(expression.args),\n _step39;\n try {\n for (_iterator39.s(); !(_step39 = _iterator39.n()).done;) {\n var arg = _step39.value;\n result = findZoomCurve(arg);\n if (result) {\n break;\n }\n }\n } catch (err) {\n _iterator39.e(err);\n } finally {\n _iterator39.f();\n }\n } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') {\n result = expression;\n }\n if (result instanceof ParsingError) {\n return result;\n }\n expression.eachChild(function (child) {\n var childResult = findZoomCurve(child);\n if (childResult instanceof ParsingError) {\n result = childResult;\n } else if (!result && childResult) {\n result = new ParsingError('', '\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.');\n } else if (result && childResult && result !== childResult) {\n result = new ParsingError('', 'Only one zoom-based \"step\" or \"interpolate\" subexpression may be used in an expression.');\n }\n });\n return result;\n}\nfunction getExpectedType(spec) {\n var types = {\n color: ColorType,\n string: StringType,\n number: NumberType,\n \"enum\": StringType,\n \"boolean\": BooleanType,\n formatted: FormattedType,\n resolvedImage: ResolvedImageType\n };\n if (spec.type === 'array') {\n return array(types[spec.value] || ValueType, spec.length);\n }\n return types[spec.type];\n}\nfunction getDefaultValue(spec) {\n if (spec.type === 'color' && isFunction$1(spec[\"default\"])) {\n return new Color(0, 0, 0, 0);\n } else if (spec.type === 'color') {\n return Color.parse(spec[\"default\"]) || null;\n } else if (spec[\"default\"] === undefined) {\n return null;\n } else {\n return spec[\"default\"];\n }\n}\nfunction convertLiteral(value) {\n return _typeof(value) === 'object' ? ['literal', value] : value;\n}\nfunction convertFunction(parameters, propertySpec) {\n var stops = parameters.stops;\n if (!stops) {\n return convertIdentityFunction(parameters, propertySpec);\n }\n var zoomAndFeatureDependent = stops && _typeof(stops[0][0]) === 'object';\n var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n var zoomDependent = zoomAndFeatureDependent || !featureDependent;\n stops = stops.map(function (stop) {\n if (!featureDependent && propertySpec.tokens && typeof stop[1] === 'string') {\n return [stop[0], convertTokenString(stop[1])];\n }\n return [stop[0], convertLiteral(stop[1])];\n });\n if (zoomAndFeatureDependent) {\n return convertZoomAndPropertyFunction(parameters, propertySpec, stops);\n } else if (zoomDependent) {\n return convertZoomFunction(parameters, propertySpec, stops);\n } else {\n return convertPropertyFunction(parameters, propertySpec, stops);\n }\n}\nfunction convertIdentityFunction(parameters, propertySpec) {\n var get = ['get', parameters.property];\n if (parameters[\"default\"] === undefined) {\n return propertySpec.type === 'string' ? ['string', get] : get;\n } else if (propertySpec.type === 'enum') {\n return ['match', get, Object.keys(propertySpec.values), get, parameters[\"default\"]];\n } else {\n var _expression9 = [propertySpec.type === 'color' ? 'to-color' : propertySpec.type, get, convertLiteral(parameters[\"default\"])];\n if (propertySpec.type === 'array') {\n _expression9.splice(1, 0, propertySpec.value, propertySpec.length || null);\n }\n return _expression9;\n }\n}\nfunction getInterpolateOperator(parameters) {\n switch (parameters.colorSpace) {\n case 'hcl':\n return 'interpolate-hcl';\n case 'lab':\n return 'interpolate-lab';\n default:\n return 'interpolate';\n }\n}\nfunction convertZoomAndPropertyFunction(parameters, propertySpec, stops) {\n var featureFunctionParameters = {};\n var featureFunctionStops = {};\n var zoomStops = [];\n for (var s = 0; s < stops.length; s++) {\n var stop = stops[s];\n var zoom = stop[0].zoom;\n if (featureFunctionParameters[zoom] === undefined) {\n featureFunctionParameters[zoom] = {\n zoom: zoom,\n type: parameters.type,\n property: parameters.property,\n \"default\": parameters[\"default\"]\n };\n featureFunctionStops[zoom] = [];\n zoomStops.push(zoom);\n }\n featureFunctionStops[zoom].push([stop[0].value, stop[1]]);\n }\n var functionType = getFunctionType({}, propertySpec);\n if (functionType === 'exponential') {\n var _expression10 = [getInterpolateOperator(parameters), ['linear'], ['zoom']];\n var _iterator40 = _createForOfIteratorHelper(zoomStops),\n _step40;\n try {\n for (_iterator40.s(); !(_step40 = _iterator40.n()).done;) {\n var z = _step40.value;\n var output = convertPropertyFunction(featureFunctionParameters[z], propertySpec, featureFunctionStops[z]);\n appendStopPair(_expression10, z, output, false);\n }\n } catch (err) {\n _iterator40.e(err);\n } finally {\n _iterator40.f();\n }\n return _expression10;\n } else {\n var _expression11 = ['step', ['zoom']];\n var _iterator41 = _createForOfIteratorHelper(zoomStops),\n _step41;\n try {\n for (_iterator41.s(); !(_step41 = _iterator41.n()).done;) {\n var _z = _step41.value;\n var _output = convertPropertyFunction(featureFunctionParameters[_z], propertySpec, featureFunctionStops[_z]);\n appendStopPair(_expression11, _z, _output, true);\n }\n } catch (err) {\n _iterator41.e(err);\n } finally {\n _iterator41.f();\n }\n fixupDegenerateStepCurve(_expression11);\n return _expression11;\n }\n}\nfunction coalesce$1(a, b) {\n if (a !== undefined) return a;\n if (b !== undefined) return b;\n}\nfunction getFallback(parameters, propertySpec) {\n var defaultValue = convertLiteral(coalesce$1(parameters[\"default\"], propertySpec[\"default\"]));\n if (defaultValue === undefined && propertySpec.type === 'resolvedImage') {\n return '';\n }\n return defaultValue;\n}\nfunction convertPropertyFunction(parameters, propertySpec, stops) {\n var type = getFunctionType(parameters, propertySpec);\n var get = ['get', parameters.property];\n if (type === 'categorical' && typeof stops[0][0] === 'boolean') {\n var _expression12 = ['case'];\n var _iterator42 = _createForOfIteratorHelper(stops),\n _step42;\n try {\n for (_iterator42.s(); !(_step42 = _iterator42.n()).done;) {\n var stop = _step42.value;\n _expression12.push(['==', get, stop[0]], stop[1]);\n }\n } catch (err) {\n _iterator42.e(err);\n } finally {\n _iterator42.f();\n }\n _expression12.push(getFallback(parameters, propertySpec));\n return _expression12;\n } else if (type === 'categorical') {\n var _expression13 = ['match', get];\n var _iterator43 = _createForOfIteratorHelper(stops),\n _step43;\n try {\n for (_iterator43.s(); !(_step43 = _iterator43.n()).done;) {\n var _stop2 = _step43.value;\n appendStopPair(_expression13, _stop2[0], _stop2[1], false);\n }\n } catch (err) {\n _iterator43.e(err);\n } finally {\n _iterator43.f();\n }\n _expression13.push(getFallback(parameters, propertySpec));\n return _expression13;\n } else if (type === 'interval') {\n var _expression14 = ['step', ['number', get]];\n var _iterator44 = _createForOfIteratorHelper(stops),\n _step44;\n try {\n for (_iterator44.s(); !(_step44 = _iterator44.n()).done;) {\n var _stop3 = _step44.value;\n appendStopPair(_expression14, _stop3[0], _stop3[1], true);\n }\n } catch (err) {\n _iterator44.e(err);\n } finally {\n _iterator44.f();\n }\n fixupDegenerateStepCurve(_expression14);\n return parameters[\"default\"] === undefined ? _expression14 : ['case', ['==', ['typeof', get], 'number'], _expression14, convertLiteral(parameters[\"default\"])];\n } else if (type === 'exponential') {\n var base = parameters.base !== undefined ? parameters.base : 1;\n var _expression15 = [getInterpolateOperator(parameters), base === 1 ? ['linear'] : ['exponential', base], ['number', get]];\n var _iterator45 = _createForOfIteratorHelper(stops),\n _step45;\n try {\n for (_iterator45.s(); !(_step45 = _iterator45.n()).done;) {\n var _stop4 = _step45.value;\n appendStopPair(_expression15, _stop4[0], _stop4[1], false);\n }\n } catch (err) {\n _iterator45.e(err);\n } finally {\n _iterator45.f();\n }\n return parameters[\"default\"] === undefined ? _expression15 : ['case', ['==', ['typeof', get], 'number'], _expression15, convertLiteral(parameters[\"default\"])];\n } else {\n throw new Error(\"Unknown property function type \".concat(type));\n }\n}\nfunction convertZoomFunction(parameters, propertySpec, stops) {\n var input = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ['zoom'];\n var type = getFunctionType(parameters, propertySpec);\n var expression;\n var isStep = false;\n if (type === 'interval') {\n expression = ['step', input];\n isStep = true;\n } else if (type === 'exponential') {\n var base = parameters.base !== undefined ? parameters.base : 1;\n expression = [getInterpolateOperator(parameters), base === 1 ? ['linear'] : ['exponential', base], input];\n } else {\n throw new Error(\"Unknown zoom function type \\\"\".concat(type, \"\\\"\"));\n }\n var _iterator46 = _createForOfIteratorHelper(stops),\n _step46;\n try {\n for (_iterator46.s(); !(_step46 = _iterator46.n()).done;) {\n var stop = _step46.value;\n appendStopPair(expression, stop[0], stop[1], isStep);\n }\n } catch (err) {\n _iterator46.e(err);\n } finally {\n _iterator46.f();\n }\n fixupDegenerateStepCurve(expression);\n return expression;\n}\nfunction fixupDegenerateStepCurve(expression) {\n if (expression[0] === 'step' && expression.length === 3) {\n expression.push(0);\n expression.push(expression[3]);\n }\n}\nfunction appendStopPair(curve, input, output, isStep) {\n if (curve.length > 3 && input === curve[curve.length - 2]) {\n return;\n }\n if (!(isStep && curve.length === 2)) {\n curve.push(input);\n }\n curve.push(output);\n}\nfunction getFunctionType(parameters, propertySpec) {\n if (parameters.type) {\n return parameters.type;\n } else {\n return propertySpec.expression.interpolated ? 'exponential' : 'interval';\n }\n}\nfunction convertTokenString(s) {\n var result = ['concat'];\n var re = /{([^{}]+)}/g;\n var pos = 0;\n for (var match = re.exec(s); match !== null; match = re.exec(s)) {\n var literal = s.slice(pos, re.lastIndex - match[0].length);\n pos = re.lastIndex;\n if (literal.length > 0) result.push(literal);\n result.push(['get', match[1]]);\n }\n if (result.length === 1) {\n return s;\n }\n if (pos < s.length) {\n result.push(s.slice(pos));\n } else if (result.length === 2) {\n return ['to-string', result[1]];\n }\n return result;\n}\nfunction isExpressionFilter(filter) {\n if (filter === true || filter === false) {\n return true;\n }\n if (!Array.isArray(filter) || filter.length === 0) {\n return false;\n }\n switch (filter[0]) {\n case 'has':\n return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type';\n case 'in':\n return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2]));\n case '!in':\n case '!has':\n case 'none':\n return false;\n case '==':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=':\n return filter.length !== 3 || Array.isArray(filter[1]) || Array.isArray(filter[2]);\n case 'any':\n case 'all':\n var _iterator47 = _createForOfIteratorHelper(filter.slice(1)),\n _step47;\n try {\n for (_iterator47.s(); !(_step47 = _iterator47.n()).done;) {\n var f = _step47.value;\n if (!isExpressionFilter(f) && typeof f !== 'boolean') {\n return false;\n }\n }\n } catch (err) {\n _iterator47.e(err);\n } finally {\n _iterator47.f();\n }\n return true;\n default:\n return true;\n }\n}\nvar filterSpec = {\n 'type': 'boolean',\n 'default': false,\n 'transition': false,\n 'property-type': 'data-driven',\n 'expression': {\n 'interpolated': false,\n 'parameters': ['zoom', 'feature']\n }\n};\nfunction createFilter(filter) {\n if (filter === null || filter === undefined) {\n return {\n filter: function filter() {\n return true;\n },\n needGeometry: false\n };\n }\n if (!isExpressionFilter(filter)) {\n filter = convertFilter(filter);\n }\n var compiled = createExpression(filter, filterSpec);\n if (compiled.result === 'error') {\n throw new Error(compiled.value.map(function (err) {\n return \"\".concat(err.key, \": \").concat(err.message);\n }).join(', '));\n } else {\n var needGeometry = geometryNeeded(filter);\n return {\n filter: function filter(globalProperties, feature, canonical) {\n return compiled.value.evaluate(globalProperties, feature, {}, canonical);\n },\n needGeometry: needGeometry\n };\n }\n}\nfunction compare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\nfunction geometryNeeded(filter) {\n if (!Array.isArray(filter)) return false;\n if (filter[0] === 'within') return true;\n for (var index = 1; index < filter.length; index++) {\n if (geometryNeeded(filter[index])) return true;\n }\n return false;\n}\nfunction convertFilter(filter) {\n if (!filter) return true;\n var op = filter[0];\n if (filter.length <= 1) return op !== 'any';\n var converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : op === 'within' ? filter : true;\n return converted;\n}\nfunction convertComparisonOp(property, value, op) {\n switch (property) {\n case '$type':\n return [\"filter-type-\".concat(op), value];\n case '$id':\n return [\"filter-id-\".concat(op), value];\n default:\n return [\"filter-\".concat(op), property, value];\n }\n}\nfunction convertDisjunctionOp(filters) {\n return ['any'].concat(filters.map(convertFilter));\n}\nfunction convertInOp(property, values) {\n if (values.length === 0) {\n return false;\n }\n switch (property) {\n case '$type':\n return [\"filter-type-in\", ['literal', values]];\n case '$id':\n return [\"filter-id-in\", ['literal', values]];\n default:\n if (values.length > 200 && !values.some(function (v) {\n return _typeof(v) !== _typeof(values[0]);\n })) {\n return ['filter-in-large', property, ['literal', values.sort(compare)]];\n } else {\n return ['filter-in-small', property, ['literal', values]];\n }\n }\n}\nfunction convertHasOp(property) {\n switch (property) {\n case '$type':\n return true;\n case '$id':\n return [\"filter-has-id\"];\n default:\n return [\"filter-has\", property];\n }\n}\nfunction convertNegation(filter) {\n return ['!', filter];\n}\nfunction convertFilter$1(filter) {\n return _convertFilter(filter, {});\n}\nfunction _convertFilter(filter, expectedTypes) {\n if (isExpressionFilter(filter)) {\n return filter;\n }\n if (!filter) return true;\n var op = filter[0];\n if (filter.length <= 1) return op !== 'any';\n var converted;\n if (op === '==' || op === '!=' || op === '<' || op === '>' || op === '<=' || op === '>=') {\n var _filter = _slicedToArray(filter, 3),\n property = _filter[1],\n value = _filter[2];\n converted = convertComparisonOp$1(property, value, op, expectedTypes);\n } else if (op === 'any') {\n var children = filter.slice(1).map(function (f) {\n var types = {};\n var child = _convertFilter(f, types);\n var typechecks = runtimeTypeChecks(types);\n return typechecks === true ? child : ['case', typechecks, child, false];\n });\n return ['any'].concat(children);\n } else if (op === 'all') {\n var _ref111;\n var _children = filter.slice(1).map(function (f) {\n return _convertFilter(f, expectedTypes);\n });\n return _children.length > 1 ? ['all'].concat(_children) : (_ref111 = []).concat.apply(_ref111, _toConsumableArray(_children));\n } else if (op === 'none') {\n return ['!', _convertFilter(['any'].concat(filter.slice(1)), {})];\n } else if (op === 'in') {\n converted = convertInOp$1(filter[1], filter.slice(2));\n } else if (op === '!in') {\n converted = convertInOp$1(filter[1], filter.slice(2), true);\n } else if (op === 'has') {\n converted = convertHasOp$1(filter[1]);\n } else if (op === '!has') {\n converted = ['!', convertHasOp$1(filter[1])];\n } else {\n converted = true;\n }\n return converted;\n}\nfunction runtimeTypeChecks(expectedTypes) {\n var conditions = [];\n for (var property in expectedTypes) {\n var _get = property === '$id' ? ['id'] : ['get', property];\n conditions.push(['==', ['typeof', _get], expectedTypes[property]]);\n }\n if (conditions.length === 0) return true;\n if (conditions.length === 1) return conditions[0];\n return ['all'].concat(conditions);\n}\nfunction convertComparisonOp$1(property, value, op, expectedTypes) {\n var get;\n if (property === '$type') {\n return [op, ['geometry-type'], value];\n } else if (property === '$id') {\n get = ['id'];\n } else {\n get = ['get', property];\n }\n if (expectedTypes && value !== null) {\n var type = _typeof(value);\n expectedTypes[property] = type;\n }\n if (op === '==' && property !== '$id' && value === null) {\n return ['all', ['has', property], ['==', get, null]];\n } else if (op === '!=' && property !== '$id' && value === null) {\n return ['any', ['!', ['has', property]], ['!=', get, null]];\n }\n return [op, get, value];\n}\nfunction convertInOp$1(property, values) {\n var negate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (values.length === 0) return negate;\n var get;\n if (property === '$type') {\n get = ['geometry-type'];\n } else if (property === '$id') {\n get = ['id'];\n } else {\n get = ['get', property];\n }\n var uniformTypes = true;\n var type = _typeof(values[0]);\n var _iterator48 = _createForOfIteratorHelper(values),\n _step48;\n try {\n for (_iterator48.s(); !(_step48 = _iterator48.n()).done;) {\n var value = _step48.value;\n if (_typeof(value) !== type) {\n uniformTypes = false;\n break;\n }\n }\n } catch (err) {\n _iterator48.e(err);\n } finally {\n _iterator48.f();\n }\n if (uniformTypes && (type === 'string' || type === 'number')) {\n var uniqueValues = values.sort().filter(function (v, i) {\n return i === 0 || values[i - 1] !== v;\n });\n return ['match', get, uniqueValues, !negate, negate];\n }\n return [negate ? 'all' : 'any'].concat(values.map(function (v) {\n return [negate ? '!=' : '==', get, v];\n }));\n}\nfunction convertHasOp$1(property) {\n if (property === '$type') {\n return true;\n } else if (property === '$id') {\n return ['!=', ['id'], null];\n } else {\n return ['has', property];\n }\n}\nfunction migrateToExpressions(style) {\n var converted = [];\n eachLayer(style, function (layer) {\n if (layer.filter) {\n layer.filter = convertFilter$1(layer.filter);\n }\n });\n eachProperty(style, {\n paint: true,\n layout: true\n }, function (_ref112) {\n var path = _ref112.path,\n value = _ref112.value,\n reference = _ref112.reference,\n set = _ref112.set;\n if (isExpression(value)) return;\n if (_typeof(value) === 'object' && !Array.isArray(value)) {\n set(convertFunction(value, reference));\n converted.push(path.join('.'));\n } else if (reference.tokens && typeof value === 'string') {\n set(convertTokenString(value));\n }\n });\n return style;\n}\nfunction migrate(style) {\n var migrated = false;\n if (style.version === 7) {\n style = migrateToV8(style);\n migrated = true;\n }\n if (style.version === 8) {\n migrated = migrateToExpressions(style);\n migrated = true;\n }\n if (!migrated) {\n throw new Error('cannot migrate from', style.version);\n }\n return style;\n}\nfunction composite(style) {\n var styleIDs = [];\n var sourceIDs = [];\n var compositedSourceLayers = [];\n for (var id in style.sources) {\n var _source = style.sources[id];\n if (_source.type !== 'vector') continue;\n var match = /^mapbox:\\/\\/(.*)/.exec(_source.url);\n if (!match) continue;\n styleIDs.push(id);\n sourceIDs.push(match[1]);\n }\n if (styleIDs.length < 2) return style;\n styleIDs.forEach(function (id) {\n delete style.sources[id];\n });\n var compositeID = sourceIDs.join(',');\n style.sources[compositeID] = {\n 'type': 'vector',\n 'url': \"mapbox://\".concat(compositeID)\n };\n style.layers.forEach(function (layer) {\n if (styleIDs.indexOf(layer.source) >= 0) {\n layer.source = compositeID;\n if ('source-layer' in layer) {\n if (compositedSourceLayers.indexOf(layer['source-layer']) >= 0) {\n throw new Error('Conflicting source layer names');\n } else {\n compositedSourceLayers.push(layer['source-layer']);\n }\n }\n }\n });\n return style;\n}\nvar refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\nfunction deref(layer, parent) {\n var result = {};\n for (var k in layer) {\n if (k !== 'ref') {\n result[k] = layer[k];\n }\n }\n refProperties.forEach(function (k) {\n if (k in parent) {\n result[k] = parent[k];\n }\n });\n return result;\n}\nfunction derefLayers(layers) {\n layers = layers.slice();\n var map = Object.create(null);\n for (var i = 0; i < layers.length; i++) {\n map[layers[i].id] = layers[i];\n }\n for (var _i9 = 0; _i9 < layers.length; _i9++) {\n if ('ref' in layers[_i9]) {\n layers[_i9] = deref(layers[_i9], map[layers[_i9].ref]);\n }\n }\n return layers;\n}\nfunction deepEqual(a, b) {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (var i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n if (_typeof(a) === 'object' && a !== null && b !== null) {\n if (!(_typeof(b) === 'object')) return false;\n var keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n for (var key in a) {\n if (!deepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n return a === b;\n}\nvar operations = {\n setStyle: 'setStyle',\n addLayer: 'addLayer',\n removeLayer: 'removeLayer',\n setPaintProperty: 'setPaintProperty',\n setLayoutProperty: 'setLayoutProperty',\n setFilter: 'setFilter',\n addSource: 'addSource',\n removeSource: 'removeSource',\n setGeoJSONSourceData: 'setGeoJSONSourceData',\n setLayerZoomRange: 'setLayerZoomRange',\n setLayerProperty: 'setLayerProperty',\n setCenter: 'setCenter',\n setZoom: 'setZoom',\n setBearing: 'setBearing',\n setPitch: 'setPitch',\n setSprite: 'setSprite',\n setGlyphs: 'setGlyphs',\n setTransition: 'setTransition',\n setLight: 'setLight',\n setTerrain: 'setTerrain',\n setFog: 'setFog'\n};\nfunction addSource(sourceId, after, commands) {\n commands.push({\n command: operations.addSource,\n args: [sourceId, after[sourceId]]\n });\n}\nfunction removeSource(sourceId, commands, sourcesRemoved) {\n commands.push({\n command: operations.removeSource,\n args: [sourceId]\n });\n sourcesRemoved[sourceId] = true;\n}\nfunction updateSource(sourceId, after, commands, sourcesRemoved) {\n removeSource(sourceId, commands, sourcesRemoved);\n addSource(sourceId, after, commands);\n}\nfunction canUpdateGeoJSON(before, after, sourceId) {\n var prop;\n for (prop in before[sourceId]) {\n if (!before[sourceId].hasOwnProperty(prop)) continue;\n if (prop !== 'data' && !deepEqual(before[sourceId][prop], after[sourceId][prop])) {\n return false;\n }\n }\n for (prop in after[sourceId]) {\n if (!after[sourceId].hasOwnProperty(prop)) continue;\n if (prop !== 'data' && !deepEqual(before[sourceId][prop], after[sourceId][prop])) {\n return false;\n }\n }\n return true;\n}\nfunction diffSources(before, after, commands, sourcesRemoved) {\n before = before || {};\n after = after || {};\n var sourceId;\n for (sourceId in before) {\n if (!before.hasOwnProperty(sourceId)) continue;\n if (!after.hasOwnProperty(sourceId)) {\n removeSource(sourceId, commands, sourcesRemoved);\n }\n }\n for (sourceId in after) {\n if (!after.hasOwnProperty(sourceId)) continue;\n if (!before.hasOwnProperty(sourceId)) {\n addSource(sourceId, after, commands);\n } else if (!deepEqual(before[sourceId], after[sourceId])) {\n if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) {\n commands.push({\n command: operations.setGeoJSONSourceData,\n args: [sourceId, after[sourceId].data]\n });\n } else {\n updateSource(sourceId, after, commands, sourcesRemoved);\n }\n }\n }\n}\nfunction diffLayerPropertyChanges(before, after, commands, layerId, klass, command) {\n before = before || {};\n after = after || {};\n var prop;\n for (prop in before) {\n if (!before.hasOwnProperty(prop)) continue;\n if (!deepEqual(before[prop], after[prop])) {\n commands.push({\n command: command,\n args: [layerId, prop, after[prop], klass]\n });\n }\n }\n for (prop in after) {\n if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue;\n if (!deepEqual(before[prop], after[prop])) {\n commands.push({\n command: command,\n args: [layerId, prop, after[prop], klass]\n });\n }\n }\n}\nfunction pluckId(layer) {\n return layer.id;\n}\nfunction indexById(group, layer) {\n group[layer.id] = layer;\n return group;\n}\nfunction diffLayers(before, after, commands) {\n before = before || [];\n after = after || [];\n var beforeOrder = before.map(pluckId);\n var afterOrder = after.map(pluckId);\n var beforeIndex = before.reduce(indexById, {});\n var afterIndex = after.reduce(indexById, {});\n var tracker = beforeOrder.slice();\n var clean = Object.create(null);\n var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop;\n for (i = 0, d = 0; i < beforeOrder.length; i++) {\n layerId = beforeOrder[i];\n if (!afterIndex.hasOwnProperty(layerId)) {\n commands.push({\n command: operations.removeLayer,\n args: [layerId]\n });\n tracker.splice(tracker.indexOf(layerId, d), 1);\n } else {\n d++;\n }\n }\n for (i = 0, d = 0; i < afterOrder.length; i++) {\n layerId = afterOrder[afterOrder.length - 1 - i];\n if (tracker[tracker.length - 1 - i] === layerId) continue;\n if (beforeIndex.hasOwnProperty(layerId)) {\n commands.push({\n command: operations.removeLayer,\n args: [layerId]\n });\n tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1);\n } else {\n d++;\n }\n insertBeforeLayerId = tracker[tracker.length - i];\n commands.push({\n command: operations.addLayer,\n args: [afterIndex[layerId], insertBeforeLayerId]\n });\n tracker.splice(tracker.length - i, 0, layerId);\n clean[layerId] = true;\n }\n for (i = 0; i < afterOrder.length; i++) {\n layerId = afterOrder[i];\n beforeLayer = beforeIndex[layerId];\n afterLayer = afterIndex[layerId];\n if (clean[layerId] || deepEqual(beforeLayer, afterLayer)) continue;\n if (!deepEqual(beforeLayer.source, afterLayer.source) || !deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !deepEqual(beforeLayer.type, afterLayer.type)) {\n commands.push({\n command: operations.removeLayer,\n args: [layerId]\n });\n insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1];\n commands.push({\n command: operations.addLayer,\n args: [afterLayer, insertBeforeLayerId]\n });\n continue;\n }\n diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty);\n diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty);\n if (!deepEqual(beforeLayer.filter, afterLayer.filter)) {\n commands.push({\n command: operations.setFilter,\n args: [layerId, afterLayer.filter]\n });\n }\n if (!deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) {\n commands.push({\n command: operations.setLayerZoomRange,\n args: [layerId, afterLayer.minzoom, afterLayer.maxzoom]\n });\n }\n for (prop in beforeLayer) {\n if (!beforeLayer.hasOwnProperty(prop)) continue;\n if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue;\n if (prop.indexOf('paint.') === 0) {\n diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n } else if (!deepEqual(beforeLayer[prop], afterLayer[prop])) {\n commands.push({\n command: operations.setLayerProperty,\n args: [layerId, prop, afterLayer[prop]]\n });\n }\n }\n for (prop in afterLayer) {\n if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) continue;\n if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue;\n if (prop.indexOf('paint.') === 0) {\n diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n } else if (!deepEqual(beforeLayer[prop], afterLayer[prop])) {\n commands.push({\n command: operations.setLayerProperty,\n args: [layerId, prop, afterLayer[prop]]\n });\n }\n }\n }\n}\nfunction diffStyles(before, after) {\n if (!before) return [{\n command: operations.setStyle,\n args: [after]\n }];\n var commands = [];\n try {\n if (!deepEqual(before.version, after.version)) {\n return [{\n command: operations.setStyle,\n args: [after]\n }];\n }\n if (!deepEqual(before.center, after.center)) {\n commands.push({\n command: operations.setCenter,\n args: [after.center]\n });\n }\n if (!deepEqual(before.zoom, after.zoom)) {\n commands.push({\n command: operations.setZoom,\n args: [after.zoom]\n });\n }\n if (!deepEqual(before.bearing, after.bearing)) {\n commands.push({\n command: operations.setBearing,\n args: [after.bearing]\n });\n }\n if (!deepEqual(before.pitch, after.pitch)) {\n commands.push({\n command: operations.setPitch,\n args: [after.pitch]\n });\n }\n if (!deepEqual(before.sprite, after.sprite)) {\n commands.push({\n command: operations.setSprite,\n args: [after.sprite]\n });\n }\n if (!deepEqual(before.glyphs, after.glyphs)) {\n commands.push({\n command: operations.setGlyphs,\n args: [after.glyphs]\n });\n }\n if (!deepEqual(before.transition, after.transition)) {\n commands.push({\n command: operations.setTransition,\n args: [after.transition]\n });\n }\n if (!deepEqual(before.light, after.light)) {\n commands.push({\n command: operations.setLight,\n args: [after.light]\n });\n }\n if (!deepEqual(before.fog, after.fog)) {\n commands.push({\n command: operations.setFog,\n args: [after.fog]\n });\n }\n var sourcesRemoved = {};\n var removeOrAddSourceCommands = [];\n diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved);\n var beforeLayers = [];\n if (before.layers) {\n before.layers.forEach(function (layer) {\n if (sourcesRemoved[layer.source]) {\n commands.push({\n command: operations.removeLayer,\n args: [layer.id]\n });\n } else {\n beforeLayers.push(layer);\n }\n });\n }\n var beforeTerrain = before.terrain;\n if (beforeTerrain) {\n if (sourcesRemoved[beforeTerrain.source]) {\n commands.push({\n command: operations.setTerrain,\n args: [undefined]\n });\n beforeTerrain = undefined;\n }\n }\n commands = commands.concat(removeOrAddSourceCommands);\n if (!deepEqual(beforeTerrain, after.terrain)) {\n commands.push({\n command: operations.setTerrain,\n args: [after.terrain]\n });\n }\n diffLayers(beforeLayers, after.layers, commands);\n } catch (e) {\n console.warn('Unable to compute style diff:', e);\n commands = [{\n command: operations.setStyle,\n args: [after]\n }];\n }\n return commands;\n}\nvar ValidationError = /*#__PURE__*/_createClass(function ValidationError(key, value, message, identifier) {\n _classCallCheck(this, ValidationError);\n this.message = (key ? \"\".concat(key, \": \") : '') + message;\n if (identifier) this.identifier = identifier;\n if (value !== null && value !== undefined && value.__line__) {\n this.line = value.__line__;\n }\n});\nvar ParsingError$1 = /*#__PURE__*/_createClass(function ParsingError$1(error) {\n _classCallCheck(this, ParsingError$1);\n this.error = error;\n this.message = error.message;\n var match = error.message.match(/line (\\d+)/);\n this.line = match ? parseInt(match[1], 10) : 0;\n});\nfunction validateConstants(options) {\n var key = options.key;\n var constants = options.value;\n if (constants) {\n return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n } else {\n return [];\n }\n}\nfunction unbundle(value) {\n if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n return value.valueOf();\n } else {\n return value;\n }\n}\nfunction deepUnbundle(value) {\n if (Array.isArray(value)) {\n return value.map(deepUnbundle);\n } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) {\n var unbundledValue = {};\n for (var key in value) {\n unbundledValue[key] = deepUnbundle(value[key]);\n }\n return unbundledValue;\n }\n return unbundle(value);\n}\nfunction validateObject(options) {\n var key = options.key;\n var object = options.value;\n var elementSpecs = options.valueSpec || {};\n var elementValidators = options.objectElementValidators || {};\n var style = options.style;\n var styleSpec = options.styleSpec;\n var errors = [];\n var type = getType(object);\n if (type !== 'object') {\n return [new ValidationError(key, object, \"object expected, \".concat(type, \" found\"))];\n }\n for (var objectKey in object) {\n var elementSpecKey = objectKey.split('.')[0];\n var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];\n var validateElement = void 0;\n if (elementValidators[elementSpecKey]) {\n validateElement = elementValidators[elementSpecKey];\n } else if (elementSpecs[elementSpecKey]) {\n validateElement = validate;\n } else if (elementValidators['*']) {\n validateElement = elementValidators['*'];\n } else if (elementSpecs['*']) {\n validateElement = validate;\n } else {\n errors.push(new ValidationError(key, object[objectKey], \"unknown property \\\"\".concat(objectKey, \"\\\"\")));\n continue;\n }\n errors = errors.concat(validateElement({\n key: (key ? \"\".concat(key, \".\") : key) + objectKey,\n value: object[objectKey],\n valueSpec: elementSpec,\n style: style,\n styleSpec: styleSpec,\n object: object,\n objectKey: objectKey\n }, object));\n }\n for (var _elementSpecKey in elementSpecs) {\n if (elementValidators[_elementSpecKey]) {\n continue;\n }\n if (elementSpecs[_elementSpecKey].required && elementSpecs[_elementSpecKey]['default'] === undefined && object[_elementSpecKey] === undefined) {\n errors.push(new ValidationError(key, object, \"missing required property \\\"\".concat(_elementSpecKey, \"\\\"\")));\n }\n }\n return errors;\n}\nfunction validateArray(options) {\n var array = options.value;\n var arraySpec = options.valueSpec;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var key = options.key;\n var validateArrayElement = options.arrayElementValidator || validate;\n if (getType(array) !== 'array') {\n return [new ValidationError(key, array, \"array expected, \".concat(getType(array), \" found\"))];\n }\n if (arraySpec.length && array.length !== arraySpec.length) {\n return [new ValidationError(key, array, \"array length \".concat(arraySpec.length, \" expected, length \").concat(array.length, \" found\"))];\n }\n if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n return [new ValidationError(key, array, \"array length at least \".concat(arraySpec['min-length'], \" expected, length \").concat(array.length, \" found\"))];\n }\n var arrayElementSpec = {\n 'type': arraySpec.value,\n 'values': arraySpec.values,\n 'minimum': arraySpec.minimum,\n 'maximum': arraySpec.maximum\n };\n if (styleSpec.$version < 7) {\n arrayElementSpec[\"function\"] = arraySpec[\"function\"];\n }\n if (getType(arraySpec.value) === 'object') {\n arrayElementSpec = arraySpec.value;\n }\n var errors = [];\n for (var i = 0; i < array.length; i++) {\n errors = errors.concat(validateArrayElement({\n array: array,\n arrayIndex: i,\n value: array[i],\n valueSpec: arrayElementSpec,\n style: style,\n styleSpec: styleSpec,\n key: \"\".concat(key, \"[\").concat(i, \"]\")\n }));\n }\n return errors;\n}\nfunction validateNumber(options) {\n var key = options.key;\n var value = options.value;\n var valueSpec = options.valueSpec;\n var type = getType(value);\n if (type === 'number' && value !== value) {\n type = 'NaN';\n }\n if (type !== 'number') {\n return [new ValidationError(key, value, \"number expected, \".concat(type, \" found\"))];\n }\n if ('minimum' in valueSpec) {\n var specMin = valueSpec.minimum;\n if (getType(valueSpec.minimum) === 'array') {\n var i = options.arrayIndex;\n specMin = valueSpec.minimum[i];\n }\n if (value < specMin) {\n return [new ValidationError(key, value, \"\".concat(value, \" is less than the minimum value \").concat(specMin))];\n }\n }\n if ('maximum' in valueSpec) {\n var specMax = valueSpec.maximum;\n if (getType(valueSpec.maximum) === 'array') {\n var _i10 = options.arrayIndex;\n specMax = valueSpec.maximum[_i10];\n }\n if (value > specMax) {\n return [new ValidationError(key, value, \"\".concat(value, \" is greater than the maximum value \").concat(specMax))];\n }\n }\n return [];\n}\nfunction validateFunction(options) {\n var functionValueSpec = options.valueSpec;\n var functionType = unbundle(options.value.type);\n var stopKeyType;\n var stopDomainValues = {};\n var previousStopDomainValue;\n var previousStopDomainZoom;\n var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;\n var isPropertyFunction = !isZoomFunction;\n var isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object';\n var errors = validateObject({\n key: options.key,\n value: options.value,\n valueSpec: options.styleSpec[\"function\"],\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n stops: validateFunctionStops,\n \"default\": validateFunctionDefault\n }\n });\n if (functionType === 'identity' && isZoomFunction) {\n errors.push(new ValidationError(options.key, options.value, 'missing required property \"property\"'));\n }\n if (functionType !== 'identity' && !options.value.stops) {\n errors.push(new ValidationError(options.key, options.value, 'missing required property \"stops\"'));\n }\n if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) {\n errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));\n }\n if (options.styleSpec.$version >= 8) {\n if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) {\n errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) {\n errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n }\n }\n if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {\n errors.push(new ValidationError(options.key, options.value, '\"property\" property is required'));\n }\n return errors;\n function validateFunctionStops(options) {\n if (functionType === 'identity') {\n return [new ValidationError(options.key, options.value, 'identity function may not have a \"stops\" property')];\n }\n var errors = [];\n var value = options.value;\n errors = errors.concat(validateArray({\n key: options.key,\n value: value,\n valueSpec: options.valueSpec,\n style: options.style,\n styleSpec: options.styleSpec,\n arrayElementValidator: validateFunctionStop\n }));\n if (getType(value) === 'array' && value.length === 0) {\n errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n }\n return errors;\n }\n function validateFunctionStop(options) {\n var errors = [];\n var value = options.value;\n var key = options.key;\n if (getType(value) !== 'array') {\n return [new ValidationError(key, value, \"array expected, \".concat(getType(value), \" found\"))];\n }\n if (value.length !== 2) {\n return [new ValidationError(key, value, \"array length 2 expected, length \".concat(value.length, \" found\"))];\n }\n if (isZoomAndPropertyFunction) {\n if (getType(value[0]) !== 'object') {\n return [new ValidationError(key, value, \"object expected, \".concat(getType(value[0]), \" found\"))];\n }\n if (value[0].zoom === undefined) {\n return [new ValidationError(key, value, 'object stop key must have zoom')];\n }\n if (value[0].value === undefined) {\n return [new ValidationError(key, value, 'object stop key must have value')];\n }\n if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {\n return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];\n }\n if (unbundle(value[0].zoom) !== previousStopDomainZoom) {\n previousStopDomainZoom = unbundle(value[0].zoom);\n previousStopDomainValue = undefined;\n stopDomainValues = {};\n }\n errors = errors.concat(validateObject({\n key: \"\".concat(key, \"[0]\"),\n value: value[0],\n valueSpec: {\n zoom: {}\n },\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n zoom: validateNumber,\n value: validateStopDomainValue\n }\n }));\n } else {\n errors = errors.concat(validateStopDomainValue({\n key: \"\".concat(key, \"[0]\"),\n value: value[0],\n valueSpec: {},\n style: options.style,\n styleSpec: options.styleSpec\n }, value));\n }\n if (isExpression(deepUnbundle(value[1]))) {\n return errors.concat([new ValidationError(\"\".concat(key, \"[1]\"), value[1], 'expressions are not allowed in function stops.')]);\n }\n return errors.concat(validate({\n key: \"\".concat(key, \"[1]\"),\n value: value[1],\n valueSpec: functionValueSpec,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n function validateStopDomainValue(options, stop) {\n var type = getType(options.value);\n var value = unbundle(options.value);\n var reportValue = options.value !== null ? options.value : stop;\n if (!stopKeyType) {\n stopKeyType = type;\n } else if (type !== stopKeyType) {\n return [new ValidationError(options.key, reportValue, \"\".concat(type, \" stop domain type must match previous stop domain type \").concat(stopKeyType))];\n }\n if (type !== 'number' && type !== 'string' && type !== 'boolean') {\n return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')];\n }\n if (type !== 'number' && functionType !== 'categorical') {\n var message = \"number expected, \".concat(type, \" found\");\n if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) {\n message += '\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.';\n }\n return [new ValidationError(options.key, reportValue, message)];\n }\n if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {\n return [new ValidationError(options.key, reportValue, \"integer expected, found \".concat(value))];\n }\n if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {\n return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')];\n } else {\n previousStopDomainValue = value;\n }\n if (functionType === 'categorical' && value in stopDomainValues) {\n return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')];\n } else {\n stopDomainValues[value] = true;\n }\n return [];\n }\n function validateFunctionDefault(options) {\n return validate({\n key: options.key,\n value: options.value,\n valueSpec: functionValueSpec,\n style: options.style,\n styleSpec: options.styleSpec\n });\n }\n}\nfunction validateExpression(options) {\n var expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec);\n if (expression.result === 'error') {\n return expression.value.map(function (error) {\n return new ValidationError(\"\".concat(options.key).concat(error.key), options.value, error.message);\n });\n }\n var expressionObj = expression.value.expression || expression.value._styleExpression.expression;\n if (options.expressionContext === 'property' && options.propertyKey === 'text-font' && !expressionObj.outputDefined()) {\n return [new ValidationError(options.key, options.value, \"Invalid data expression for \\\"\".concat(options.propertyKey, \"\\\". Output values must be contained as literals within the expression.\"))];\n }\n if (options.expressionContext === 'property' && options.propertyType === 'layout' && !isStateConstant(expressionObj)) {\n return [new ValidationError(options.key, options.value, '\"feature-state\" data expressions are not supported with layout properties.')];\n }\n if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) {\n return [new ValidationError(options.key, options.value, '\"feature-state\" data expressions are not supported with filters.')];\n }\n if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) {\n if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) {\n return [new ValidationError(options.key, options.value, '\"zoom\" and \"feature-state\" expressions are not supported with cluster properties.')];\n }\n if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) {\n return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')];\n }\n }\n return [];\n}\nfunction validateBoolean(options) {\n var value = options.value;\n var key = options.key;\n var type = getType(value);\n if (type !== 'boolean') {\n return [new ValidationError(key, value, \"boolean expected, \".concat(type, \" found\"))];\n }\n return [];\n}\nfunction validateColor(options) {\n var key = options.key;\n var value = options.value;\n var type = getType(value);\n if (type !== 'string') {\n return [new ValidationError(key, value, \"color expected, \".concat(type, \" found\"))];\n }\n if (csscolorparser.parseCSSColor(value) === null) {\n return [new ValidationError(key, value, \"color expected, \\\"\".concat(value, \"\\\" found\"))];\n }\n return [];\n}\nfunction validateEnum(options) {\n var key = options.key;\n var value = options.value;\n var valueSpec = options.valueSpec;\n var errors = [];\n if (Array.isArray(valueSpec.values)) {\n if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n errors.push(new ValidationError(key, value, \"expected one of [\".concat(valueSpec.values.join(', '), \"], \").concat(JSON.stringify(value), \" found\")));\n }\n } else {\n if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {\n errors.push(new ValidationError(key, value, \"expected one of [\".concat(Object.keys(valueSpec.values).join(', '), \"], \").concat(JSON.stringify(value), \" found\")));\n }\n }\n return errors;\n}\nfunction validateFilter(options) {\n if (isExpressionFilter(deepUnbundle(options.value))) {\n return validateExpression(extend({}, options, {\n expressionContext: 'filter',\n valueSpec: {\n value: 'boolean'\n }\n }));\n } else {\n return validateNonExpressionFilter(options);\n }\n}\nfunction validateNonExpressionFilter(options) {\n var value = options.value;\n var key = options.key;\n if (getType(value) !== 'array') {\n return [new ValidationError(key, value, \"array expected, \".concat(getType(value), \" found\"))];\n }\n var styleSpec = options.styleSpec;\n var type;\n var errors = [];\n if (value.length < 1) {\n return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n }\n errors = errors.concat(validateEnum({\n key: \"\".concat(key, \"[0]\"),\n value: value[0],\n valueSpec: styleSpec.filter_operator,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n switch (unbundle(value[0])) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n if (value.length >= 2 && unbundle(value[1]) === '$type') {\n errors.push(new ValidationError(key, value, \"\\\"$type\\\" cannot be use with operator \\\"\".concat(value[0], \"\\\"\")));\n }\n case '==':\n case '!=':\n if (value.length !== 3) {\n errors.push(new ValidationError(key, value, \"filter array for operator \\\"\".concat(value[0], \"\\\" must have 3 elements\")));\n }\n case 'in':\n case '!in':\n if (value.length >= 2) {\n type = getType(value[1]);\n if (type !== 'string') {\n errors.push(new ValidationError(\"\".concat(key, \"[1]\"), value[1], \"string expected, \".concat(type, \" found\")));\n }\n }\n for (var i = 2; i < value.length; i++) {\n type = getType(value[i]);\n if (unbundle(value[1]) === '$type') {\n errors = errors.concat(validateEnum({\n key: \"\".concat(key, \"[\").concat(i, \"]\"),\n value: value[i],\n valueSpec: styleSpec.geometry_type,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n errors.push(new ValidationError(\"\".concat(key, \"[\").concat(i, \"]\"), value[i], \"string, number, or boolean expected, \".concat(type, \" found\")));\n }\n }\n break;\n case 'any':\n case 'all':\n case 'none':\n for (var _i11 = 1; _i11 < value.length; _i11++) {\n errors = errors.concat(validateNonExpressionFilter({\n key: \"\".concat(key, \"[\").concat(_i11, \"]\"),\n value: value[_i11],\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n break;\n case 'has':\n case '!has':\n type = getType(value[1]);\n if (value.length !== 2) {\n errors.push(new ValidationError(key, value, \"filter array for \\\"\".concat(value[0], \"\\\" operator must have 2 elements\")));\n } else if (type !== 'string') {\n errors.push(new ValidationError(\"\".concat(key, \"[1]\"), value[1], \"string expected, \".concat(type, \" found\")));\n }\n break;\n case 'within':\n type = getType(value[1]);\n if (value.length !== 2) {\n errors.push(new ValidationError(key, value, \"filter array for \\\"\".concat(value[0], \"\\\" operator must have 2 elements\")));\n } else if (type !== 'object') {\n errors.push(new ValidationError(\"\".concat(key, \"[1]\"), value[1], \"object expected, \".concat(type, \" found\")));\n }\n break;\n }\n return errors;\n}\nfunction validateProperty(options, propertyType) {\n var key = options.key;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var value = options.value;\n var propertyKey = options.objectKey;\n var layerSpec = styleSpec[\"\".concat(propertyType, \"_\").concat(options.layerType)];\n if (!layerSpec) return [];\n var transitionMatch = propertyKey.match(/^(.*)-transition$/);\n if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n return validate({\n key: key,\n value: value,\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n });\n }\n var valueSpec = options.valueSpec || layerSpec[propertyKey];\n if (!valueSpec) {\n return [new ValidationError(key, value, \"unknown property \\\"\".concat(propertyKey, \"\\\"\"))];\n }\n var tokenMatch;\n if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) {\n return [new ValidationError(key, value, \"\\\"\".concat(propertyKey, \"\\\" does not support interpolation syntax\\n\") + \"Use an identity property function instead: `{ \\\"type\\\": \\\"identity\\\", \\\"property\\\": \".concat(JSON.stringify(tokenMatch[1]), \" }`.\"))];\n }\n var errors = [];\n if (options.layerType === 'symbol') {\n if (propertyKey === 'text-field' && style && !style.glyphs) {\n errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n }\n if (propertyKey === 'text-font' && isFunction$1(deepUnbundle(value)) && unbundle(value.type) === 'identity') {\n errors.push(new ValidationError(key, value, '\"text-font\" does not support identity functions'));\n }\n }\n return errors.concat(validate({\n key: options.key,\n value: value,\n valueSpec: valueSpec,\n style: style,\n styleSpec: styleSpec,\n expressionContext: 'property',\n propertyType: propertyType,\n propertyKey: propertyKey\n }));\n}\nfunction validatePaintProperty(options) {\n return validateProperty(options, 'paint');\n}\nfunction validateLayoutProperty(options) {\n return validateProperty(options, 'layout');\n}\nfunction validateLayer(options) {\n var errors = [];\n var layer = options.value;\n var key = options.key;\n var style = options.style;\n var styleSpec = options.styleSpec;\n if (!layer.type && !layer.ref) {\n errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n }\n var type = unbundle(layer.type);\n var ref = unbundle(layer.ref);\n if (layer.id) {\n var layerId = unbundle(layer.id);\n for (var i = 0; i < options.arrayIndex; i++) {\n var otherLayer = style.layers[i];\n if (unbundle(otherLayer.id) === layerId) {\n errors.push(new ValidationError(key, layer.id, \"duplicate layer id \\\"\".concat(layer.id, \"\\\", previously used at line \").concat(otherLayer.id.__line__)));\n }\n }\n }\n if ('ref' in layer) {\n ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n if (p in layer) {\n errors.push(new ValidationError(key, layer[p], \"\\\"\".concat(p, \"\\\" is prohibited for ref layers\")));\n }\n });\n var parent;\n style.layers.forEach(function (layer) {\n if (unbundle(layer.id) === ref) parent = layer;\n });\n if (!parent) {\n errors.push(new ValidationError(key, layer.ref, \"ref layer \\\"\".concat(ref, \"\\\" not found\")));\n } else if (parent.ref) {\n errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n } else {\n type = unbundle(parent.type);\n }\n } else if (!(type === 'background' || type === 'sky')) {\n if (!layer.source) {\n errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n } else {\n var _source2 = style.sources && style.sources[layer.source];\n var sourceType = _source2 && unbundle(_source2.type);\n if (!_source2) {\n errors.push(new ValidationError(key, layer.source, \"source \\\"\".concat(layer.source, \"\\\" not found\")));\n } else if (sourceType === 'vector' && type === 'raster') {\n errors.push(new ValidationError(key, layer.source, \"layer \\\"\".concat(layer.id, \"\\\" requires a raster source\")));\n } else if (sourceType === 'raster' && type !== 'raster') {\n errors.push(new ValidationError(key, layer.source, \"layer \\\"\".concat(layer.id, \"\\\" requires a vector source\")));\n } else if (sourceType === 'vector' && !layer['source-layer']) {\n errors.push(new ValidationError(key, layer, \"layer \\\"\".concat(layer.id, \"\\\" must specify a \\\"source-layer\\\"\")));\n } else if (sourceType === 'raster-dem' && type !== 'hillshade') {\n errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \\'hillshade\\'.'));\n } else if (type === 'line' && layer.paint && layer.paint['line-gradient'] && (sourceType !== 'geojson' || !_source2.lineMetrics)) {\n errors.push(new ValidationError(key, layer, \"layer \\\"\".concat(layer.id, \"\\\" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled.\")));\n }\n }\n }\n errors = errors.concat(validateObject({\n key: key,\n value: layer,\n valueSpec: styleSpec.layer,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function _() {\n return [];\n },\n type: function type() {\n return validate({\n key: \"\".concat(key, \".type\"),\n value: layer.type,\n valueSpec: styleSpec.layer.type,\n style: options.style,\n styleSpec: options.styleSpec,\n object: layer,\n objectKey: 'type'\n });\n },\n filter: validateFilter,\n layout: function layout(options) {\n return validateObject({\n layer: layer,\n key: options.key,\n value: options.value,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function _(options) {\n return validateLayoutProperty(extend({\n layerType: type\n }, options));\n }\n }\n });\n },\n paint: function paint(options) {\n return validateObject({\n layer: layer,\n key: options.key,\n value: options.value,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function _(options) {\n return validatePaintProperty(extend({\n layerType: type\n }, options));\n }\n }\n });\n }\n }\n }));\n return errors;\n}\nfunction validateString(options) {\n var value = options.value;\n var key = options.key;\n var type = getType(value);\n if (type !== 'string') {\n return [new ValidationError(key, value, \"string expected, \".concat(type, \" found\"))];\n }\n return [];\n}\nvar objectElementValidators = {\n promoteId: validatePromoteId\n};\nfunction validateSource(options) {\n var value = options.value;\n var key = options.key;\n var styleSpec = options.styleSpec;\n var style = options.style;\n if (!value.type) {\n return [new ValidationError(key, value, '\"type\" is required')];\n }\n var type = unbundle(value.type);\n var errors;\n switch (type) {\n case 'vector':\n case 'raster':\n case 'raster-dem':\n errors = validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec[\"source_\".concat(type.replace('-', '_'))],\n style: options.style,\n styleSpec: styleSpec,\n objectElementValidators: objectElementValidators\n });\n return errors;\n case 'geojson':\n errors = validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_geojson,\n style: style,\n styleSpec: styleSpec,\n objectElementValidators: objectElementValidators\n });\n if (value.cluster) {\n for (var prop in value.clusterProperties) {\n var _errors, _errors2;\n var _value$clusterPropert = _slicedToArray(value.clusterProperties[prop], 2),\n operator = _value$clusterPropert[0],\n mapExpr = _value$clusterPropert[1];\n var reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;\n (_errors = errors).push.apply(_errors, _toConsumableArray(validateExpression({\n key: \"\".concat(key, \".\").concat(prop, \".map\"),\n value: mapExpr,\n expressionContext: 'cluster-map'\n })));\n (_errors2 = errors).push.apply(_errors2, _toConsumableArray(validateExpression({\n key: \"\".concat(key, \".\").concat(prop, \".reduce\"),\n value: reduceExpr,\n expressionContext: 'cluster-reduce'\n })));\n }\n }\n return errors;\n case 'video':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_video,\n style: style,\n styleSpec: styleSpec\n });\n case 'image':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_image,\n style: style,\n styleSpec: styleSpec\n });\n case 'canvas':\n return [new ValidationError(key, null, \"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.\", 'source.canvas')];\n default:\n return validateEnum({\n key: \"\".concat(key, \".type\"),\n value: value.type,\n valueSpec: {\n values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']\n },\n style: style,\n styleSpec: styleSpec\n });\n }\n}\nfunction validatePromoteId(_ref113) {\n var key = _ref113.key,\n value = _ref113.value;\n if (getType(value) === 'string') {\n return validateString({\n key: key,\n value: value\n });\n } else {\n var errors = [];\n for (var prop in value) {\n errors.push.apply(errors, _toConsumableArray(validateString({\n key: \"\".concat(key, \".\").concat(prop),\n value: value[prop]\n })));\n }\n return errors;\n }\n}\nfunction validateLight(options) {\n var light = options.value;\n var styleSpec = options.styleSpec;\n var lightSpec = styleSpec.light;\n var style = options.style;\n var errors = [];\n var rootType = getType(light);\n if (light === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('light', light, \"object expected, \".concat(rootType, \" found\"))]);\n return errors;\n }\n for (var key in light) {\n var transitionMatch = key.match(/^(.*)-transition$/);\n if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: key,\n value: light[key],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (lightSpec[key]) {\n errors = errors.concat(validate({\n key: key,\n value: light[key],\n valueSpec: lightSpec[key],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(key, light[key], \"unknown property \\\"\".concat(key, \"\\\"\"))]);\n }\n }\n return errors;\n}\nfunction validateTerrain(options) {\n var terrain = options.value;\n var key = options.key;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var terrainSpec = styleSpec.terrain;\n var errors = [];\n var rootType = getType(terrain);\n if (terrain === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('terrain', terrain, \"object expected, \".concat(rootType, \" found\"))]);\n return errors;\n }\n for (var _key6 in terrain) {\n var transitionMatch = _key6.match(/^(.*)-transition$/);\n if (transitionMatch && terrainSpec[transitionMatch[1]] && terrainSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: _key6,\n value: terrain[_key6],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (terrainSpec[_key6]) {\n errors = errors.concat(validate({\n key: _key6,\n value: terrain[_key6],\n valueSpec: terrainSpec[_key6],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(_key6, terrain[_key6], \"unknown property \\\"\".concat(_key6, \"\\\"\"))]);\n }\n }\n if (!terrain.source) {\n errors.push(new ValidationError(key, terrain, \"terrain is missing required property \\\"source\\\"\"));\n } else {\n var _source3 = style.sources && style.sources[terrain.source];\n var sourceType = _source3 && unbundle(_source3.type);\n if (!_source3) {\n errors.push(new ValidationError(key, terrain.source, \"source \\\"\".concat(terrain.source, \"\\\" not found\")));\n } else if (sourceType !== 'raster-dem') {\n errors.push(new ValidationError(key, terrain.source, \"terrain cannot be used with a source of type \".concat(sourceType, \", it only be used with a \\\"raster-dem\\\" source type\")));\n }\n }\n return errors;\n}\nfunction validateFog(options) {\n var fog = options.value;\n var style = options.style;\n var styleSpec = options.styleSpec;\n var fogSpec = styleSpec.fog;\n var errors = [];\n var rootType = getType(fog);\n if (fog === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('fog', fog, \"object expected, \".concat(rootType, \" found\"))]);\n return errors;\n }\n for (var key in fog) {\n var transitionMatch = key.match(/^(.*)-transition$/);\n if (transitionMatch && fogSpec[transitionMatch[1]] && fogSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: key,\n value: fog[key],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (fogSpec[key]) {\n errors = errors.concat(validate({\n key: key,\n value: fog[key],\n valueSpec: fogSpec[key],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(key, fog[key], \"unknown property \\\"\".concat(key, \"\\\"\"))]);\n }\n }\n return errors;\n}\nfunction validateFormatted(options) {\n if (validateString(options).length === 0) {\n return [];\n }\n return validateExpression(options);\n}\nfunction validateImage(options) {\n if (validateString(options).length === 0) {\n return [];\n }\n return validateExpression(options);\n}\nvar VALIDATORS = {\n '*': function _() {\n return [];\n },\n 'array': validateArray,\n 'boolean': validateBoolean,\n 'number': validateNumber,\n 'color': validateColor,\n 'constants': validateConstants,\n 'enum': validateEnum,\n 'filter': validateFilter,\n 'function': validateFunction,\n 'layer': validateLayer,\n 'object': validateObject,\n 'source': validateSource,\n 'light': validateLight,\n 'terrain': validateTerrain,\n 'fog': validateFog,\n 'string': validateString,\n 'formatted': validateFormatted,\n 'resolvedImage': validateImage\n};\nfunction validate(options) {\n var value = options.value;\n var valueSpec = options.valueSpec;\n var styleSpec = options.styleSpec;\n if (valueSpec.expression && isFunction$1(unbundle(value))) {\n return validateFunction(options);\n } else if (valueSpec.expression && isExpression(deepUnbundle(value))) {\n return validateExpression(options);\n } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n return VALIDATORS[valueSpec.type](options);\n } else {\n var valid = validateObject(extend({}, options, {\n valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n }));\n return valid;\n }\n}\nfunction validateGlyphsURL(options) {\n var value = options.value;\n var key = options.key;\n var errors = validateString(options);\n if (errors.length) return errors;\n if (value.indexOf('{fontstack}') === -1) {\n errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n }\n if (value.indexOf('{range}') === -1) {\n errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n }\n return errors;\n}\nfunction validateStyleMin(style) {\n var styleSpec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : v8;\n var errors = [];\n errors = errors.concat(validate({\n key: '',\n value: style,\n valueSpec: styleSpec.$root,\n styleSpec: styleSpec,\n style: style,\n objectElementValidators: {\n glyphs: validateGlyphsURL,\n '*': function _() {\n return [];\n }\n }\n }));\n if (style.constants) {\n errors = errors.concat(validateConstants({\n key: 'constants',\n value: style.constants,\n style: style,\n styleSpec: styleSpec\n }));\n }\n return sortErrors(errors);\n}\nvalidateStyleMin.source = wrapCleanErrors(validateSource);\nvalidateStyleMin.light = wrapCleanErrors(validateLight);\nvalidateStyleMin.terrain = wrapCleanErrors(validateTerrain);\nvalidateStyleMin.fog = wrapCleanErrors(validateFog);\nvalidateStyleMin.layer = wrapCleanErrors(validateLayer);\nvalidateStyleMin.filter = wrapCleanErrors(validateFilter);\nvalidateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty);\nvalidateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty);\nfunction sortErrors(errors) {\n return [].concat(errors).sort(function (a, b) {\n return a.line - b.line;\n });\n}\nfunction wrapCleanErrors(inner) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key7 = 0; _key7 < _len4; _key7++) {\n args[_key7] = arguments[_key7];\n }\n return sortErrors(inner.apply(this, args));\n };\n}\n\n/* parser generated by jison 0.4.15 */\n\nvar jsonlint = createCommonjsModule(function (module, exports) {\n /*\n Returns a Parser object of the following structure:\n \n Parser: {\n yy: {}\n }\n \n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n \n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n \n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n \n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n \n \n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n \n \n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n */\n var parser = function () {\n var o = function o(k, v, _o, l) {\n for (_o = _o || {}, l = k.length; l--; _o[k[l]] = v);\n return _o;\n },\n $V0 = [1, 12],\n $V1 = [1, 13],\n $V2 = [1, 9],\n $V3 = [1, 10],\n $V4 = [1, 11],\n $V5 = [1, 14],\n $V6 = [1, 15],\n $V7 = [14, 18, 22, 24],\n $V8 = [18, 22],\n $V9 = [22, 24];\n var parser = {\n trace: function trace() {},\n yy: {},\n symbols_: {\n \"error\": 2,\n \"JSONString\": 3,\n \"STRING\": 4,\n \"JSONNumber\": 5,\n \"NUMBER\": 6,\n \"JSONNullLiteral\": 7,\n \"NULL\": 8,\n \"JSONBooleanLiteral\": 9,\n \"TRUE\": 10,\n \"FALSE\": 11,\n \"JSONText\": 12,\n \"JSONValue\": 13,\n \"EOF\": 14,\n \"JSONObject\": 15,\n \"JSONArray\": 16,\n \"{\": 17,\n \"}\": 18,\n \"JSONMemberList\": 19,\n \"JSONMember\": 20,\n \":\": 21,\n \",\": 22,\n \"[\": 23,\n \"]\": 24,\n \"JSONElementList\": 25,\n \"$accept\": 0,\n \"$end\": 1\n },\n terminals_: {\n 2: \"error\",\n 4: \"STRING\",\n 6: \"NUMBER\",\n 8: \"NULL\",\n 10: \"TRUE\",\n 11: \"FALSE\",\n 14: \"EOF\",\n 17: \"{\",\n 18: \"}\",\n 21: \":\",\n 22: \",\",\n 23: \"[\",\n 24: \"]\"\n },\n productions_: [0, [3, 1], [5, 1], [7, 1], [9, 1], [9, 1], [12, 2], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [15, 2], [15, 3], [20, 3], [19, 1], [19, 3], [16, 2], [16, 3], [25, 1], [25, 3]],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n /* this == yyval */\n\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n // replace escaped characters with actual character\n this.$ = new String(yytext.replace(/\\\\(\\\\|\")/g, \"$\" + \"1\").replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\v/g, '\\v').replace(/\\\\f/g, '\\f').replace(/\\\\b/g, '\\b'));\n this.$.__line__ = this._$.first_line;\n break;\n case 2:\n this.$ = new Number(yytext);\n this.$.__line__ = this._$.first_line;\n break;\n case 3:\n this.$ = null;\n break;\n case 4:\n this.$ = new Boolean(true);\n this.$.__line__ = this._$.first_line;\n break;\n case 5:\n this.$ = new Boolean(false);\n this.$.__line__ = this._$.first_line;\n break;\n case 6:\n return this.$ = $$[$0 - 1];\n case 13:\n this.$ = {};\n Object.defineProperty(this.$, '__line__', {\n value: this._$.first_line,\n enumerable: false\n });\n break;\n case 14:\n case 19:\n this.$ = $$[$0 - 1];\n Object.defineProperty(this.$, '__line__', {\n value: this._$.first_line,\n enumerable: false\n });\n break;\n case 15:\n this.$ = [$$[$0 - 2], $$[$0]];\n break;\n case 16:\n this.$ = {};\n this.$[$$[$0][0]] = $$[$0][1];\n break;\n case 17:\n this.$ = $$[$0 - 2];\n $$[$0 - 2][$$[$0][0]] = $$[$0][1];\n break;\n case 18:\n this.$ = [];\n Object.defineProperty(this.$, '__line__', {\n value: this._$.first_line,\n enumerable: false\n });\n break;\n case 20:\n this.$ = [$$[$0]];\n break;\n case 21:\n this.$ = $$[$0 - 2];\n $$[$0 - 2].push($$[$0]);\n break;\n }\n },\n table: [{\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 12: 1,\n 13: 2,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6\n }, {\n 1: [3]\n }, {\n 14: [1, 16]\n }, o($V7, [2, 7]), o($V7, [2, 8]), o($V7, [2, 9]), o($V7, [2, 10]), o($V7, [2, 11]), o($V7, [2, 12]), o($V7, [2, 3]), o($V7, [2, 4]), o($V7, [2, 5]), o([14, 18, 21, 22, 24], [2, 1]), o($V7, [2, 2]), {\n 3: 20,\n 4: $V0,\n 18: [1, 17],\n 19: 18,\n 20: 19\n }, {\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 13: 23,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6,\n 24: [1, 21],\n 25: 22\n }, {\n 1: [2, 6]\n }, o($V7, [2, 13]), {\n 18: [1, 24],\n 22: [1, 25]\n }, o($V8, [2, 16]), {\n 21: [1, 26]\n }, o($V7, [2, 18]), {\n 22: [1, 28],\n 24: [1, 27]\n }, o($V9, [2, 20]), o($V7, [2, 14]), {\n 3: 20,\n 4: $V0,\n 20: 29\n }, {\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 13: 30,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6\n }, o($V7, [2, 19]), {\n 3: 5,\n 4: $V0,\n 5: 6,\n 6: $V1,\n 7: 3,\n 8: $V2,\n 9: 4,\n 10: $V3,\n 11: $V4,\n 13: 31,\n 15: 7,\n 16: 8,\n 17: $V5,\n 23: $V6\n }, o($V8, [2, 17]), o($V8, [2, 15]), o($V9, [2, 21])],\n defaultActions: {\n 16: [2, 6]\n },\n parseError: function parseError(str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n throw new Error(str);\n }\n },\n parse: function parse(input) {\n var self = this,\n stack = [0],\n vstack = [null],\n lstack = [],\n table = this.table,\n yytext = '',\n yylineno = 0,\n yyleng = 0,\n TERROR = 2,\n EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = {\n yy: {}\n };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function lex() {\n var token;\n token = lexer.lex() || EOF;\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol,\n state,\n action,\n r,\n yyval = {},\n p,\n len,\n newState,\n expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n }\n r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n }\n };\n /* generated by jison-lex 0.3.4 */\n var lexer = function () {\n var lexer = {\n EOF: 1,\n parseError: function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n // resets the lexer, sets new input\n setInput: function setInput(input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0, 0];\n }\n this.offset = 0;\n return this;\n },\n // consumes and returns one char from the input\n input: function input() {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n this._input = this._input.slice(1);\n return ch;\n },\n // unshifts one char (or a string) into the input\n unput: function unput(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n };\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n // When called from action, caches matched text and appends it on next action\n more: function more() {\n this._more = true;\n return this;\n },\n // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\n reject: function reject() {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n return this;\n },\n // retain first n characters of the match\n less: function less(n) {\n this.unput(this.match.slice(n));\n },\n // displays already matched input, i.e. for error messages\n pastInput: function pastInput() {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\\n/g, \"\");\n },\n // displays upcoming input, i.e. for error messages\n upcomingInput: function upcomingInput() {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20 - next.length);\n }\n return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: function showPosition() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: function test_match(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n // return next match in input\n next: function next() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n // return next match that has a token\n lex: function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: function begin(condition) {\n this.conditionStack.push(condition);\n },\n // pop the previously active lexer condition state off the condition stack\n popState: function popState() {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: function _currentRules() {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: function topState(n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n // alias for begin(condition)\n pushState: function pushState(condition) {\n this.begin(condition);\n },\n // return the number of states currently on the stack\n stateStackSize: function stateStackSize() {\n return this.conditionStack.length;\n },\n options: {},\n performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n switch ($avoiding_name_collisions) {\n case 0:\n /* skip whitespace */\n break;\n case 1:\n return 6;\n case 2:\n yy_.yytext = yy_.yytext.substr(1, yy_.yyleng - 2);\n return 4;\n case 3:\n return 17;\n case 4:\n return 18;\n case 5:\n return 23;\n case 6:\n return 24;\n case 7:\n return 22;\n case 8:\n return 21;\n case 9:\n return 10;\n case 10:\n return 11;\n case 11:\n return 8;\n case 12:\n return 14;\n case 13:\n return 'INVALID';\n }\n },\n rules: [/^(?:\\s+)/, /^(?:(-?([0-9]|[1-9][0-9]+))(\\.[0-9]+)?([eE][-+]?[0-9]+)?\\b)/, /^(?:\"(?:\\\\[\\\\\"bfnrt/]|\\\\u[a-fA-F0-9]{4}|[^\\\\\\0-\\x09\\x0a-\\x1f\"])*\")/, /^(?:\\{)/, /^(?:\\})/, /^(?:\\[)/, /^(?:\\])/, /^(?:,)/, /^(?::)/, /^(?:true\\b)/, /^(?:false\\b)/, /^(?:null\\b)/, /^(?:$)/, /^(?:.)/],\n conditions: {\n \"INITIAL\": {\n \"rules\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],\n \"inclusive\": true\n }\n }\n };\n return lexer;\n }();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n Parser.prototype = parser;\n parser.Parser = Parser;\n return new Parser();\n }();\n if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') {\n exports.parser = parser;\n exports.Parser = parser.Parser;\n exports.parse = function () {\n return parser.parse.apply(parser, arguments);\n };\n }\n});\nfunction readStyle(style) {\n if (style instanceof String || typeof style === 'string' || style instanceof Buffer) {\n try {\n return jsonlint.parse(style.toString());\n } catch (e) {\n throw new ParsingError$1(e);\n }\n }\n return style;\n}\nfunction validateStyle(style) {\n var styleSpec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : v8;\n var s = style;\n try {\n s = readStyle(s);\n } catch (e) {\n return [e];\n }\n return validateStyleMin(s, styleSpec);\n}\nvar SUPPORTED_SPEC_VERSION = 8;\nvar MAX_SOURCES_IN_STYLE = 15;\nfunction isValid(value, regex) {\n if (!value || getType(value) !== 'string') return true;\n return !!value.match(regex);\n}\nfunction getSourceCount(source) {\n if (source.url) {\n return source.url.split(',').length;\n } else {\n return 0;\n }\n}\nfunction getAllowedKeyErrors(obj, keys, path) {\n var allowed = new Set(keys);\n var errors = [];\n Object.keys(obj).forEach(function (k) {\n if (!allowed.has(k)) {\n var prop = path ? \"\".concat(path, \".\").concat(k) : null;\n errors.push(new ValidationError(prop, obj[k], \"Unsupported property \\\"\".concat(k, \"\\\"\")));\n }\n });\n return errors;\n}\nvar acceptedSourceTypes = new Set(['vector', 'raster', 'raster-dem']);\nfunction getSourceErrors(source, i) {\n var errors = [];\n var sourceKeys = ['type', 'url', 'tileSize'];\n errors.push.apply(errors, _toConsumableArray(getAllowedKeyErrors(source, sourceKeys, 'source')));\n if (!acceptedSourceTypes.has(String(source.type))) {\n errors.push(new ValidationError(\"sources[\".concat(i, \"].type\"), source.type, \"Expected one of [\".concat(Array.from(acceptedSourceTypes).join(', '), \"]\")));\n }\n var sourceUrlPattern = /^mapbox:\\/\\/([^/]*)$/;\n if (!source.url || !isValid(source.url, sourceUrlPattern)) {\n errors.push(new ValidationError(\"sources[\".concat(i, \"].url\"), source.url, 'Expected a valid Mapbox tileset url'));\n }\n return errors;\n}\nfunction getSourcesErrors(sources) {\n var errors = [];\n var count = 0;\n Object.keys(sources).forEach(function (s, i) {\n var sourceErrors = getSourceErrors(sources[s], i);\n if (!sourceErrors.length) {\n count = count + getSourceCount(sources[s]);\n }\n errors.push.apply(errors, _toConsumableArray(sourceErrors));\n });\n if (count > MAX_SOURCES_IN_STYLE) {\n errors.push(new ValidationError('sources', null, \"Styles must contain \".concat(MAX_SOURCES_IN_STYLE, \" or fewer sources\")));\n }\n return errors;\n}\nfunction getRootErrors(style, specKeys) {\n var errors = [];\n var optionalRootProperties = ['owner', 'id', 'cacheControl', 'draft', 'created', 'modified', 'visibility'];\n var allowedKeyErrors = getAllowedKeyErrors(style, [].concat(_toConsumableArray(specKeys), optionalRootProperties));\n errors.push.apply(errors, _toConsumableArray(allowedKeyErrors));\n if (style.version > SUPPORTED_SPEC_VERSION || style.version < SUPPORTED_SPEC_VERSION) {\n errors.push(new ValidationError('version', style.version, \"Style version must be \".concat(SUPPORTED_SPEC_VERSION)));\n }\n var glyphUrlPattern = /^mapbox:\\/\\/fonts\\/([^/]*)\\/{fontstack}\\/{range}.pbf$/;\n if (!isValid(style.glyphs, glyphUrlPattern)) {\n errors.push(new ValidationError('glyphs', style.glyphs, 'Styles must reference glyphs hosted by Mapbox'));\n }\n var spriteUrlPattern = /^mapbox:\\/\\/sprites\\/([^/]*)\\/([^/]*)\\/?([^/]*)?$/;\n if (!isValid(style.sprite, spriteUrlPattern)) {\n errors.push(new ValidationError('sprite', style.sprite, 'Styles must reference sprites hosted by Mapbox'));\n }\n var visibilityPattern = /^(public|private)$/;\n if (!isValid(style.visibility, visibilityPattern)) {\n errors.push(new ValidationError('visibility', style.visibility, 'Style visibility must be public or private'));\n }\n return errors;\n}\nfunction validateMapboxApiSupported(style) {\n var s = style;\n try {\n s = readStyle(s);\n } catch (e) {\n return [e];\n }\n var errors = validateStyleMin(s, v8).concat(getRootErrors(s, Object.keys(v8.$root)));\n if (s.sources) {\n errors = errors.concat(getSourcesErrors(s.sources));\n }\n return errors;\n}\nvar expression$1 = {\n StyleExpression: StyleExpression,\n isExpression: isExpression,\n isExpressionFilter: isExpressionFilter,\n createExpression: createExpression,\n createPropertyExpression: createPropertyExpression,\n normalizePropertyExpression: normalizePropertyExpression,\n ZoomConstantExpression: ZoomConstantExpression,\n ZoomDependentExpression: ZoomDependentExpression,\n StylePropertyFunction: StylePropertyFunction\n};\nvar styleFunction = {\n convertFunction: convertFunction,\n createFunction: createFunction,\n isFunction: isFunction$1\n};\nvar visit = {\n eachSource: eachSource,\n eachLayer: eachLayer,\n eachProperty: eachProperty\n};\nvalidateStyle.parsed = validateStyle;\nvalidateStyle.latest = validateStyle;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! ./../../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvanNvbi1zdHJpbmdpZnktcHJldHR5LWNvbXBhY3QvaW5kZXguanM/NzQzNSIsIndlYnBhY2s6Ly9HcC8uLi9mb3JtYXQuanM/MDNmYiIsIndlYnBhY2s6Ly9HcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdXJsL25vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcz8wM2EzIiwid2VicGFjazovL0dwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy91cmwvdXRpbC5qcz83NWZhIiwid2VicGFjazovL0dwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy9kZWNvZGUuanM/MWI2YSIsIndlYnBhY2s6Ly9HcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmcvZW5jb2RlLmpzPzkzZjciLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nL2luZGV4LmpzPzEyMzYiLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VybC91cmwuanM/NWU5MiIsIndlYnBhY2s6Ly9HcC8uLi92aXNpdC5qcz85OGZkIiwid2VicGFjazovL0dwLy4uL21pZ3JhdGUvdjguanM/NWRiMiIsIndlYnBhY2s6Ly9HcC8uLi91dGlsL2V4dGVuZC5qcz9iY2FjIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vcGFyc2luZ19lcnJvci5qcz83MGY0Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vc2NvcGUuanM/YzAzNyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3R5cGVzLmpzP2Y5NTUiLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzPzIzMDYiLCJ3ZWJwYWNrOi8vR3AvLi4vdXRpbC9jb2xvci5qcz8zZGE0Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vdHlwZXMvY29sbGF0b3IuanM/MzM0MyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcz9lMGM4Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanM/NGI2OCIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3ZhbHVlcy5qcz82NmMxIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGl0ZXJhbC5qcz85NTFjIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vcnVudGltZV9lcnJvci5qcz85NTUzIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uLmpzPzJiYzUiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9mb3JtYXQuanM/ZjBlOSIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL2ltYWdlLmpzP2YwYWQiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2VyY2lvbi5qcz8wNzI2Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZXZhbHVhdGlvbl9jb250ZXh0LmpzP2NhNmEiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uLmpzPzQyN2UiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2xsYXRvci5qcz9lNzlmIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvd2l0aGluLmpzPzM0NWQiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9pc19jb25zdGFudC5qcz9iNTNjIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvdmFyLmpzPzI5YjUiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9wYXJzaW5nX2NvbnRleHQuanM/OGJhNCIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL3N0b3BzLmpzPzU4MDQiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zdGVwLmpzP2I3NjMiLCJ3ZWJwYWNrOi8vR3AvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdW5pdGJlemllci9pbmRleC5qcz81MTBlIiwid2VicGFjazovL0dwLy4uL3V0aWwvaW50ZXJwb2xhdGUuanM/ZDZlNyIsIndlYnBhY2s6Ly9HcC8uLi91dGlsL2NvbG9yX3NwYWNlcy5qcz83ZjNhIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUuanM/ZDE5ZiIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzP2ZhMTIiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZXQuanM/Y2NkYyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL2F0LmpzP2IyZDYiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbi5qcz9jYjFmIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXhfb2YuanM/NTRlMyIsIndlYnBhY2s6Ly9HcC8uLi9leHByZXNzaW9uL2RlZmluaXRpb25zL21hdGNoLmpzPzdlODIiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jYXNlLmpzP2YyYjMiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zbGljZS5qcz8wZGRhIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29tcGFyaXNvbi5qcz85Njg3Iiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbnVtYmVyX2Zvcm1hdC5qcz8wZjJlIiwid2VicGFjazovL0dwLy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGVuZ3RoLmpzPzU5MWMiLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbmRleC5qcz8yZjExIiwid2VicGFjazovL0dwLy4uL3V0aWwvcmVzdWx0LmpzP2NiNzkiLCJ3ZWJwYWNrOi8vR3AvLi4vdXRpbC9wcm9wZXJ0aWVzLmpzPzIyY2MiLCJ3ZWJwYWNrOi8vR3AvLi4vdXRpbC9nZXRfdHlwZS5qcz9jOTJiIiwid2VicGFjazovL0dwLy4uL2Z1bmN0aW9uL2luZGV4LmpzPzRjOTciLCJ3ZWJwYWNrOi8vR3AvLi4vZXhwcmVzc2lvbi9pbmRleC5qcz9kMDQ1Iiwid2VicGFjazovL0dwLy4uL2Z1bmN0aW9uL2NvbnZlcnQuanM/Njk4ZSIsIndlYnBhY2s6Ly9HcC8uLi9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcz83NzdhIiwid2VicGFjazovL0dwLy4uL2ZlYXR1cmVfZmlsdGVyL2NvbnZlcnQuanM/MWFhYiIsIndlYnBhY2s6Ly9HcC8uLi9taWdyYXRlL2V4cHJlc3Npb25zLmpzPzZmZmQiLCJ3ZWJwYWNrOi8vR3AvLi4vbWlncmF0ZS5qcz80ZmY3Iiwid2VicGFjazovL0dwLy4uL2NvbXBvc2l0ZS5qcz8xOTNiIiwid2VicGFjazovL0dwLy4uL3V0aWwvcmVmX3Byb3BlcnRpZXMuanM/MjYzMSIsIndlYnBhY2s6Ly9HcC8uLi9kZXJlZi5qcz8wMTU4Iiwid2VicGFjazovL0dwLy4uL3V0aWwvZGVlcF9lcXVhbC5qcz9jZjc2Iiwid2VicGFjazovL0dwLy4uL2RpZmYuanM/ZDlmMiIsIndlYnBhY2s6Ly9HcC8uLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzPzE1NWMiLCJ3ZWJwYWNrOi8vR3AvLi4vZXJyb3IvcGFyc2luZ19lcnJvci5qcz9lZTdkIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbnN0YW50cy5qcz8yNTM1Iiwid2VicGFjazovL0dwLy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanM/ZDc4NiIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QuanM/YzUyMSIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS5qcz8zNjEzIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci5qcz8xNGVmIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLmpzP2ZiN2IiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfZXhwcmVzc2lvbi5qcz80MjI1Iiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4uanM/YzEzMyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9jb2xvci5qcz8xZDFkIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0uanM/MjJkNyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXIuanM/NTQ2YiIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9wcm9wZXJ0eS5qcz9mYTUyIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5LmpzPzczOWUiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzP2M5MjQiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXIuanM/ZDViOSIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9zdHJpbmcuanM/YjdiYSIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9zb3VyY2UuanM/ODk4NyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9saWdodC5qcz82YzQ3Iiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlX3RlcnJhaW4uanM/MmJiYiIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9mb2cuanM/NTlhOCIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9mb3JtYXR0ZWQuanM/OTEyMyIsIndlYnBhY2s6Ly9HcC8uLi92YWxpZGF0ZS92YWxpZGF0ZV9pbWFnZS5qcz81ZDJlIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlL3ZhbGlkYXRlLmpzPzFmYzYiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcz9mMjhiIiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlX3N0eWxlLm1pbi5qcz82NmY1Iiwid2VicGFjazovL0dwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2pzb25saW50LWxpbmVzLXByaW1pdGl2ZXMvbGliL2pzb25saW50LmpzP2ZiOTciLCJ3ZWJwYWNrOi8vR3AvLi4vcmVhZF9zdHlsZS5qcz9kMWI4Iiwid2VicGFjazovL0dwLy4uL3ZhbGlkYXRlX3N0eWxlLmpzP2YyMGEiLCJ3ZWJwYWNrOi8vR3AvLi4vdmFsaWRhdGVfbWFwYm94X2FwaV9zdXBwb3J0ZWQuanM/M2I2ZSIsIndlYnBhY2s6Ly9HcC8uLi9zdHlsZS1zcGVjLmpzP2Q4ZGUiXSwibmFtZXMiOlsic3RyaW5nT3JDaGFyIiwianNvblN0cmluZ2lmeVByZXR0eUNvbXBhY3QiLCJzdHJpbmdpZnkiLCJwYXNzZWRPYmoiLCJvcHRpb25zIiwiaW5kZW50IiwibWF4TGVuZ3RoIiwicmVwbGFjZXIiLCJKU09OIiwidW5kZWZpbmVkIiwic2xpY2UiLCJJbmZpbml0eSIsIl9zdHJpbmdpZnkiLCJvYmoiLCJjdXJyZW50SW5kZW50IiwicmVzZXJ2ZWQiLCJlbmQiLCJpbmRleCIsIml0ZW1zIiwia2V5Iiwia2V5UGFydCIsImtleXMiLCJsZW5ndGgiLCJuZXh0SW5kZW50IiwicHJldHRpZmllZCIsInN0YXJ0Iiwic3RyaW5nIiwidmFsdWUiLCJ0b0pTT04iLCJyZXBsYWNlIiwibWF0Y2giLCJzdHJpbmdMaXRlcmFsIiwicGFyc2UiLCJfdHlwZW9mIiwiQXJyYXkiLCJpc0FycmF5IiwicHVzaCIsIk9iamVjdCIsImpvaW4iLCJzb3J0S2V5c0J5IiwicmVmZXJlbmNlIiwicmVzdWx0IiwiZm9ybWF0Iiwic3R5bGUiLCJzcGFjZSIsImFyZ3VtZW50cyIsInY4IiwiJHJvb3QiLCJsYXllcnMiLCJtYXAiLCJsYXllciIsInJvb3QiLCJmcmVlRXhwb3J0cyIsImV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJtb2R1bGUiLCJmcmVlR2xvYmFsIiwiY29tbW9uanNHbG9iYWwiLCJnbG9iYWwiLCJ3aW5kb3ciLCJzZWxmIiwicHVueWNvZGUiLCJtYXhJbnQiLCJiYXNlIiwidE1pbiIsInRNYXgiLCJza2V3IiwiZGFtcCIsImluaXRpYWxCaWFzIiwiaW5pdGlhbE4iLCJkZWxpbWl0ZXIiLCJyZWdleFB1bnljb2RlIiwicmVnZXhOb25BU0NJSSIsInJlZ2V4U2VwYXJhdG9ycyIsImVycm9ycyIsImJhc2VNaW51c1RNaW4iLCJmbG9vciIsIk1hdGgiLCJzdHJpbmdGcm9tQ2hhckNvZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJlcnJvciIsInR5cGUiLCJSYW5nZUVycm9yIiwiYXJyYXkiLCJmbiIsIm1hcERvbWFpbiIsInBhcnRzIiwic3BsaXQiLCJsYWJlbHMiLCJlbmNvZGVkIiwidWNzMmRlY29kZSIsIm91dHB1dCIsImNvdW50ZXIiLCJleHRyYSIsImNoYXJDb2RlQXQiLCJ1Y3MyZW5jb2RlIiwiYmFzaWNUb0RpZ2l0IiwiY29kZVBvaW50IiwiZGlnaXRUb0Jhc2ljIiwiZGlnaXQiLCJmbGFnIiwiYWRhcHQiLCJkZWx0YSIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImsiLCJkZWNvZGUiLCJpbnB1dCIsImlucHV0TGVuZ3RoIiwib3V0IiwiaSIsIm4iLCJiaWFzIiwiYmFzaWMiLCJqIiwib2xkaSIsInciLCJ0IiwiYmFzZU1pbnVzVCIsImxhc3RJbmRleE9mIiwic3BsaWNlIiwiZW5jb2RlIiwiaGFuZGxlZENQQ291bnQiLCJiYXNpY0xlbmd0aCIsIm0iLCJxIiwiY3VycmVudFZhbHVlIiwiaGFuZGxlZENQQ291bnRQbHVzT25lIiwicU1pbnVzVCIsInRvVW5pY29kZSIsInRlc3QiLCJ0b0xvd2VyQ2FzZSIsInRvQVNDSUkiLCJoYXNPd25Qcm9wZXJ0eSIsInV0aWwiLCJpc1N0cmluZyIsImFyZyIsImlzT2JqZWN0IiwiaXNOdWxsIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJwcm9wIiwicHJvdG90eXBlIiwiY2FsbCIsInFzIiwic2VwIiwiZXEiLCJyZWdleHAiLCJtYXhLZXlzIiwibGVuIiwieCIsImlkeCIsImluZGV4T2YiLCJrc3RyIiwidnN0ciIsInYiLCJzdWJzdHIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdHJpbmdpZnlQcmltaXRpdmUiLCJpc0Zpbml0ZSIsIm5hbWUiLCJrcyIsImVuY29kZVVSSUNvbXBvbmVudCIsInVybFBhcnNlIiwicmVzb2x2ZSIsInVybFJlc29sdmUiLCJyZXNvbHZlT2JqZWN0IiwidXJsUmVzb2x2ZU9iamVjdCIsImZvcm1hdCQxIiwidXJsRm9ybWF0IiwiVXJsXzEiLCJVcmwiLCJwcm90b2NvbCIsInNsYXNoZXMiLCJhdXRoIiwiaG9zdCIsInBvcnQiLCJob3N0bmFtZSIsImhhc2giLCJzZWFyY2giLCJxdWVyeSIsInBhdGhuYW1lIiwicGF0aCIsImhyZWYiLCJwcm90b2NvbFBhdHRlcm4iLCJwb3J0UGF0dGVybiIsInNpbXBsZVBhdGhQYXR0ZXJuIiwiZGVsaW1zIiwidW53aXNlIiwiY29uY2F0IiwiYXV0b0VzY2FwZSIsIm5vbkhvc3RDaGFycyIsImhvc3RFbmRpbmdDaGFycyIsImhvc3RuYW1lTWF4TGVuIiwiaG9zdG5hbWVQYXJ0UGF0dGVybiIsImhvc3RuYW1lUGFydFN0YXJ0IiwidW5zYWZlUHJvdG9jb2wiLCJob3N0bGVzc1Byb3RvY29sIiwic2xhc2hlZFByb3RvY29sIiwidXJsIiwicGFyc2VRdWVyeVN0cmluZyIsInNsYXNoZXNEZW5vdGVIb3N0IiwidSIsIlR5cGVFcnJvciIsInF1ZXJ5SW5kZXgiLCJzcGxpdHRlciIsInVTcGxpdCIsInNsYXNoUmVnZXgiLCJyZXN0IiwidHJpbSIsInNpbXBsZVBhdGgiLCJleGVjIiwicXVlcnlzdHJpbmciLCJwcm90byIsImxvd2VyUHJvdG8iLCJob3N0RW5kIiwiaGVjIiwiYXRTaWduIiwicGFyc2VIb3N0IiwiaXB2Nkhvc3RuYW1lIiwiaG9zdHBhcnRzIiwibCIsInBhcnQiLCJuZXdwYXJ0IiwidmFsaWRQYXJ0cyIsIm5vdEhvc3QiLCJiaXQiLCJ1bnNoaWZ0IiwicCIsImgiLCJhZSIsImVzYyIsImVzY2FwZSIsInFtIiwicyIsImNoYXJBdCIsInNvdXJjZSIsInJlbGF0aXZlIiwicmVsIiwidGtleXMiLCJ0ayIsInRrZXkiLCJya2V5cyIsInJrIiwicmtleSIsInJlbFBhdGgiLCJzaGlmdCIsImlzU291cmNlQWJzIiwiaXNSZWxBYnMiLCJtdXN0RW5kQWJzIiwicmVtb3ZlQWxsRG90cyIsInNyY1BhdGgiLCJwc3ljaG90aWMiLCJwb3AiLCJhdXRoSW5Ib3N0IiwibGFzdCIsImhhc1RyYWlsaW5nU2xhc2giLCJ1cCIsImlzQWJzb2x1dGUiLCJnZXRQcm9wZXJ0eVJlZmVyZW5jZSIsInByb3BlcnR5TmFtZSIsImxheW91dCIsInBhaW50IiwiZWFjaFNvdXJjZSIsImNhbGxiYWNrIiwic291cmNlcyIsImVhY2hMYXllciIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJkb25lIiwiZXJyIiwiZSIsImYiLCJlYWNoUHJvcGVydHkiLCJpbm5lciIsInByb3BlcnR5VHlwZSIsInByb3BlcnRpZXMiLCJmb3JFYWNoIiwiaWQiLCJzZXQiLCJlYWNoTGF5b3V0IiwiZWFjaFBhaW50IiwicmVzb2x2ZUNvbnN0YW50IiwiY29uc3RhbnRzIiwiaXNGdW5jdGlvbiIsInN0b3BzIiwicmVuYW1lUHJvcGVydHkiLCJmcm9tIiwidG8iLCJtaWdyYXRlVG9WOCIsInZlcnNpb24iLCJjb29yZGluYXRlcyIsImNvb3JkIiwicmV2ZXJzZSIsInByb3BlcnR5Iiwic3RvcCIsIm1pZ3JhdGVGb250c3RhY2tVUkwiLCJpbnB1dFBhcnNlZCIsImlucHV0UGF0aG5hbWVQYXJ0cyIsImdseXBocyIsIm1pZ3JhdGVGb250U3RhY2siLCJmb250Iiwic3BsaXRBbmRUcmltIiwiRXJyb3IiLCJmaXJzdFN5bWJvbExheWVyIiwic3ltYm9sTGF5ZXJzIiwiZXh0ZW5kIiwiX2xlbiIsImlucHV0cyIsIl9rZXkzIiwiX2kyIiwiX2lucHV0cyIsIlBhcnNpbmdFcnJvciIsIl9FcnJvciIsIm1lc3NhZ2UiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJfd3JhcE5hdGl2ZVN1cGVyIiwiU2NvcGUiLCJwYXJlbnQiLCJiaW5kaW5ncyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJfc2xpY2VkVG9BcnJheSIsImV4cHJlc3Npb24iLCJnZXQiLCJoYXMiLCJOdWxsVHlwZSIsImtpbmQiLCJOdW1iZXJUeXBlIiwiU3RyaW5nVHlwZSIsIkJvb2xlYW5UeXBlIiwiQ29sb3JUeXBlIiwiT2JqZWN0VHlwZSIsIlZhbHVlVHlwZSIsIkVycm9yVHlwZSIsIkNvbGxhdG9yVHlwZSIsIkZvcm1hdHRlZFR5cGUiLCJSZXNvbHZlZEltYWdlVHlwZSIsIml0ZW1UeXBlIiwiTiIsInRvU3RyaW5nIiwidmFsdWVNZW1iZXJUeXBlcyIsImNoZWNrU3VidHlwZSIsImV4cGVjdGVkIiwiX2kzIiwiX3ZhbHVlTWVtYmVyVHlwZXMiLCJtZW1iZXJUeXBlIiwiaXNWYWxpZFR5cGUiLCJwcm92aWRlZCIsImFsbG93ZWRUeXBlcyIsInNvbWUiLCJpc1ZhbGlkTmF0aXZlVHlwZSIsImtDU1NDb2xvclRhYmxlIiwiY2xhbXBfY3NzX2J5dGUiLCJyb3VuZCIsImNsYW1wX2Nzc19mbG9hdCIsInBhcnNlX2Nzc19pbnQiLCJzdHIiLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJwYXJzZV9jc3NfZmxvYXQiLCJjc3NfaHVlX3RvX3JnYiIsIm0xIiwibTIiLCJwYXJzZUNTU0NvbG9yIiwiY3NzX3N0ciIsIml2Iiwib3AiLCJlcCIsImZuYW1lIiwicGFyYW1zIiwiYWxwaGEiLCJDb2xvciIsInIiLCJnIiwiYiIsImEiLCJfdGhpcyR0b0FycmF5IiwidG9BcnJheSIsIl90aGlzJHRvQXJyYXkyIiwicmdiYSIsImNzc2NvbG9ycGFyc2VyIiwiYmxhY2siLCJ3aGl0ZSIsInRyYW5zcGFyZW50IiwicmVkIiwiYmx1ZSIsIkNvbGxhdG9yIiwiY2FzZVNlbnNpdGl2ZSIsImRpYWNyaXRpY1NlbnNpdGl2ZSIsImxvY2FsZSIsInNlbnNpdGl2aXR5IiwiY29sbGF0b3IiLCJJbnRsIiwidXNhZ2UiLCJjb21wYXJlIiwibGhzIiwicmhzIiwicmVzb2x2ZWRMb2NhbGUiLCJyZXNvbHZlZE9wdGlvbnMiLCJGb3JtYXR0ZWRTZWN0aW9uIiwidGV4dCIsImltYWdlIiwic2NhbGUiLCJmb250U3RhY2siLCJ0ZXh0Q29sb3IiLCJGb3JtYXR0ZWQiLCJzZWN0aW9ucyIsImlzRW1wdHkiLCJzZWN0aW9uIiwic2VyaWFsaXplIiwic2VyaWFsaXplZCIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJmcm9tU3RyaW5nIiwidW5mb3JtYXR0ZWQiLCJmYWN0b3J5IiwiUmVzb2x2ZWRJbWFnZSIsImF2YWlsYWJsZSIsInZhbGlkYXRlUkdCQSIsImlzVmFsdWUiLCJtaXhlZCIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJpdGVtIiwidHlwZU9mIiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsInRvU3RyaW5nJDEiLCJMaXRlcmFsIiwiZXZhbHVhdGUiLCJlYWNoQ2hpbGQiLCJvdXRwdXREZWZpbmVkIiwiYXJncyIsImNvbnRleHQiLCJleHBlY3RlZFR5cGUiLCJSdW50aW1lRXJyb3IiLCJ0eXBlcyIsIm51bWJlciIsIm9iamVjdCIsIkFzc2VydGlvbiIsImN0eCIsImV2ZXJ5IiwicGFyc2VkIiwiRm9ybWF0RXhwcmVzc2lvbiIsImV2YWx1YXRlU2VjdGlvbiIsImV2YWx1YXRlZENvbnRlbnQiLCJjb250ZW50IiwiX2l0ZXJhdG9yNiIsIl9zdGVwNiIsIl9pdGVyYXRvcjciLCJfc3RlcDciLCJmaXJzdEFyZyIsIm5leHRUb2tlbk1heUJlT2JqZWN0IiwibGFzdEV4cHJlc3Npb24iLCJJbWFnZUV4cHJlc3Npb24iLCJldmFsdWF0ZWRJbWFnZU5hbWUiLCJhdmFpbGFibGVJbWFnZXMiLCJ0eXBlcyQxIiwiQ29lcmNpb24iLCJCb29sZWFuIiwiX2l0ZXJhdG9yOCIsIl9zdGVwOCIsImMiLCJwYXJzZUNvbG9yIiwiX2l0ZXJhdG9yOSIsIl9zdGVwOSIsIm51bSIsIk51bWJlciIsImlzTmFOIiwiY2hpbGQiLCJnZW9tZXRyeVR5cGVzIiwiRXZhbHVhdGlvbkNvbnRleHQiLCJnbG9iYWxzIiwiZmVhdHVyZSIsImZlYXR1cmVTdGF0ZSIsImZvcm1hdHRlZFNlY3Rpb24iLCJfcGFyc2VDb2xvckNhY2hlIiwiY2Fub25pY2FsIiwiZ2VvbWV0cnlUeXBlIiwiZ2VvbWV0cnkiLCJjYW5vbmljYWxJRCIsImNhY2hlZCIsIkNvbXBvdW5kRXhwcmVzc2lvbiIsIl9ldmFsdWF0ZSIsImRlZmluaXRpb24iLCJkZWZpbml0aW9ucyIsImF2YWlsYWJsZU92ZXJsb2FkcyIsIm92ZXJsb2FkcyIsImZpbHRlciIsIl9yZWYiLCJfcmVmMiIsInNpZ25hdHVyZSIsInNpZ25hdHVyZUNvbnRleHQiLCJfaXRlcmF0b3IxMCIsIl9zdGVwMTAiLCJfc3RlcDEwJHZhbHVlIiwiUGFyc2luZ0NvbnRleHQiLCJyZWdpc3RyeSIsInNjb3BlIiwicGFyc2VkQXJncyIsImFyZ1BhcnNlRmFpbGVkIiwiX2NvbnRleHQkZXJyb3JzIiwiYXBwbHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzaWduYXR1cmVzIiwiX3JlZjMiLCJfcmVmNCIsInN0cmluZ2lmeVNpZ25hdHVyZSIsImFjdHVhbFR5cGVzIiwicmVnaXN0ZXIiLCJDb2xsYXRvckV4cHJlc3Npb24iLCJFWFRFTlQiLCJ1cGRhdGVCQm94IiwiYmJveCIsIm1pbiIsIm1heCIsIm1lcmNhdG9yWGZyb21MbmciLCJsbmciLCJtZXJjYXRvcllmcm9tTGF0IiwibGF0IiwiUEkiLCJsb2ciLCJ0YW4iLCJib3hXaXRoaW5Cb3giLCJiYm94MSIsImJib3gyIiwiZ2V0VGlsZUNvb3JkaW5hdGVzIiwieSIsInRpbGVzQXRab29tIiwicG93IiwieiIsIm9uQm91bmRhcnkiLCJwMSIsInAyIiwieDEiLCJ5MSIsIngyIiwieTIiLCJyYXlJbnRlcnNlY3QiLCJwb2ludFdpdGhpblBvbHlnb24iLCJwb2ludCIsInJpbmdzIiwiaW5zaWRlIiwicmluZyIsImxlbjIiLCJwb2ludFdpdGhpblBvbHlnb25zIiwicG9seWdvbnMiLCJwZXJwIiwidjEiLCJ2MiIsInR3b1NpZGVkIiwicTEiLCJxMiIsIngzIiwieTMiLCJkZXQxIiwiZGV0MiIsImxpbmVJbnRlcnNlY3RMaW5lIiwiZCIsInZlY3RvclAiLCJ2ZWN0b3JRIiwibGluZUludGVyc2VjdFBvbHlnb24iLCJwb2x5Z29uIiwiX2l0ZXJhdG9yMTEiLCJfc3RlcDExIiwibGluZVN0cmluZ1dpdGhpblBvbHlnb24iLCJsaW5lIiwibGluZVN0cmluZ1dpdGhpblBvbHlnb25zIiwiZ2V0VGlsZVBvbHlnb24iLCJnZXRUaWxlUG9seWdvbnMiLCJ1cGRhdGVQb2ludCIsInBvbHlCQm94Iiwid29ybGRTaXplIiwiaGFsZldvcmxkU2l6ZSIsInJlc2V0QkJveCIsImdldFRpbGVQb2ludHMiLCJwb2ludEJCb3giLCJzaGlmdHMiLCJ0aWxlUG9pbnRzIiwiX2l0ZXJhdG9yMTIiLCJfc3RlcDEyIiwicG9pbnRzIiwiX2l0ZXJhdG9yMTMiLCJfc3RlcDEzIiwiZ2V0VGlsZUxpbmVzIiwibGluZUJCb3giLCJ0aWxlTGluZXMiLCJfaXRlcmF0b3IxNCIsIl9zdGVwMTQiLCJ0aWxlTGluZSIsIl9pdGVyYXRvcjE3IiwiX3N0ZXAxNyIsIl9pdGVyYXRvcjE1IiwiX3N0ZXAxNSIsIl9pdGVyYXRvcjE2IiwiX3N0ZXAxNiIsInBvaW50c1dpdGhpblBvbHlnb25zIiwicG9seWdvbkdlb21ldHJ5IiwidGlsZVBvbHlnb24iLCJfaXRlcmF0b3IxOCIsIl9zdGVwMTgiLCJ0aWxlUG9seWdvbnMiLCJfaXRlcmF0b3IxOSIsIl9zdGVwMTkiLCJsaW5lc1dpdGhpblBvbHlnb25zIiwiX2l0ZXJhdG9yMjAiLCJfc3RlcDIwIiwiX2l0ZXJhdG9yMjEiLCJfc3RlcDIxIiwiV2l0aGluIiwiZ2VvanNvbiIsImdlb21ldHJpZXMiLCJmZWF0dXJlcyIsImlzRmVhdHVyZUNvbnN0YW50IiwiaXNTdGF0ZUNvbnN0YW50IiwiaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50IiwiVmFyIiwiYm91bmRFeHByZXNzaW9uIiwiZXhwciIsIl9wYXJzZSIsImFubm90YXRlIiwidHlwZUFubm90YXRpb24iLCJFeHByIiwiYWN0dWFsIiwiaXNDb25zdGFudCIsImVjIiwiX2xlbjIiLCJfa2V5NCIsImlzVHlwZUFubm90YXRpb24iLCJjaGlsZHJlbkNvbnN0YW50IiwiZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyIsImxhc3RJbmRleCIsImxvd2VySW5kZXgiLCJ1cHBlckluZGV4IiwiY3VycmVudEluZGV4IiwibmV4dFZhbHVlIiwiU3RlcCIsIm91dHB1dHMiLCJfaXRlcmF0b3IyMiIsIl9zdGVwMjIiLCJfc3RlcDIyJHZhbHVlIiwibGFiZWwiLCJzdG9wQ291bnQiLCJfaXRlcmF0b3IyMyIsIl9zdGVwMjMiLCJvdXRwdXRUeXBlIiwibGFiZWxLZXkiLCJ2YWx1ZUtleSIsInVuaXRiZXppZXIiLCJVbml0QmV6aWVyIiwicDF4IiwicDF5IiwicDJ4IiwicDJ5IiwiY3giLCJieCIsImF4IiwiY3kiLCJieSIsImF5Iiwic2FtcGxlQ3VydmVYIiwic2FtcGxlQ3VydmVZIiwic2FtcGxlQ3VydmVEZXJpdmF0aXZlWCIsInNvbHZlQ3VydmVYIiwiZXBzaWxvbiIsInQwIiwidDEiLCJ0MiIsImFicyIsImQyIiwic29sdmUiLCJjb2xvciIsImFycmF5JDEiLCJYbiIsIlluIiwiWm4iLCJ0MyIsImRlZzJyYWQiLCJyYWQyZGVnIiwieHl6MmxhYiIsImxhYjJ4eXoiLCJ4eXoycmdiIiwicmdiMnh5eiIsInJnYlRvTGFiIiwicmdiQ29sb3IiLCJsYWJUb1JnYiIsImxhYkNvbG9yIiwiaW50ZXJwb2xhdGVMYWIiLCJyZ2JUb0hjbCIsIl9yZ2JUb0xhYiIsImF0YW4yIiwic3FydCIsImhjbFRvUmdiIiwiaGNsQ29sb3IiLCJjb3MiLCJzaW4iLCJpbnRlcnBvbGF0ZUh1ZSIsImludGVycG9sYXRlSGNsIiwibGFiIiwiZm9yd2FyZCIsImludGVycG9sYXRlIiwiaGNsIiwiSW50ZXJwb2xhdGUiLCJvcGVyYXRvciIsImludGVycG9sYXRpb24iLCJfaXRlcmF0b3IyNCIsIl9zdGVwMjQiLCJfc3RlcDI0JHZhbHVlIiwibG93ZXIiLCJ1cHBlciIsImludGVycG9sYXRpb25GYWN0b3IiLCJvdXRwdXRMb3dlciIsIm91dHB1dFVwcGVyIiwiX2l0ZXJhdG9yMjUiLCJfc3RlcDI1IiwiY29udHJvbFBvaW50cyIsImV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbiIsInViIiwiX2FyZ3MiLCJfdG9BcnJheSIsImxvd2VyVmFsdWUiLCJ1cHBlclZhbHVlIiwiZGlmZmVyZW5jZSIsInByb2dyZXNzIiwiQ29hbGVzY2UiLCJhcmdDb3VudCIsInJlcXVlc3RlZEltYWdlTmFtZSIsIl9pdGVyYXRvcjI2IiwiX3N0ZXAyNiIsIl9pdGVyYXRvcjI3IiwiX3N0ZXAyNyIsIm5lZWRzQW5ub3RhdGlvbiIsIkxldCIsIl9pdGVyYXRvcjI4IiwiX3N0ZXAyOCIsImJpbmRpbmciLCJfaXRlcmF0b3IyOSIsIl9zdGVwMjkiLCJfc3RlcDI5JHZhbHVlIiwiQXQiLCJJbiIsIm5lZWRsZSIsImhheXN0YWNrIiwiSW5kZXhPZiIsImZyb21JbmRleCIsIk1hdGNoIiwiaW5wdXRUeXBlIiwiY2FzZXMiLCJvdGhlcndpc2UiLCJfdGhpczIiLCJzb3J0ZWRMYWJlbHMiLCJzb3J0IiwiZ3JvdXBlZEJ5T3V0cHV0Iiwib3V0cHV0TG9va3VwIiwiX2l0ZXJhdG9yMzAiLCJfc3RlcDMwIiwib3V0cHV0SW5kZXgiLCJjb2VyY2VMYWJlbCIsIl9pNyIsIl9ncm91cGVkQnlPdXRwdXQiLCJfZ3JvdXBlZEJ5T3V0cHV0JF9pIiwibGFiZWxDb250ZXh0IiwiX2l0ZXJhdG9yMzEiLCJfc3RlcDMxIiwiTUFYX1NBRkVfSU5URUdFUiIsIkNhc2UiLCJicmFuY2hlcyIsIl9pdGVyYXRvcjMyIiwiX3N0ZXAzMiIsIl9zdGVwMzIkdmFsdWUiLCJfaXRlcmF0b3IzMyIsIl9zdGVwMzMiLCJfc3RlcDMzJHZhbHVlIiwiX3JlZjUiLCJfcmVmNiIsIl8iLCJTbGljZSIsImJlZ2luSW5kZXgiLCJlbmRJbmRleCIsImlzQ29tcGFyYWJsZVR5cGUiLCJuZXEiLCJsdCIsImd0IiwibHRlcSIsImd0ZXEiLCJlcUNvbGxhdGUiLCJuZXFDb2xsYXRlIiwibHRDb2xsYXRlIiwiZ3RDb2xsYXRlIiwibHRlcUNvbGxhdGUiLCJndGVxQ29sbGF0ZSIsIm1ha2VDb21wYXJpc29uIiwiY29tcGFyZUJhc2ljIiwiY29tcGFyZVdpdGhDb2xsYXRvciIsImlzT3JkZXJDb21wYXJpc29uIiwiQ29tcGFyaXNvbiIsImhhc1VudHlwZWRBcmd1bWVudCIsInJ0IiwiRXF1YWxzIiwiTm90RXF1YWxzIiwiTGVzc1RoYW4iLCJHcmVhdGVyVGhhbiIsIkxlc3NUaGFuT3JFcXVhbCIsIkdyZWF0ZXJUaGFuT3JFcXVhbCIsIk51bWJlckZvcm1hdCIsImN1cnJlbmN5IiwibWluRnJhY3Rpb25EaWdpdHMiLCJtYXhGcmFjdGlvbkRpZ2l0cyIsIm1pbmltdW1GcmFjdGlvbkRpZ2l0cyIsIm1heGltdW1GcmFjdGlvbkRpZ2l0cyIsIkxlbmd0aCIsImV4cHJlc3Npb25zIiwiX3JlZjciLCJfcmVmOCIsImJpbmFyeVNlYXJjaCIsInZhcmFyZ3MiLCJfcmVmOSIsIl9yZWYxMCIsIl9yZWYxMSIsIl9yZWYxMiIsIl9yZWYxMyIsIl9yZWYxNCIsIl9yZWYxNSIsIl9yZWYxNiIsIl9yZWYxNyIsIl9yZWYxOCIsIl9yZWYxOSIsIl9yZWYyMCIsIl9yZWYyMSIsIl9yZWYyMiIsIl9yZWYyMyIsIl9yZWYyNCIsInpvb20iLCJoZWF0bWFwRGVuc2l0eSIsImxpbmVQcm9ncmVzcyIsInNreVJhZGlhbFByb2dyZXNzIiwiYWNjdW11bGF0ZWQiLCJfaXRlcmF0b3IzNCIsIl9zdGVwMzQiLCJfaXRlcmF0b3IzNSIsIl9zdGVwMzUiLCJfcmVmMjUiLCJfcmVmMjYiLCJfcmVmMjciLCJfcmVmMjgiLCJfcmVmMjkiLCJfcmVmMzAiLCJfcmVmMzEiLCJfcmVmMzIiLCJMTjIiLCJFIiwiX3JlZjMzIiwiX3JlZjM0IiwiX3JlZjM1IiwiX3JlZjM2IiwiX3JlZjM3IiwiX3JlZjM4IiwiTE4xMCIsIl9yZWYzOSIsIl9yZWY0MCIsIl9yZWY0MSIsIl9yZWY0MiIsIl9yZWY0MyIsIl9yZWY0NCIsIl9yZWY0NSIsIl9yZWY0NiIsIl9yZWY0NyIsIl9yZWY0OCIsIl9yZWY0OSIsIl9yZWY1MCIsImFzaW4iLCJfcmVmNTEiLCJfcmVmNTIiLCJhY29zIiwiX3JlZjUzIiwiX3JlZjU0IiwiYXRhbiIsIl9yZWY1NSIsIl9yZWY1NiIsIl9yZWY1NyIsIl9yZWY1OCIsIl9yZWY1OSIsIl9yZWY2MCIsIl9yZWY2MSIsIl9yZWY2MiIsImNlaWwiLCJfcmVmNjMiLCJfcmVmNjQiLCJfcmVmNjUiLCJfcmVmNjYiLCJfcmVmNjciLCJfcmVmNjgiLCJfcmVmNjkiLCJfcmVmNzAiLCJfcmVmNzEiLCJfcmVmNzIiLCJfcmVmNzMiLCJfcmVmNzQiLCJfcmVmNzUiLCJfcmVmNzYiLCJfcmVmNzciLCJfcmVmNzgiLCJfcmVmNzkiLCJfcmVmODAiLCJfcmVmODEiLCJfcmVmODIiLCJfcmVmODMiLCJfcmVmODQiLCJfcmVmODUiLCJfcmVmODYiLCJfcmVmODciLCJfcmVmODgiLCJfcmVmODkiLCJfcmVmOTAiLCJfcmVmOTEiLCJfcmVmOTIiLCJfcmVmOTMiLCJfcmVmOTQiLCJfcmVmOTUiLCJfcmVmOTYiLCJfaXRlcmF0b3IzNiIsIl9zdGVwMzYiLCJfcmVmOTciLCJfcmVmOTgiLCJfaXRlcmF0b3IzNyIsIl9zdGVwMzciLCJfcmVmOTkiLCJfcmVmMTAwIiwiX3JlZjEwMSIsIl9yZWYxMDIiLCJpc1N1cHBvcnRlZFNjcmlwdCIsIl9yZWYxMDMiLCJfcmVmMTA0IiwidG9VcHBlckNhc2UiLCJfcmVmMTA1IiwiX3JlZjEwNiIsIl9yZWYxMDciLCJfcmVmMTA4Iiwic3VjY2VzcyIsInN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uIiwic3BlYyIsInN1cHBvcnRzWm9vbUV4cHJlc3Npb24iLCJwYXJhbWV0ZXJzIiwic3VwcG9ydHNJbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGVkIiwiZ2V0VHlwZSIsInZhbCIsImlzRnVuY3Rpb24kMSIsImlkZW50aXR5RnVuY3Rpb24iLCJjcmVhdGVGdW5jdGlvbiIsInByb3BlcnR5U3BlYyIsImlzQ29sb3IiLCJ6b29tQW5kRmVhdHVyZURlcGVuZGVudCIsImZlYXR1cmVEZXBlbmRlbnQiLCJ6b29tRGVwZW5kZW50IiwiY29sb3JTcGFjZSIsImNvbG9yU3BhY2VzIiwiaW5uZXJGdW4iLCJoYXNoZWRTdG9wcyIsImNhdGVnb3JpY2FsS2V5VHlwZSIsImV2YWx1YXRlRXhwb25lbnRpYWxGdW5jdGlvbiIsImV2YWx1YXRlSW50ZXJ2YWxGdW5jdGlvbiIsImV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbiIsImNyZWF0ZSIsIl9pdGVyYXRvcjM4IiwiX3N0ZXAzOCIsImV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbiIsImZlYXR1cmVGdW5jdGlvbnMiLCJ6b29tU3RvcHMiLCJmZWF0dXJlRnVuY3Rpb25TdG9wcyIsIl9pOCIsIl96b29tU3RvcHMiLCJpbnRlcnBvbGF0aW9uVHlwZSIsImJpbmQiLCJfcmVmMTA5IiwiX3JlZjExMCIsImNvYWxlc2NlIiwia2V5VHlwZSIsImV2YWx1YXRlZCIsImludGVycCIsImNvbG9yc3BhY2UiLCJfbGVuMyIsIl9rZXk1IiwiZXZhbHVhdGVkTG93ZXIiLCJldmFsdWF0ZWRVcHBlciIsInZhbHVlcyIsIlN0eWxlRXhwcmVzc2lvbiIsIl93YXJuaW5nSGlzdG9yeSIsIl9ldmFsdWF0b3IiLCJfZGVmYXVsdFZhbHVlIiwiZ2V0RGVmYXVsdFZhbHVlIiwiX2VudW1WYWx1ZXMiLCJldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nIiwiY29uc29sZSIsIndhcm4iLCJpc0V4cHJlc3Npb24iLCJjcmVhdGVFeHByZXNzaW9uIiwicGFyc2VyIiwiZ2V0RXhwZWN0ZWRUeXBlIiwiWm9vbUNvbnN0YW50RXhwcmVzc2lvbiIsIl9zdHlsZUV4cHJlc3Npb24iLCJpc1N0YXRlRGVwZW5kZW50IiwiWm9vbURlcGVuZGVudEV4cHJlc3Npb24iLCJjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24iLCJpc0ZlYXR1cmVDb25zdGFudCQxIiwiaXNab29tQ29uc3RhbnQiLCJ6b29tQ3VydmUiLCJmaW5kWm9vbUN1cnZlIiwiU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uIiwic3BlY2lmaWNhdGlvbiIsIl9wYXJhbWV0ZXJzIiwiX3NwZWNpZmljYXRpb24iLCJkZXNlcmlhbGl6ZSIsIm5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbiIsImNvbnN0YW50IiwiX2l0ZXJhdG9yMzkiLCJfc3RlcDM5IiwiY2hpbGRSZXN1bHQiLCJmb3JtYXR0ZWQiLCJyZXNvbHZlZEltYWdlIiwiY29udmVydExpdGVyYWwiLCJjb252ZXJ0RnVuY3Rpb24iLCJjb252ZXJ0SWRlbnRpdHlGdW5jdGlvbiIsInRva2VucyIsImNvbnZlcnRUb2tlblN0cmluZyIsImNvbnZlcnRab29tQW5kUHJvcGVydHlGdW5jdGlvbiIsImNvbnZlcnRab29tRnVuY3Rpb24iLCJjb252ZXJ0UHJvcGVydHlGdW5jdGlvbiIsImdldEludGVycG9sYXRlT3BlcmF0b3IiLCJmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzIiwiZnVuY3Rpb25UeXBlIiwiZ2V0RnVuY3Rpb25UeXBlIiwiX2l0ZXJhdG9yNDAiLCJfc3RlcDQwIiwiYXBwZW5kU3RvcFBhaXIiLCJfaXRlcmF0b3I0MSIsIl9zdGVwNDEiLCJmaXh1cERlZ2VuZXJhdGVTdGVwQ3VydmUiLCJjb2FsZXNjZSQxIiwiZ2V0RmFsbGJhY2siLCJkZWZhdWx0VmFsdWUiLCJfaXRlcmF0b3I0MiIsIl9zdGVwNDIiLCJfaXRlcmF0b3I0MyIsIl9zdGVwNDMiLCJfaXRlcmF0b3I0NCIsIl9zdGVwNDQiLCJfaXRlcmF0b3I0NSIsIl9zdGVwNDUiLCJpc1N0ZXAiLCJfaXRlcmF0b3I0NiIsIl9zdGVwNDYiLCJjdXJ2ZSIsInJlIiwicG9zIiwibGl0ZXJhbCIsImlzRXhwcmVzc2lvbkZpbHRlciIsIl9pdGVyYXRvcjQ3IiwiX3N0ZXA0NyIsImZpbHRlclNwZWMiLCJjcmVhdGVGaWx0ZXIiLCJuZWVkR2VvbWV0cnkiLCJjb252ZXJ0RmlsdGVyIiwiY29tcGlsZWQiLCJnZW9tZXRyeU5lZWRlZCIsImdsb2JhbFByb3BlcnRpZXMiLCJjb252ZXJ0ZWQiLCJjb252ZXJ0Q29tcGFyaXNvbk9wIiwiY29udmVydE5lZ2F0aW9uIiwiY29udmVydERpc2p1bmN0aW9uT3AiLCJjb252ZXJ0SW5PcCIsImNvbnZlcnRIYXNPcCIsImZpbHRlcnMiLCJjb252ZXJ0RmlsdGVyJDEiLCJfY29udmVydEZpbHRlciIsImV4cGVjdGVkVHlwZXMiLCJfZmlsdGVyIiwiY29udmVydENvbXBhcmlzb25PcCQxIiwiY2hpbGRyZW4iLCJ0eXBlY2hlY2tzIiwicnVudGltZVR5cGVDaGVja3MiLCJfcmVmMTExIiwiY29udmVydEluT3AkMSIsImNvbnZlcnRIYXNPcCQxIiwiY29uZGl0aW9ucyIsIm5lZ2F0ZSIsInVuaWZvcm1UeXBlcyIsIl9pdGVyYXRvcjQ4IiwiX3N0ZXA0OCIsInVuaXF1ZVZhbHVlcyIsIm1pZ3JhdGVUb0V4cHJlc3Npb25zIiwiX3JlZjExMiIsIm1pZ3JhdGUiLCJtaWdyYXRlZCIsImNvbXBvc2l0ZSIsInN0eWxlSURzIiwic291cmNlSURzIiwiY29tcG9zaXRlZFNvdXJjZUxheWVycyIsImNvbXBvc2l0ZUlEIiwicmVmUHJvcGVydGllcyIsImRlcmVmIiwiZGVyZWZMYXllcnMiLCJyZWYiLCJkZWVwRXF1YWwiLCJvcGVyYXRpb25zIiwic2V0U3R5bGUiLCJhZGRMYXllciIsInJlbW92ZUxheWVyIiwic2V0UGFpbnRQcm9wZXJ0eSIsInNldExheW91dFByb3BlcnR5Iiwic2V0RmlsdGVyIiwiYWRkU291cmNlIiwicmVtb3ZlU291cmNlIiwic2V0R2VvSlNPTlNvdXJjZURhdGEiLCJzZXRMYXllclpvb21SYW5nZSIsInNldExheWVyUHJvcGVydHkiLCJzZXRDZW50ZXIiLCJzZXRab29tIiwic2V0QmVhcmluZyIsInNldFBpdGNoIiwic2V0U3ByaXRlIiwic2V0R2x5cGhzIiwic2V0VHJhbnNpdGlvbiIsInNldExpZ2h0Iiwic2V0VGVycmFpbiIsInNldEZvZyIsInNvdXJjZUlkIiwiYWZ0ZXIiLCJjb21tYW5kcyIsImNvbW1hbmQiLCJzb3VyY2VzUmVtb3ZlZCIsInVwZGF0ZVNvdXJjZSIsImNhblVwZGF0ZUdlb0pTT04iLCJiZWZvcmUiLCJkaWZmU291cmNlcyIsImRhdGEiLCJkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMiLCJsYXllcklkIiwia2xhc3MiLCJwbHVja0lkIiwiaW5kZXhCeUlkIiwiZ3JvdXAiLCJkaWZmTGF5ZXJzIiwiYmVmb3JlT3JkZXIiLCJhZnRlck9yZGVyIiwiYmVmb3JlSW5kZXgiLCJyZWR1Y2UiLCJhZnRlckluZGV4IiwidHJhY2tlciIsImNsZWFuIiwiYmVmb3JlTGF5ZXIiLCJhZnRlckxheWVyIiwiaW5zZXJ0QmVmb3JlTGF5ZXJJZCIsIm1pbnpvb20iLCJtYXh6b29tIiwiZGlmZlN0eWxlcyIsImNlbnRlciIsImJlYXJpbmciLCJwaXRjaCIsInNwcml0ZSIsInRyYW5zaXRpb24iLCJsaWdodCIsImZvZyIsInJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMiLCJiZWZvcmVMYXllcnMiLCJiZWZvcmVUZXJyYWluIiwidGVycmFpbiIsIlZhbGlkYXRpb25FcnJvciIsImlkZW50aWZpZXIiLCJfX2xpbmVfXyIsIlBhcnNpbmdFcnJvciQxIiwidmFsaWRhdGVDb25zdGFudHMiLCJ1bmJ1bmRsZSIsInZhbHVlT2YiLCJkZWVwVW5idW5kbGUiLCJ1bmJ1bmRsZWRWYWx1ZSIsInZhbGlkYXRlT2JqZWN0IiwiZWxlbWVudFNwZWNzIiwidmFsdWVTcGVjIiwiZWxlbWVudFZhbGlkYXRvcnMiLCJvYmplY3RFbGVtZW50VmFsaWRhdG9ycyIsInN0eWxlU3BlYyIsIm9iamVjdEtleSIsImVsZW1lbnRTcGVjS2V5IiwiZWxlbWVudFNwZWMiLCJ2YWxpZGF0ZUVsZW1lbnQiLCJ2YWxpZGF0ZSIsInJlcXVpcmVkIiwidmFsaWRhdGVBcnJheSIsImFycmF5U3BlYyIsInZhbGlkYXRlQXJyYXlFbGVtZW50IiwiYXJyYXlFbGVtZW50VmFsaWRhdG9yIiwiYXJyYXlFbGVtZW50U3BlYyIsIm1pbmltdW0iLCJtYXhpbXVtIiwiJHZlcnNpb24iLCJhcnJheUluZGV4IiwidmFsaWRhdGVOdW1iZXIiLCJzcGVjTWluIiwic3BlY01heCIsInZhbGlkYXRlRnVuY3Rpb24iLCJmdW5jdGlvblZhbHVlU3BlYyIsInN0b3BLZXlUeXBlIiwic3RvcERvbWFpblZhbHVlcyIsInByZXZpb3VzU3RvcERvbWFpblZhbHVlIiwicHJldmlvdXNTdG9wRG9tYWluWm9vbSIsImlzWm9vbUZ1bmN0aW9uIiwiaXNQcm9wZXJ0eUZ1bmN0aW9uIiwiaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbiIsInZhbGlkYXRlRnVuY3Rpb25TdG9wcyIsInZhbGlkYXRlRnVuY3Rpb25EZWZhdWx0IiwidmFsaWRhdGVGdW5jdGlvblN0b3AiLCJ2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZSIsInJlcG9ydFZhbHVlIiwidmFsaWRhdGVFeHByZXNzaW9uIiwiZXhwcmVzc2lvbkNvbnRleHQiLCJleHByZXNzaW9uT2JqIiwicHJvcGVydHlLZXkiLCJ2YWxpZGF0ZUJvb2xlYW4iLCJ2YWxpZGF0ZUNvbG9yIiwidmFsaWRhdGVFbnVtIiwidmFsaWRhdGVGaWx0ZXIiLCJ2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIiLCJmaWx0ZXJfb3BlcmF0b3IiLCJnZW9tZXRyeV90eXBlIiwidmFsaWRhdGVQcm9wZXJ0eSIsImxheWVyU3BlYyIsImxheWVyVHlwZSIsInRyYW5zaXRpb25NYXRjaCIsInRva2VuTWF0Y2giLCJ2YWxpZGF0ZVBhaW50UHJvcGVydHkiLCJ2YWxpZGF0ZUxheW91dFByb3BlcnR5IiwidmFsaWRhdGVMYXllciIsIm90aGVyTGF5ZXIiLCJzb3VyY2VUeXBlIiwibGluZU1ldHJpY3MiLCJ2YWxpZGF0ZVN0cmluZyIsInByb21vdGVJZCIsInZhbGlkYXRlUHJvbW90ZUlkIiwidmFsaWRhdGVTb3VyY2UiLCJzb3VyY2VfZ2VvanNvbiIsImNsdXN0ZXIiLCJjbHVzdGVyUHJvcGVydGllcyIsIl9lcnJvcnMiLCJfZXJyb3JzMiIsIl92YWx1ZSRjbHVzdGVyUHJvcGVydCIsIm1hcEV4cHIiLCJyZWR1Y2VFeHByIiwic291cmNlX3ZpZGVvIiwic291cmNlX2ltYWdlIiwiX3JlZjExMyIsInZhbGlkYXRlTGlnaHQiLCJsaWdodFNwZWMiLCJyb290VHlwZSIsInZhbGlkYXRlVGVycmFpbiIsInRlcnJhaW5TcGVjIiwidmFsaWRhdGVGb2ciLCJmb2dTcGVjIiwidmFsaWRhdGVGb3JtYXR0ZWQiLCJ2YWxpZGF0ZUltYWdlIiwiVkFMSURBVE9SUyIsInZhbGlkIiwidmFsaWRhdGVHbHlwaHNVUkwiLCJ2YWxpZGF0ZVN0eWxlTWluIiwic29ydEVycm9ycyIsIndyYXBDbGVhbkVycm9ycyIsInBhaW50UHJvcGVydHkiLCJsYXlvdXRQcm9wZXJ0eSIsIl9sZW40IiwiX2tleTciLCJvIiwiJFYwIiwiJFYxIiwiJFYyIiwiJFYzIiwiJFY0IiwiJFY1IiwiJFY2IiwiJFY3IiwiJFY4IiwiJFY5IiwidHJhY2UiLCJ5eSIsInN5bWJvbHNfIiwidGVybWluYWxzXyIsInByb2R1Y3Rpb25zXyIsInBlcmZvcm1BY3Rpb24iLCJhbm9ueW1vdXMiLCJ5eXRleHQiLCJ5eWxlbmciLCJ5eWxpbmVubyIsInl5c3RhdGUiLCIkJCIsIl8kIiwiJDAiLCIkIiwiZmlyc3RfbGluZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsInRhYmxlIiwiZGVmYXVsdEFjdGlvbnMiLCJwYXJzZUVycm9yIiwicmVjb3ZlcmFibGUiLCJzdGFjayIsInZzdGFjayIsImxzdGFjayIsIlRFUlJPUiIsIkVPRiIsImxleGVyIiwic2hhcmVkU3RhdGUiLCJzZXRJbnB1dCIsInl5bGxvYyIsInl5bG9jIiwicmFuZ2VzIiwiZ2V0UHJvdG90eXBlT2YiLCJsZXgiLCJ0b2tlbiIsInN5bWJvbCIsInN0YXRlIiwiYWN0aW9uIiwieXl2YWwiLCJuZXdTdGF0ZSIsImVyclN0ciIsInNob3dQb3NpdGlvbiIsImxvYyIsImxhc3RfbGluZSIsImZpcnN0X2NvbHVtbiIsImxhc3RfY29sdW1uIiwicmFuZ2UiLCJfaW5wdXQiLCJfbW9yZSIsIl9iYWNrdHJhY2siLCJtYXRjaGVkIiwiY29uZGl0aW9uU3RhY2siLCJvZmZzZXQiLCJjaCIsImxpbmVzIiwidW5wdXQiLCJvbGRMaW5lcyIsIm1vcmUiLCJyZWplY3QiLCJiYWNrdHJhY2tfbGV4ZXIiLCJsZXNzIiwicGFzdElucHV0IiwicGFzdCIsInVwY29taW5nSW5wdXQiLCJuZXh0IiwicHJlIiwidGVzdF9tYXRjaCIsImluZGV4ZWRfcnVsZSIsImJhY2t1cCIsIm1hdGNoZXMiLCJ0ZW1wTWF0Y2giLCJydWxlcyIsIl9jdXJyZW50UnVsZXMiLCJmbGV4IiwiYmVnaW4iLCJjb25kaXRpb24iLCJwb3BTdGF0ZSIsInRvcFN0YXRlIiwicHVzaFN0YXRlIiwic3RhdGVTdGFja1NpemUiLCJ5eV8iLCIkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zIiwiWVlfU1RBUlQiLCJQYXJzZXIiLCJjb21tb25qc1JlcXVpcmUiLCJyZWFkU3R5bGUiLCJCdWZmZXIiLCJqc29ubGludCIsInZhbGlkYXRlU3R5bGUiLCJTVVBQT1JURURfU1BFQ19WRVJTSU9OIiwiTUFYX1NPVVJDRVNfSU5fU1RZTEUiLCJpc1ZhbGlkIiwicmVnZXgiLCJnZXRTb3VyY2VDb3VudCIsImdldEFsbG93ZWRLZXlFcnJvcnMiLCJhbGxvd2VkIiwiU2V0IiwiYWNjZXB0ZWRTb3VyY2VUeXBlcyIsImdldFNvdXJjZUVycm9ycyIsInNvdXJjZUtleXMiLCJzb3VyY2VVcmxQYXR0ZXJuIiwiZ2V0U291cmNlc0Vycm9ycyIsImNvdW50Iiwic291cmNlRXJyb3JzIiwiZ2V0Um9vdEVycm9ycyIsInNwZWNLZXlzIiwib3B0aW9uYWxSb290UHJvcGVydGllcyIsImFsbG93ZWRLZXlFcnJvcnMiLCJnbHlwaFVybFBhdHRlcm4iLCJzcHJpdGVVcmxQYXR0ZXJuIiwidmlzaWJpbGl0eVBhdHRlcm4iLCJ2aXNpYmlsaXR5IiwidmFsaWRhdGVNYXBib3hBcGlTdXBwb3J0ZWQiLCJleHByZXNzaW9uJDEiLCJzdHlsZUZ1bmN0aW9uIiwidmlzaXQiLCJsYXRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsWUFBWSxHQUFHLDJCQUEyQjtBQUU5QyxJQUFBQywwQkFBYyxHQUFHLFNBQVNDLFNBQVNBLENBQUNDLFNBQVMsRUFBRUMsT0FBTyxFQUFFO0VBQ3RELElBQUlDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxRQUFRO0VBRS9CSCxPQUFPLEdBQUdBLE9BQU8sSUFBSSxFQUFFO0VBQ3ZCQyxNQUFN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QUFDO0lBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzVELFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNwRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDOUQsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQzdELGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUM3RCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDdkQsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3hELFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN4RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDMUQsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7SUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdDLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN0RCxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNsRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDN0QsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNyRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMvRCxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNsRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3BFLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNuRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDcEQsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQy9DLGtCQUFrQixFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzlELGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMvRCxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3BFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDckUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDaEUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNsRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzlELGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMvRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2hELFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN0RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDL0IsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2hELFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUN6RCxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDdkQsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNsRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNyRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2pELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNwRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFH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QUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDUixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQ0EsQ0FBQyxDQUFDUSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztRQUFDLENBQUMsRUFBQyxFQUFFO1FBQUMsQ0FBQyxFQUFDUCxHQUFHO1FBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQztRQUFDLEVBQUUsRUFBQyxFQUFFO1FBQUMsRUFBRSxFQUFDO01BQUUsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxDQUFDLEVBQUNBLEdBQUc7UUFBQyxDQUFDLEVBQUMsQ0FBQztRQUFDLENBQUMsRUFBQ0MsR0FBRztRQUFDLENBQUMsRUFBQyxDQUFDO1FBQUMsQ0FBQyxFQUFDQyxHQUFHO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDO1FBQUMsRUFBRSxFQUFDO01BQUUsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7TUFBQyxDQUFDLEVBQUNQLENBQUMsQ0FBQ1EsR0FBRyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUM7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUU7TUFBQyxDQUFDLEVBQUNSLENBQUMsQ0FBQ1MsR0FBRyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUM7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRTtNQUFDLENBQUMsRUFBQ1QsQ0FBQyxDQUFDUSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBQztRQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUM7UUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRTtNQUFDLENBQUMsRUFBQ1IsQ0FBQyxDQUFDVSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBQ1YsQ0FBQyxDQUFDUSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBQztRQUFDLENBQUMsRUFBQyxFQUFFO1FBQUMsQ0FBQyxFQUFDUCxHQUFHO1FBQUMsRUFBRSxFQUFDO01BQUUsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxDQUFDLEVBQUNBLEdBQUc7UUFBQyxDQUFDLEVBQUMsQ0FBQztRQUFDLENBQUMsRUFBQ0MsR0FBRztRQUFDLENBQUMsRUFBQyxDQUFDO1FBQUMsQ0FBQyxFQUFDQyxHQUFHO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDO01BQUcsQ0FBQyxFQUFDUCxDQUFDLENBQUNRLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxDQUFDLEVBQUNQLEdBQUc7UUFBQyxDQUFDLEVBQUMsQ0FBQztRQUFDLENBQUMsRUFBQ0MsR0FBRztRQUFDLENBQUMsRUFBQyxDQUFDO1FBQUMsQ0FBQyxFQUFDQyxHQUFHO1FBQUMsQ0FBQyxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDO1FBQUMsRUFBRSxFQUFDLENBQUM7UUFBQyxFQUFFLEVBQUNDLEdBQUc7UUFBQyxFQUFFLEVBQUNDO01BQUcsQ0FBQyxFQUFDUCxDQUFDLENBQUNTLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDVCxDQUFDLENBQUNTLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFDVCxDQUFDLENBQUNVLEdBQUcsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ3J3Qm9CLGNBQWMsRUFBRTtRQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDO01BQUMsQ0FBQztNQUMxQkMsVUFBVSxFQUFFLFNBQVNBLFVBQVVBLENBQUNqN0IsR0FBRyxFQUFFekwsSUFB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Q0FBUzRCLE1BQVQsR0FBa0I1QixhQUFsQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AbWFwYm94L21hcGJveC1nbC1zdHlsZS1zcGVjL2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLy8gTm90ZTogVGhpcyByZWdleCBtYXRjaGVzIGV2ZW4gaW52YWxpZCBKU09OIHN0cmluZ3MsIGJ1dCBzaW5jZSB3ZeKAmXJlXG4vLyB3b3JraW5nIG9uIHRoZSBvdXRwdXQgb2YgYEpTT04uc3RyaW5naWZ5YCB3ZSBrbm93IHRoYXQgb25seSB2YWxpZCBzdHJpbmdzXG4vLyBhcmUgcHJlc2VudCAodW5sZXNzIHRoZSB1c2VyIHN1cHBsaWVkIGEgd2VpcmQgYG9wdGlvbnMuaW5kZW50YCBidXQgaW5cbi8vIHRoYXQgY2FzZSB3ZSBkb27igJl0IGNhcmUgc2luY2UgdGhlIG91dHB1dCB3b3VsZCBiZSBpbnZhbGlkIGFueXdheSkuXG52YXIgc3RyaW5nT3JDaGFyID0gLyhcIig/OlteXFxcXFwiXXxcXFxcLikqXCIpfFs6LF0vZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkocGFzc2VkT2JqLCBvcHRpb25zKSB7XG4gIHZhciBpbmRlbnQsIG1heExlbmd0aCwgcmVwbGFjZXI7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGluZGVudCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIFsxXSxcbiAgICB1bmRlZmluZWQsXG4gICAgb3B0aW9ucy5pbmRlbnQgPT09IHVuZGVmaW5lZCA/IDIgOiBvcHRpb25zLmluZGVudFxuICApLnNsaWNlKDIsIC0zKTtcbiAgbWF4TGVuZ3RoID1cbiAgICBpbmRlbnQgPT09IFwiXCJcbiAgICAgID8gSW5maW5pdHlcbiAgICAgIDogb3B0aW9ucy5tYXhMZW5ndGggPT09IHVuZGVmaW5lZFxuICAgICAgPyA4MFxuICAgICAgOiBvcHRpb25zLm1heExlbmd0aDtcbiAgcmVwbGFjZXIgPSBvcHRpb25zLnJlcGxhY2VyO1xuXG4gIHJldHVybiAoZnVuY3Rpb24gX3N0cmluZ2lmeShvYmosIGN1cnJlbnRJbmRlbnQsIHJlc2VydmVkKSB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIGVuZCwgaW5kZXgsIGl0ZW1zLCBrZXksIGtleVBhcnQsIGtleXMsIGxlbmd0aCwgbmV4dEluZGVudCwgcHJldHRpZmllZCwgc3RhcnQsIHN0cmluZywgdmFsdWU7XG5cbiAgICBpZiAob2JqICYmIHR5cGVvZiBvYmoudG9KU09OID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgICB9XG5cbiAgICBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcblxuICAgIGlmIChzdHJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBsZW5ndGggPSBtYXhMZW5ndGggLSBjdXJyZW50SW5kZW50Lmxlbmd0aCAtIHJlc2VydmVkO1xuXG4gICAgaWYgKHN0cmluZy5sZW5ndGggPD0gbGVuZ3RoKSB7XG4gICAgICBwcmV0dGlmaWVkID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nT3JDaGFyLCBmdW5jdGlvbihtYXRjaCwgc3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbCB8fCBtYXRjaCArIFwiIFwiO1xuICAgICAgfSk7XG4gICAgICBpZiAocHJldHRpZmllZC5sZW5ndGggPD0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBwcmV0dGlmaWVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXBsYWNlciAhPSBudWxsKSB7XG4gICAgICBvYmogPSBKU09OLnBhcnNlKHN0cmluZyk7XG4gICAgICByZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIG5leHRJbmRlbnQgPSBjdXJyZW50SW5kZW50ICsgaW5kZW50O1xuICAgICAgaXRlbXMgPSBbXTtcbiAgICAgIGluZGV4ID0gMDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBzdGFydCA9IFwiW1wiO1xuICAgICAgICBlbmQgPSBcIl1cIjtcbiAgICAgICAgbGVuZ3RoID0gb2JqLmxlbmd0aDtcbiAgICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgICAgIF9zdHJpbmdpZnkob2JqW2luZGV4XSwgbmV4dEluZGVudCwgaW5kZXggPT09IGxlbmd0aCAtIDEgPyAwIDogMSkgfHxcbiAgICAgICAgICAgICAgXCJudWxsXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IFwie1wiO1xuICAgICAgICBlbmQgPSBcIn1cIjtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgICAgICBrZXlQYXJ0ID0gSlNPTi5zdHJpbmdpZnkoa2V5KSArIFwiOiBcIjtcbiAgICAgICAgICB2YWx1ZSA9IF9zdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIG5leHRJbmRlbnQsXG4gICAgICAgICAgICBrZXlQYXJ0Lmxlbmd0aCArIChpbmRleCA9PT0gbGVuZ3RoIC0gMSA/IDAgOiAxKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goa2V5UGFydCArIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFtzdGFydCwgaW5kZW50ICsgaXRlbXMuam9pbihcIixcXG5cIiArIG5leHRJbmRlbnQpLCBlbmRdLmpvaW4oXG4gICAgICAgICAgXCJcXG5cIiArIGN1cnJlbnRJbmRlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9KShwYXNzZWRPYmosIFwiXCIsIDApO1xufTtcbiIsIlxuaW1wb3J0IHJlZmVyZW5jZSBmcm9tICcuL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuaW1wb3J0IHN0cmluZ2lmeVByZXR0eSBmcm9tICdqc29uLXN0cmluZ2lmeS1wcmV0dHktY29tcGFjdCc7XG5cbmZ1bmN0aW9uIHNvcnRLZXlzQnkob2JqLCByZWZlcmVuY2UpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZWZlcmVuY2UpIHtcbiAgICAgICAgaWYgKG9ialtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgTWFwYm94IEdMIFN0eWxlLiAgUmV0dXJucyBhIHN0cmluZ2lmaWVkIHN0eWxlIHdpdGggaXRzIGtleXNcbiAqIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgcmVmZXJlbmNlIHN0eWxlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgc3BhY2VgIGFyZ3VtZW50IGlzIHBhc3NlZCB0b1xuICogW2BKU09OLnN0cmluZ2lmeWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogdG8gZ2VuZXJhdGUgZm9ybWF0dGVkIG91dHB1dC5cbiAqXG4gKiBJZiBgc3BhY2VgIGlzIHVuc3BlY2lmaWVkLCBhIGRlZmF1bHQgb2YgYDJgIHNwYWNlcyB3aWxsIGJlIHVzZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSBhIE1hcGJveCBHTCBTdHlsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZV0gc3BhY2UgYXJndW1lbnQgdG8gcGFzcyB0byBgSlNPTi5zdHJpbmdpZnlgXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBzdHJpbmdpZmllZCBmb3JtYXR0ZWQgSlNPTlxuICogQGV4YW1wbGVcbiAqIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gKiB2YXIgZm9ybWF0ID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMnKS5mb3JtYXQ7XG4gKiB2YXIgc3R5bGUgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc291cmNlLmpzb24nLCAndXRmOCcpO1xuICogZnMud3JpdGVGaWxlU3luYygnLi9kZXN0Lmpzb24nLCBmb3JtYXQoc3R5bGUpKTtcbiAqIGZzLndyaXRlRmlsZVN5bmMoJy4vZGVzdC5taW4uanNvbicsIGZvcm1hdChzdHlsZSwgMCkpO1xuICovXG5mdW5jdGlvbiBmb3JtYXQoc3R5bGUsIHNwYWNlID0gMikge1xuICAgIHN0eWxlID0gc29ydEtleXNCeShzdHlsZSwgcmVmZXJlbmNlLiRyb290KTtcblxuICAgIGlmIChzdHlsZS5sYXllcnMpIHtcbiAgICAgICAgc3R5bGUubGF5ZXJzID0gc3R5bGUubGF5ZXJzLm1hcCgobGF5ZXIpID0+IHNvcnRLZXlzQnkobGF5ZXIsIHJlZmVyZW5jZS5sYXllcikpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnlQcmV0dHkoc3R5bGUsIHtpbmRlbnQ6IHNwYWNlfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdDtcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuMy4yIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG5cdH1cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuXHQgKiBpdGVtLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0XHRyZXN1bHRbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuXHQgKiBhZGRyZXNzZXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuXHQgKiBjaGFyYWN0ZXIuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG5cdCAqIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0XHR2YXIgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHRcdH1cblx0XHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0XHR2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdFx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRcdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcblx0ICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuIFdoaWxlIEphdmFTY3JpcHQgdXNlcyBVQ1MtMiBpbnRlcm5hbGx5LFxuXHQgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuXHQgKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcblx0ICogbWF0Y2hpbmcgVVRGLTE2LlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGRlY29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgY291bnRlciA9IDAsXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG5cdFx0ICAgIHZhbHVlLFxuXHRcdCAgICBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZW5jb2RlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHRyZXR1cm4gbWFwKGFycmF5LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxuXHQgKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDIyO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDY1O1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDk3O1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuXHQgKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcblx0ICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdFx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdFx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuXHQgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjMuMicsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBvYmpba10ubWFwKGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5qb2luKHNlcCk7XG5cbiAgfVxuXG4gIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArXG4gICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5kZWNvZGUgPSBleHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmV4cG9ydHMuZW5jb2RlID0gZXhwb3J0cy5zdHJpbmdpZnkgPSByZXF1aXJlKCcuL2VuY29kZScpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gICAgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICAgIGRlbGltcyA9IFsnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCddLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gICAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gICAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgICAvLyBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAgLy8gdGhlbS5cbiAgICBub25Ib3N0Q2hhcnMgPSBbJyUnLCAnLycsICc/JywgJzsnLCAnIyddLmNvbmNhdChhdXRvRXNjYXBlKSxcbiAgICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gICAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gICAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1dGlsLmlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghdXRpbC5pc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgICAgc3BsaXR0ZXIgPVxuICAgICAgICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAodXRpbC5pc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICB1dGlsLmlzT2JqZWN0KHRoaXMucXVlcnkpICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgcHJvdG9jb2wgKz0gJzonO1xuXG4gIC8vIG9ubHkgdGhlIHNsYXNoZWRQcm90b2NvbHMgZ2V0IHRoZSAvLy4gIE5vdCBtYWlsdG86LCB4bXBwOiwgZXRjLlxuICAvLyB1bmxlc3MgdGhleSBoYWQgdGhlbSB0byBiZWdpbiB3aXRoLlxuICBpZiAodGhpcy5zbGFzaGVzIHx8XG4gICAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB0aGlzLmhvc3RuYW1lID0gaG9zdDtcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUmVmZXJlbmNlIGZyb20gJy4vcmVmZXJlbmNlL3Y4Lmpzb24nO1xuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFN0eWxlU3BlY2lmaWNhdGlvbixcbiAgICBTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIExheWVyU3BlY2lmaWNhdGlvbixcbiAgICBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbixcbiAgICBEYXRhRHJpdmVuUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5UmVmZXJlbmNlKHByb3BlcnR5TmFtZSk6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFJlZmVyZW5jZS5sYXlvdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gUmVmZXJlbmNlW1JlZmVyZW5jZS5sYXlvdXRbaV1dKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBwcm9wZXJ0eU5hbWUpIHJldHVybiAoUmVmZXJlbmNlW1JlZmVyZW5jZS5sYXlvdXRbaV1dW2tleV06IGFueSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBSZWZlcmVuY2UucGFpbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gUmVmZXJlbmNlW1JlZmVyZW5jZS5wYWludFtpXV0pIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHByb3BlcnR5TmFtZSkgcmV0dXJuIChSZWZlcmVuY2VbUmVmZXJlbmNlLnBhaW50W2ldXVtrZXldOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChudWxsOiBhbnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFjaFNvdXJjZShzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uLCBjYWxsYmFjazogKF86IFNvdXJjZVNwZWNpZmljYXRpb24pID0+IHZvaWQpIHtcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3R5bGUuc291cmNlcykge1xuICAgICAgICBjYWxsYmFjayhzdHlsZS5zb3VyY2VzW2tdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlYWNoTGF5ZXIoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiwgY2FsbGJhY2s6IChfOiBMYXllclNwZWNpZmljYXRpb24pID0+IHZvaWQpIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHN0eWxlLmxheWVycykge1xuICAgICAgICBjYWxsYmFjayhsYXllcik7XG4gICAgfVxufVxuXG50eXBlIFByb3BlcnR5Q2FsbGJhY2sgPSAoe1xuICAgIHBhdGg6IFtzdHJpbmcsICdwYWludCcgfCAnbGF5b3V0Jywgc3RyaW5nXSwgLy8gW2xheWVyaWQsIHBhaW50L2xheW91dCwgcHJvcGVydHkga2V5XVxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxtaXhlZD4gfCBEYXRhRHJpdmVuUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+LFxuICAgIHJlZmVyZW5jZTogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24sXG4gICAgc2V0OiAoUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+IHwgRGF0YURyaXZlblByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPG1peGVkPikgPT4gdm9pZFxufSkgPT4gdm9pZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2hQcm9wZXJ0eShcbiAgICBzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIG9wdGlvbnM6IHtwYWludD86IGJvb2xlYW4sIGxheW91dD86IGJvb2xlYW59LFxuICAgIGNhbGxiYWNrOiBQcm9wZXJ0eUNhbGxiYWNrXG4pIHtcbiAgICBmdW5jdGlvbiBpbm5lcihsYXllciwgcHJvcGVydHlUeXBlOiAncGFpbnQnIHwgJ2xheW91dCcpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IChsYXllcltwcm9wZXJ0eVR5cGVdOiBhbnkpO1xuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgcGF0aDogW2xheWVyLmlkLCBwcm9wZXJ0eVR5cGUsIGtleV0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2tleV0sXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBnZXRQcm9wZXJ0eVJlZmVyZW5jZShrZXkpLFxuICAgICAgICAgICAgICAgIHNldCh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNba2V5XSA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLnBhaW50KSB7XG4gICAgICAgICAgICBpbm5lcihsYXllciwgJ3BhaW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubGF5b3V0KSB7XG4gICAgICAgICAgICBpbm5lcihsYXllciwgJ2xheW91dCcpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcbmltcG9ydCB7ZWFjaFNvdXJjZSwgZWFjaExheWVyLCBlYWNoUHJvcGVydHl9IGZyb20gJy4uL3Zpc2l0LmpzJztcblxuZnVuY3Rpb24gZWFjaExheW91dChsYXllciwgY2FsbGJhY2spIHtcbiAgICBmb3IgKGNvbnN0IGsgaW4gbGF5ZXIpIHtcbiAgICAgICAgaWYgKGsuaW5kZXhPZignbGF5b3V0JykgPT09IDApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGxheWVyW2tdLCBrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZWFjaFBhaW50KGxheWVyLCBjYWxsYmFjaykge1xuICAgIGZvciAoY29uc3QgayBpbiBsYXllcikge1xuICAgICAgICBpZiAoay5pbmRleE9mKCdwYWludCcpID09PSAwKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhsYXllcltrXSwgayk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdGFudChzdHlsZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZVswXSA9PT0gJ0AnKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29uc3RhbnQoc3R5bGUsIHN0eWxlLmNvbnN0YW50c1t2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZS5zdG9wcyk7XG59XG5cbmZ1bmN0aW9uIHJlbmFtZVByb3BlcnR5KG9iaiwgZnJvbSwgdG8pIHtcbiAgICBvYmpbdG9dID0gb2JqW2Zyb21dOyBkZWxldGUgb2JqW2Zyb21dO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHlsZSkge1xuICAgIHN0eWxlLnZlcnNpb24gPSA4O1xuXG4gICAgLy8gUmVuYW1lIHByb3BlcnRpZXMsIHJldmVyc2UgY29vcmRpbmF0ZXMgaW4gc291cmNlIGFuZCBsYXllcnNcbiAgICBlYWNoU291cmNlKHN0eWxlLCAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ3ZpZGVvJyAmJiBzb3VyY2UudXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KHNvdXJjZSwgJ3VybCcsICd1cmxzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICBzb3VyY2UuY29vcmRpbmF0ZXMuZm9yRWFjaCgoY29vcmQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29vcmQucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGVhY2hMYXlvdXQobGF5ZXIsIChsYXlvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXlvdXRbJ3N5bWJvbC1taW4tZGlzdGFuY2UnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkobGF5b3V0LCAnc3ltYm9sLW1pbi1kaXN0YW5jZScsICdzeW1ib2wtc3BhY2luZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBlYWNoUGFpbnQobGF5ZXIsIChwYWludCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhaW50WydiYWNrZ3JvdW5kLWltYWdlJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KHBhaW50LCAnYmFja2dyb3VuZC1pbWFnZScsICdiYWNrZ3JvdW5kLXBhdHRlcm4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWludFsnbGluZS1pbWFnZSddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShwYWludCwgJ2xpbmUtaW1hZ2UnLCAnbGluZS1wYXR0ZXJuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFpbnRbJ2ZpbGwtaW1hZ2UnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkocGFpbnQsICdmaWxsLWltYWdlJywgJ2ZpbGwtcGF0dGVybicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIElubGluZSBDb25zdGFudHNcbiAgICBlYWNoUHJvcGVydHkoc3R5bGUsIHtwYWludDogdHJ1ZSwgbGF5b3V0OiB0cnVlfSwgKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZUNvbnN0YW50KHN0eWxlLCBwcm9wZXJ0eS52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZS5zdG9wcy5mb3JFYWNoKChzdG9wKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcFsxXSA9IHJlc29sdmVDb25zdGFudChzdHlsZSwgc3RvcFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb3BlcnR5LnNldCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgZGVsZXRlIHN0eWxlLmNvbnN0YW50cztcblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIC8vIGdldCByaWQgb2YgdGV4dC1tYXgtc2l6ZSwgaWNvbi1tYXgtc2l6ZVxuICAgICAgICAvLyB0dXJuIHRleHQtc2l6ZSwgaWNvbi1zaXplIGludG8gbGF5b3V0IHByb3BlcnRpZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtc3R5bGUtc3BlYy9pc3N1ZXMvMjU1XG5cbiAgICAgICAgZWFjaExheW91dChsYXllciwgKGxheW91dCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGxheW91dFsndGV4dC1tYXgtc2l6ZSddO1xuICAgICAgICAgICAgZGVsZXRlIGxheW91dFsnaWNvbi1tYXgtc2l6ZSddO1xuICAgICAgICB9KTtcblxuICAgICAgICBlYWNoUGFpbnQobGF5ZXIsIChwYWludCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhaW50Wyd0ZXh0LXNpemUnXSkge1xuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIubGF5b3V0KSBsYXllci5sYXlvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICBsYXllci5sYXlvdXRbJ3RleHQtc2l6ZSddID0gcGFpbnRbJ3RleHQtc2l6ZSddO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYWludFsndGV4dC1zaXplJ107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYWludFsnaWNvbi1zaXplJ10pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyLmxheW91dCkgbGF5ZXIubGF5b3V0ID0ge307XG4gICAgICAgICAgICAgICAgbGF5ZXIubGF5b3V0WydpY29uLXNpemUnXSA9IHBhaW50WydpY29uLXNpemUnXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFpbnRbJ2ljb24tc2l6ZSddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1pZ3JhdGVGb250c3RhY2tVUkwoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgaW5wdXRQYXJzZWQgPSBVUkwucGFyc2UoaW5wdXQpO1xuICAgICAgICBjb25zdCBpbnB1dFBhdGhuYW1lUGFydHMgPSBpbnB1dFBhcnNlZC5wYXRobmFtZS5zcGxpdCgnLycpO1xuXG4gICAgICAgIGlmIChpbnB1dFBhcnNlZC5wcm90b2NvbCAhPT0gJ21hcGJveDonKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFBhcnNlZC5ob3N0bmFtZSA9PT0gJ2ZvbnRzdGFjaycpIHtcbiAgICAgICAgICAgIGFzc2VydChkZWNvZGVVUkkoaW5wdXRQYXJzZWQucGF0aG5hbWUpID09PSAnL3tmb250c3RhY2t9L3tyYW5nZX0ucGJmJyk7XG4gICAgICAgICAgICByZXR1cm4gJ21hcGJveDovL2ZvbnRzL21hcGJveC97Zm9udHN0YWNrfS97cmFuZ2V9LnBiZic7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFBhcnNlZC5ob3N0bmFtZSA9PT0gJ2ZvbnRzJykge1xuICAgICAgICAgICAgYXNzZXJ0KGlucHV0UGF0aG5hbWVQYXJ0c1sxXSA9PT0gJ3YxJyk7XG4gICAgICAgICAgICBhc3NlcnQoZGVjb2RlVVJJKGlucHV0UGF0aG5hbWVQYXJ0c1szXSkgPT09ICd7Zm9udHN0YWNrfScpO1xuICAgICAgICAgICAgYXNzZXJ0KGRlY29kZVVSSShpbnB1dFBhdGhuYW1lUGFydHNbNF0pID09PSAne3JhbmdlfS5wYmYnKTtcbiAgICAgICAgICAgIHJldHVybiBgbWFwYm94Oi8vZm9udHMvJHtpbnB1dFBhdGhuYW1lUGFydHNbMl19L3tmb250c3RhY2t9L3tyYW5nZX0ucGJmYDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFzc2VydChwcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvbnQgdXJsOiBcIiR7aW5wdXR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHlsZS5nbHlwaHMpIHtcbiAgICAgICAgc3R5bGUuZ2x5cGhzID0gbWlncmF0ZUZvbnRzdGFja1VSTChzdHlsZS5nbHlwaHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1pZ3JhdGVGb250U3RhY2soZm9udCkge1xuICAgICAgICBmdW5jdGlvbiBzcGxpdEFuZFRyaW0oc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcsJykubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMudHJpbSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmb250KSkge1xuICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBwcmV2aW91c2x5IG1pZ3JhdGVkIGZvbnQtYXJyYXkuXG4gICAgICAgICAgICByZXR1cm4gZm9udDtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb250ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0QW5kVHJpbShmb250KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb250ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZm9udC5zdG9wcy5mb3JFYWNoKChzdG9wKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcFsxXSA9IHNwbGl0QW5kVHJpbShzdG9wWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZvbnQ7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZm9udCB2YWx1ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGVhY2hMYXlvdXQobGF5ZXIsIChsYXlvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXlvdXRbJ3RleHQtZm9udCddKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0Wyd0ZXh0LWZvbnQnXSA9IG1pZ3JhdGVGb250U3RhY2sobGF5b3V0Wyd0ZXh0LWZvbnQnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmV2ZXJzZSBvcmRlciBvZiBzeW1ib2wgbGF5ZXJzLiBUaGlzIGlzIGFuIGltcGVyZmVjdCBtaWdyYXRpb24uXG4gICAgLy9cbiAgICAvLyBUaGUgb3JkZXIgb2YgYSBzeW1ib2wgbGF5ZXIgaW4gdGhlIGxheWVycyBsaXN0IGFmZmVjdHMgdHdvIHRoaW5nczpcbiAgICAvLyAtIGhvdyBpdCBpcyBkcmF3biByZWxhdGl2ZSB0byBvdGhlciBsYXllcnMgKGxpa2Ugb25ld2F5IGFycm93cyBiZWxvdyBicmlkZ2VzKVxuICAgIC8vIC0gdGhlIHBsYWNlbWVudCBwcmlvcml0eSBjb21wYXJlZCB0byBvdGhlciBsYXllcnNcbiAgICAvL1xuICAgIC8vIEl0J3MgaW1wb3NzaWJsZSB0byByZXZlcnNlIHRoZSBwbGFjZW1lbnQgcHJpb3JpdHkgd2l0aG91dCBicmVha2luZyB0aGUgZHJhdyBvcmRlclxuICAgIC8vIGluIHNvbWUgY2FzZXMuIFRoaXMgbWlncmF0aW9uIG9ubHkgcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHN5bWJvbCBsYXllcnMgdGhhdFxuICAgIC8vIGFyZSBhYm92ZSBhbGwgb3RoZXIgdHlwZXMgb2YgbGF5ZXJzLlxuICAgIC8vXG4gICAgLy8gU3ltYm9sIGxheWVycyB0aGF0IGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBtYXAgcHJlc2VydmUgdGhlaXIgcHJpb3JpdHkuXG4gICAgLy8gU3ltYm9sIGxheWVycyB0aGF0IGFyZSBiZWxvdyBhbm90aGVyIHR5cGUgKGxpbmUsIGZpbGwpIG9mIGxheWVyIHByZXNlcnZlIHRoZWlyIGRyYXcgb3JkZXIuXG5cbiAgICBsZXQgZmlyc3RTeW1ib2xMYXllciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHN0eWxlLmxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBsYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICBmaXJzdFN5bWJvbExheWVyID0gaSArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbExheWVycyA9IHN0eWxlLmxheWVycy5zcGxpY2UoZmlyc3RTeW1ib2xMYXllcik7XG4gICAgc3ltYm9sTGF5ZXJzLnJldmVyc2UoKTtcbiAgICBzdHlsZS5sYXllcnMgPSBzdHlsZS5sYXllcnMuY29uY2F0KHN5bWJvbExheWVycyk7XG5cbiAgICByZXR1cm4gc3R5bGU7XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAob3V0cHV0OiBhbnksIC4uLmlucHV0czogQXJyYXk8YW55Pikge1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBpbnB1dCkge1xuICAgICAgICAgICAgb3V0cHV0W2tdID0gaW5wdXRba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFBhcnNpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3Ioa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzaW5nRXJyb3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcblxuLyoqXG4gKiBUcmFja3MgYGxldGAgYmluZGluZ3MgZHVyaW5nIGV4cHJlc3Npb24gcGFyc2luZy5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNjb3BlIHtcbiAgICBwYXJlbnQ6ID9TY29wZTtcbiAgICBiaW5kaW5nczoge1tfOiBzdHJpbmddOiBFeHByZXNzaW9ufTtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBTY29wZSwgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiA9IFtdKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGV4cHJlc3Npb25dIG9mIGJpbmRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW25hbWVdID0gZXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbmNhdChiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NvcGUodGhpcywgYmluZGluZ3MpO1xuICAgIH1cblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBFeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbbmFtZV0pIHsgcmV0dXJuIHRoaXMuYmluZGluZ3NbbmFtZV07IH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7IHJldHVybiB0aGlzLnBhcmVudC5nZXQobmFtZSk7IH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9IG5vdCBmb3VuZCBpbiBzY29wZS5gKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW25hbWVdKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuaGFzKG5hbWUpIDogZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY29wZTtcbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIE51bGxUeXBlVCA9IHsga2luZDogJ251bGwnIH07XG5leHBvcnQgdHlwZSBOdW1iZXJUeXBlVCA9IHsga2luZDogJ251bWJlcicgfTtcbmV4cG9ydCB0eXBlIFN0cmluZ1R5cGVUID0geyBraW5kOiAnc3RyaW5nJyB9O1xuZXhwb3J0IHR5cGUgQm9vbGVhblR5cGVUID0geyBraW5kOiAnYm9vbGVhbicgfTtcbmV4cG9ydCB0eXBlIENvbG9yVHlwZVQgPSB7IGtpbmQ6ICdjb2xvcicgfTtcbmV4cG9ydCB0eXBlIE9iamVjdFR5cGVUID0geyBraW5kOiAnb2JqZWN0JyB9O1xuZXhwb3J0IHR5cGUgVmFsdWVUeXBlVCA9IHsga2luZDogJ3ZhbHVlJyB9O1xuZXhwb3J0IHR5cGUgRXJyb3JUeXBlVCA9IHsga2luZDogJ2Vycm9yJyB9O1xuZXhwb3J0IHR5cGUgQ29sbGF0b3JUeXBlVCA9IHsga2luZDogJ2NvbGxhdG9yJyB9O1xuZXhwb3J0IHR5cGUgRm9ybWF0dGVkVHlwZVQgPSB7IGtpbmQ6ICdmb3JtYXR0ZWQnIH07XG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlVHlwZVQgPSB7IGtpbmQ6ICdyZXNvbHZlZEltYWdlJyB9O1xuXG5leHBvcnQgdHlwZSBFdmFsdWF0aW9uS2luZCA9ICdjb25zdGFudCcgfCAnc291cmNlJyB8ICdjYW1lcmEnIHwgJ2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCB0eXBlIFR5cGUgPVxuICAgIE51bGxUeXBlVCB8XG4gICAgTnVtYmVyVHlwZVQgfFxuICAgIFN0cmluZ1R5cGVUIHxcbiAgICBCb29sZWFuVHlwZVQgfFxuICAgIENvbG9yVHlwZVQgfFxuICAgIE9iamVjdFR5cGVUIHxcbiAgICBWYWx1ZVR5cGVUIHxcbiAgICBBcnJheVR5cGUgfCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgRXJyb3JUeXBlVCB8XG4gICAgQ29sbGF0b3JUeXBlVCB8XG4gICAgRm9ybWF0dGVkVHlwZVQgfFxuICAgIFJlc29sdmVkSW1hZ2VUeXBlVFxuXG5leHBvcnQgdHlwZSBBcnJheVR5cGUgPSB7XG4gICAga2luZDogJ2FycmF5JyxcbiAgICBpdGVtVHlwZTogVHlwZSxcbiAgICBOOiA/bnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIE5hdGl2ZVR5cGUgPSAnbnVtYmVyJyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nIHwgJ251bGwnIHwgJ2FycmF5JyB8ICdvYmplY3QnXG5cbmV4cG9ydCBjb25zdCBOdWxsVHlwZSA9IHtraW5kOiAnbnVsbCd9O1xuZXhwb3J0IGNvbnN0IE51bWJlclR5cGUgPSB7a2luZDogJ251bWJlcid9O1xuZXhwb3J0IGNvbnN0IFN0cmluZ1R5cGUgPSB7a2luZDogJ3N0cmluZyd9O1xuZXhwb3J0IGNvbnN0IEJvb2xlYW5UeXBlID0ge2tpbmQ6ICdib29sZWFuJ307XG5leHBvcnQgY29uc3QgQ29sb3JUeXBlID0ge2tpbmQ6ICdjb2xvcid9O1xuZXhwb3J0IGNvbnN0IE9iamVjdFR5cGUgPSB7a2luZDogJ29iamVjdCd9O1xuZXhwb3J0IGNvbnN0IFZhbHVlVHlwZSA9IHtraW5kOiAndmFsdWUnfTtcbmV4cG9ydCBjb25zdCBFcnJvclR5cGUgPSB7a2luZDogJ2Vycm9yJ307XG5leHBvcnQgY29uc3QgQ29sbGF0b3JUeXBlID0ge2tpbmQ6ICdjb2xsYXRvcid9O1xuZXhwb3J0IGNvbnN0IEZvcm1hdHRlZFR5cGUgPSB7a2luZDogJ2Zvcm1hdHRlZCd9O1xuZXhwb3J0IGNvbnN0IFJlc29sdmVkSW1hZ2VUeXBlID0ge2tpbmQ6ICdyZXNvbHZlZEltYWdlJ307XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShpdGVtVHlwZTogVHlwZSwgTjogP251bWJlcik6IEFycmF5VHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2FycmF5JyxcbiAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgIE5cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcodHlwZTogVHlwZSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRvU3RyaW5nKHR5cGUuaXRlbVR5cGUpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHR5cGUuTiA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgYGFycmF5PCR7aXRlbVR5cGV9LCAke3R5cGUuTn0+YCA6XG4gICAgICAgICAgICB0eXBlLml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScgPyAnYXJyYXknIDogYGFycmF5PCR7aXRlbVR5cGV9PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZDtcbiAgICB9XG59XG5cbmNvbnN0IHZhbHVlTWVtYmVyVHlwZXMgPSBbXG4gICAgTnVsbFR5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIENvbG9yVHlwZSxcbiAgICBGb3JtYXR0ZWRUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgYXJyYXkoVmFsdWVUeXBlKSxcbiAgICBSZXNvbHZlZEltYWdlVHlwZVxuXTtcblxuLyoqXG4gKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICogZXJyb3IgbWVzc2FnZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICBpZiAodC5raW5kID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIEVycm9yIGlzIGEgc3VidHlwZSBvZiBldmVyeSB0eXBlXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpZiAodC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAoKHQuTiA9PT0gMCAmJiB0Lml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScpIHx8ICFjaGVja1N1YnR5cGUoZXhwZWN0ZWQuaXRlbVR5cGUsIHQuaXRlbVR5cGUpKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiBleHBlY3RlZC5OICE9PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5OID09PSB0Lk4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gdC5raW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlclR5cGUgb2YgdmFsdWVNZW1iZXJUeXBlcykge1xuICAgICAgICAgICAgaWYgKCFjaGVja1N1YnR5cGUobWVtYmVyVHlwZSwgdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0b1N0cmluZyhleHBlY3RlZCl9IGJ1dCBmb3VuZCAke3RvU3RyaW5nKHQpfSBpbnN0ZWFkLmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHlwZShwcm92aWRlZDogVHlwZSwgYWxsb3dlZFR5cGVzOiBBcnJheTxUeXBlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhbGxvd2VkVHlwZXMuc29tZSh0ID0+IHQua2luZCA9PT0gcHJvdmlkZWQua2luZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTmF0aXZlVHlwZShwcm92aWRlZDogYW55LCBhbGxvd2VkVHlwZXM6IEFycmF5PE5hdGl2ZVR5cGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5zb21lKHQgPT4ge1xuICAgICAgICBpZiAodCA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQgPT09IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvdmlkZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQgJiYgIUFycmF5LmlzQXJyYXkocHJvdmlkZWQpICYmIHR5cGVvZiBwcm92aWRlZCA9PT0gJ29iamVjdCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdCA9PT0gdHlwZW9mIHByb3ZpZGVkO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhcnNlQ1NTQ29sb3J9IGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuLyoqXG4gKiBBbiBSR0JBIGNvbG9yIHZhbHVlLiBDcmVhdGUgaW5zdGFuY2VzIGZyb20gY29sb3Igc3RyaW5ncyB1c2luZyB0aGUgc3RhdGljXG4gKiBtZXRob2QgYENvbG9yLnBhcnNlYC4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgUkdCIGNoYW5uZWwgdmFsdWVzIGluIHRoZSByYW5nZVxuICogYFswLCAxXWAsIHByZW11bHRpcGxpZWQgYnkgQS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gciBUaGUgcmVkIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gZyBUaGUgZ3JlZW4gY2hhbm5lbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiIFRoZSBibHVlIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgYWxwaGEgY2hhbm5lbC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbG9yIHtcbiAgICByOiBudW1iZXI7XG4gICAgZzogbnVtYmVyO1xuICAgIGI6IG51bWJlcjtcbiAgICBhOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMuciA9IHI7XG4gICAgICAgIHRoaXMuZyA9IGc7XG4gICAgICAgIHRoaXMuYiA9IGI7XG4gICAgICAgIHRoaXMuYSA9IGE7XG4gICAgfVxuXG4gICAgc3RhdGljIGJsYWNrOiBDb2xvcjtcbiAgICBzdGF0aWMgd2hpdGU6IENvbG9yO1xuICAgIHN0YXRpYyB0cmFuc3BhcmVudDogQ29sb3I7XG4gICAgc3RhdGljIHJlZDogQ29sb3I7XG4gICAgc3RhdGljIGJsdWU6IENvbG9yO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCByZXR1cm5zIGEgYENvbG9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBIGBDb2xvcmAgaW5zdGFuY2UsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBjb2xvciBzdHJpbmcuXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKGlucHV0Pzogc3RyaW5nIHwgQ29sb3IgfCBudWxsKTogQ29sb3IgfCB2b2lkIHtcbiAgICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJnYmEgPSBwYXJzZUNTU0NvbG9yKGlucHV0KTtcbiAgICAgICAgaWYgKCFyZ2JhKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgICAgIHJnYmFbMF0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsxXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzJdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbM11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIFJHQkEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29sb3IgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBSR0JBIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwdXJwbGUgPSBuZXcgQ29sb3IucGFyc2UoJ3B1cnBsZScpO1xuICAgICAqIHB1cnBsZS50b1N0cmluZzsgLy8gPSBcInJnYmEoMTI4LDAsMTI4LDEpXCJcbiAgICAgKiB2YXIgdHJhbnNsdWNlbnRHcmVlbiA9IG5ldyBDb2xvci5wYXJzZSgncmdiYSgyNiwgMjA3LCAyNiwgLjczKScpO1xuICAgICAqIHRyYW5zbHVjZW50R3JlZW4udG9TdHJpbmcoKTsgLy8gPSBcInJnYmEoMjYsMjA3LDI2LDAuNzMpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbciwgZywgYiwgYV0gPSB0aGlzLnRvQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIGByZ2JhKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9LCR7YX0pYDtcbiAgICB9XG5cbiAgICB0b0FycmF5KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGIsIGF9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGEgPT09IDAgPyBbMCwgMCwgMCwgMF0gOiBbXG4gICAgICAgICAgICByICogMjU1IC8gYSxcbiAgICAgICAgICAgIGcgKiAyNTUgLyBhLFxuICAgICAgICAgICAgYiAqIDI1NSAvIGEsXG4gICAgICAgICAgICBhXG4gICAgICAgIF07XG4gICAgfVxufVxuXG5Db2xvci5ibGFjayA9IG5ldyBDb2xvcigwLCAwLCAwLCAxKTtcbkNvbG9yLndoaXRlID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuQ29sb3IudHJhbnNwYXJlbnQgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG5Db2xvci5yZWQgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5Db2xvci5ibHVlID0gbmV3IENvbG9yKDAsIDAsIDEsIDEpO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvcjtcbiIsIi8vIEBmbG93XG5cbi8vIEZsb3cgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIEludGwgY3JpYmJlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTI3MFxuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgQ29sbGF0b3I6IENsYXNzPEludGwkQ29sbGF0b3I+XG59O1xuXG5kZWNsYXJlIGNsYXNzIEludGwkQ29sbGF0b3Ige1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogQ29sbGF0b3JPcHRpb25zXG4gICAgKTogSW50bCRDb2xsYXRvcjtcblxuICAgIHN0YXRpYyAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IENvbGxhdG9yT3B0aW9uc1xuICAgICk6IEludGwkQ29sbGF0b3I7XG5cbiAgICBjb21wYXJlIChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlcjtcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgQ29sbGF0b3JPcHRpb25zID0ge1xuICAgIGxvY2FsZU1hdGNoZXI/OiAnbG9va3VwJyB8ICdiZXN0IGZpdCcsXG4gICAgdXNhZ2U/OiAnc29ydCcgfCAnc2VhcmNoJyxcbiAgICBzZW5zaXRpdml0eT86ICdiYXNlJyB8ICdhY2NlbnQnIHwgJ2Nhc2UnIHwgJ3ZhcmlhbnQnLFxuICAgIGlnbm9yZVB1bmN0dWF0aW9uPzogYm9vbGVhbixcbiAgICBudW1lcmljPzogYm9vbGVhbixcbiAgICBjYXNlRmlyc3Q/OiAndXBwZXInIHwgJ2xvd2VyJyB8ICdmYWxzZSdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3Ige1xuICAgIGxvY2FsZTogc3RyaW5nIHwgbnVsbDtcbiAgICBzZW5zaXRpdml0eTogJ2Jhc2UnIHwgJ2FjY2VudCcgfCAnY2FzZScgfCAndmFyaWFudCc7XG4gICAgY29sbGF0b3I6IEludGwkQ29sbGF0b3I7XG5cbiAgICBjb25zdHJ1Y3RvcihjYXNlU2Vuc2l0aXZlOiBib29sZWFuLCBkaWFjcml0aWNTZW5zaXRpdmU6IGJvb2xlYW4sIGxvY2FsZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAoY2FzZVNlbnNpdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBkaWFjcml0aWNTZW5zaXRpdmUgPyAndmFyaWFudCcgOiAnY2FzZSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBkaWFjcml0aWNTZW5zaXRpdmUgPyAnYWNjZW50JyA6ICdiYXNlJztcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgdGhpcy5jb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSxcbiAgICAgICAgICAgIHtzZW5zaXRpdml0eTogdGhpcy5zZW5zaXRpdml0eSwgdXNhZ2U6ICdzZWFyY2gnfSk7XG4gICAgfVxuXG4gICAgY29tcGFyZShsaHM6IHN0cmluZywgcmhzOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvci5jb21wYXJlKGxocywgcmhzKTtcbiAgICB9XG5cbiAgICByZXNvbHZlZExvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICAvLyBXZSBjcmVhdGUgYSBDb2xsYXRvciB3aXRob3V0IFwidXNhZ2U6IHNlYXJjaFwiIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudFxuICAgICAgICAvLyB0aGUgc2VhcmNoIG9wdGlvbnMgZW5jb2RlZCBpbiBvdXIgcmVzdWx0IChlLmcuIFwiZW4tdS1jby1zZWFyY2hcIilcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSlcbiAgICAgICAgICAgIC5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXR0ZWRTZWN0aW9uIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgaW1hZ2U6IFJlc29sdmVkSW1hZ2UgfCBudWxsO1xuICAgIHNjYWxlOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbDtcbiAgICB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHRleHQ6IHN0cmluZywgaW1hZ2U6IFJlc29sdmVkSW1hZ2UgfCBudWxsLCBzY2FsZTogbnVtYmVyIHwgbnVsbCwgZm9udFN0YWNrOiBzdHJpbmcgfCBudWxsLCB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5mb250U3RhY2sgPSBmb250U3RhY2s7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybWF0dGVkIHtcbiAgICBzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbj4pIHtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHNlY3Rpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBGb3JtYXR0ZWQge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZChbbmV3IEZvcm1hdHRlZFNlY3Rpb24odW5mb3JtYXR0ZWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpXSk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlY3Rpb25zLnNvbWUoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQubGVuZ3RoICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvbi5pbWFnZSAmJiBzZWN0aW9uLmltYWdlLm5hbWUubGVuZ3RoICE9PSAwKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZhY3RvcnkodGV4dDogRm9ybWF0dGVkIHwgc3RyaW5nKTogRm9ybWF0dGVkIHtcbiAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25zLm1hcChzZWN0aW9uID0+IHNlY3Rpb24udGV4dCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IEFycmF5PG1peGVkPiA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKFtcImltYWdlXCIsIHNlY3Rpb24uaW1hZ2UubmFtZV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlY3Rpb24udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IG1peGVkIH0gPSB7fTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnRTdGFjaykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbXCJ0ZXh0LWZvbnRcIl0gPSBbXCJsaXRlcmFsXCIsIHNlY3Rpb24uZm9udFN0YWNrLnNwbGl0KCcsJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1wiZm9udC1zY2FsZVwiXSA9IHNlY3Rpb24uc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi50ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1widGV4dC1jb2xvclwiXSA9IChbXCJyZ2JhXCJdOiBBcnJheTxtaXhlZD4pLmNvbmNhdChzZWN0aW9uLnRleHRDb2xvci50b0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkSW1hZ2VPcHRpb25zID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdmFpbGFibGU6IGJvb2xlYW5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc29sdmVkSW1hZ2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhdmFpbGFibGU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZEltYWdlT3B0aW9ucykge1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlID0gb3B0aW9ucy5hdmFpbGFibGU7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhuYW1lOiBzdHJpbmcpOiBSZXNvbHZlZEltYWdlIHwgbnVsbCB7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7IC8vIHRyZWF0IGVtcHR5IHZhbHVlcyBhcyBubyBpbWFnZVxuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkSW1hZ2Uoe25hbWUsIGF2YWlsYWJsZTogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbXCJpbWFnZVwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4vdHlwZXMvY29sbGF0b3IuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcbmltcG9ydCB7TnVsbFR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE9iamVjdFR5cGUsIFZhbHVlVHlwZSwgQ29sbGF0b3JUeXBlLCBGb3JtYXR0ZWRUeXBlLCBSZXNvbHZlZEltYWdlVHlwZSwgYXJyYXl9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJHQkEocjogbWl4ZWQsIGc6IG1peGVkLCBiOiBtaXhlZCwgYT86IG1peGVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCEoXG4gICAgICAgIHR5cGVvZiByID09PSAnbnVtYmVyJyAmJiByID49IDAgJiYgciA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGcgPT09ICdudW1iZXInICYmIGcgPj0gMCAmJiBnIDw9IDI1NSAmJlxuICAgICAgICB0eXBlb2YgYiA9PT0gJ251bWJlcicgJiYgYiA+PSAwICYmIGIgPD0gMjU1XG4gICAgKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBhID09PSAnbnVtYmVyJyA/IFtyLCBnLCBiLCBhXSA6IFtyLCBnLCBiXTtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7dmFsdWUuam9pbignLCAnKX1dOiAncicsICdnJywgYW5kICdiJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LmA7XG4gICAgfVxuXG4gICAgaWYgKCEoXG4gICAgICAgIHR5cGVvZiBhID09PSAndW5kZWZpbmVkJyB8fCAodHlwZW9mIGEgPT09ICdudW1iZXInICYmIGEgPj0gMCAmJiBhIDw9IDEpXG4gICAgKSkge1xuICAgICAgICByZXR1cm4gYEludmFsaWQgcmdiYSB2YWx1ZSBbJHtbciwgZywgYiwgYV0uam9pbignLCAnKX1dOiAnYScgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgVmFsdWUgPSBudWxsIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IENvbG9yIHwgQ29sbGF0b3IgfCBGb3JtYXR0ZWQgfCBSZXNvbHZlZEltYWdlIHwgJFJlYWRPbmx5QXJyYXk8VmFsdWU+IHwgeyArW3N0cmluZ106IFZhbHVlIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsdWUobWl4ZWQ6IG1peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKG1peGVkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1peGVkKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShtaXhlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKHZhbHVlOiBWYWx1ZSk6IFR5cGUge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTnVsbFR5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmdUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW5UeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gTnVtYmVyVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGF0b3IpIHtcbiAgICAgICAgcmV0dXJuIENvbGxhdG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiBGb3JtYXR0ZWRUeXBlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgIHJldHVybiBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgbGV0IGl0ZW1UeXBlOiBUeXBlIHwgdHlwZW9mIHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0eXBlT2YoaXRlbSk7XG4gICAgICAgICAgICBpZiAoIWl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gdCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IFZhbHVlVHlwZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheShpdGVtVHlwZSB8fCBWYWx1ZVR5cGUsIGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpO1xuICAgICAgICByZXR1cm4gT2JqZWN0VHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTogVmFsdWUpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yIHx8IHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IHtDb2xvciwgQ29sbGF0b3J9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtpc1ZhbHVlLCB0eXBlT2YsIENvbG9yfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSAgZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5cbmNsYXNzIExpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHZhbHVlOiBWYWx1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIHZhbHVlOiBWYWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCdsaXRlcmFsJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbHVlKGFyZ3NbMV0pKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYGludmFsaWQgdmFsdWVgKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChhcmdzWzFdOiBhbnkpO1xuICAgICAgICBsZXQgdHlwZSA9IHR5cGVPZih2YWx1ZSk7XG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBpbmZlciB0aGUgaXRlbSB0eXBlIGlmIHBvc3NpYmxlIGZvciB6ZXJvLWxlbmd0aCBhcnJheXNcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlLk4gPT09IDAgJiZcbiAgICAgICAgICAgIGV4cGVjdGVkICYmXG4gICAgICAgICAgICBleHBlY3RlZC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHlwZSA9IGV4cGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHR5cGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdhcnJheScgfHwgdGhpcy50eXBlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gW1wibGl0ZXJhbFwiLCB0aGlzLnZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgIC8vIENvbnN0YW50LWZvbGRpbmcgY2FuIGdlbmVyYXRlIExpdGVyYWwgZXhwcmVzc2lvbnMgdGhhdCB5b3VcbiAgICAgICAgICAgIC8vIGNvdWxkbid0IGFjdHVhbGx5IGdlbmVyYXRlIHdpdGggYSBcImxpdGVyYWxcIiBleHByZXNzaW9uLFxuICAgICAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBpbXBsZW1lbnQgYW4gZXF1aXZhbGVudCBzZXJpYWxpemF0aW9uIGhlcmVcbiAgICAgICAgICAgIHJldHVybiBbXCJyZ2JhXCJdLmNvbmNhdCh0aGlzLnZhbHVlLnRvQXJyYXkoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICAgICAgLy8gU2FtZSBhcyBDb2xvclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc2VyaWFsaXplKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy52YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXRlcmFsO1xuIiwiLy8gQGZsb3dcblxuY2xhc3MgUnVudGltZUVycm9yIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICdFeHByZXNzaW9uRXZhbHVhdGlvbkVycm9yJztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSdW50aW1lRXJyb3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7XG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIGNoZWNrU3VidHlwZSxcbiAgICB0b1N0cmluZyxcbiAgICBhcnJheVxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgc3RyaW5nOiBTdHJpbmdUeXBlLFxuICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICBvYmplY3Q6IE9iamVjdFR5cGVcbn07XG5cbmNsYXNzIEFzc2VydGlvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgIGxldCB0eXBlO1xuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgbGV0IGl0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBhcmdzWzFdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgISh0eXBlIGluIHR5cGVzKSB8fCB0eXBlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBpdGVtIHR5cGUgYXJndW1lbnQgb2YgXCJhcnJheVwiIG11c3QgYmUgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuJywgMSk7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0eXBlc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gVmFsdWVUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgTjtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1syXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGFyZ3NbMl0gIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdIDwgMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSAhPT0gTWF0aC5mbG9vcihhcmdzWzJdKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBsZW5ndGggYXJndW1lbnQgdG8gXCJhcnJheVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwnLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTiA9IGFyZ3NbMl07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0eXBlID0gYXJyYXkoaXRlbVR5cGUsIE4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0eXBlLCBwYXJzZWQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5hcmdzW2ldLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGNoZWNrU3VidHlwZSh0aGlzLnR5cGUsIHR5cGVPZih2YWx1ZSkpO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdGhpcy5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlICR7dG9TdHJpbmcodGhpcy50eXBlKX0sIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZih2YWx1ZSkpfSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy5ldmVyeShhcmcgPT4gYXJnLm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdHlwZS5raW5kXTtcbiAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0eXBlLml0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGl0ZW1UeXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICBpdGVtVHlwZS5raW5kID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goaXRlbVR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgTiA9IHR5cGUuTjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE4gPT09ICdudW1iZXInIHx8IHRoaXMuYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChOKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQuY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXNzZXJ0aW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtOdW1iZXJUeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIGFycmF5LCBTdHJpbmdUeXBlLCBDb2xvclR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkLCB7Rm9ybWF0dGVkU2VjdGlvbn0gZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB7dG9TdHJpbmcsIHR5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uID0ge1xuICAgIC8vIENvbnRlbnQgb2YgYSBzZWN0aW9uIG1heSBiZSBJbWFnZSBleHByZXNzaW9uIG9yIG90aGVyXG4gICAgLy8gdHlwZSBvZiBleHByZXNzaW9uIHRoYXQgaXMgY29lcmNhYmxlIHRvICdzdHJpbmcnLlxuICAgIGNvbnRlbnQ6IEV4cHJlc3Npb24sXG4gICAgc2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIGZvbnQ6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIHRleHRDb2xvcjogRXhwcmVzc2lvbiB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEZvcm1hdHRlZFR5cGU7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0QXJnID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpcnN0QXJnKSAmJiB0eXBlb2YgZmlyc3RBcmcgPT09ICdvYmplY3QnKSAge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gaW1hZ2Ugb3IgdGV4dCBzZWN0aW9uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICBsZXQgbmV4dFRva2VuTWF5QmVPYmplY3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYXJncy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IChhcmdzW2ldOiBhbnkpO1xuXG4gICAgICAgICAgICBpZiAobmV4dFRva2VuTWF5QmVPYmplY3QgJiYgdHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgICAgICAgbmV4dFRva2VuTWF5QmVPYmplY3QgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGxldCBzY2FsZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1snZm9udC1zY2FsZSddKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gY29udGV4dC5wYXJzZShhcmdbJ2ZvbnQtc2NhbGUnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBmb250ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnWyd0ZXh0LWZvbnQnXSkge1xuICAgICAgICAgICAgICAgICAgICBmb250ID0gY29udGV4dC5wYXJzZShhcmdbJ3RleHQtZm9udCddLCAxLCBhcnJheShTdHJpbmdUeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9udCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHRleHRDb2xvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1sndGV4dC1jb2xvciddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvciA9IGNvbnRleHQucGFyc2UoYXJnWyd0ZXh0LWNvbG9yJ10sIDEsIENvbG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dENvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RXhwcmVzc2lvbiA9IHNlY3Rpb25zW3NlY3Rpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGxhc3RFeHByZXNzaW9uLnNjYWxlID0gc2NhbGU7XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24uZm9udCA9IGZvbnQ7XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24udGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBraW5kID0gY29udGVudC50eXBlLmtpbmQ7XG4gICAgICAgICAgICAgICAgaWYgKGtpbmQgIT09ICdzdHJpbmcnICYmIGtpbmQgIT09ICd2YWx1ZScgJiYga2luZCAhPT0gJ251bGwnICYmIGtpbmQgIT09ICdyZXNvbHZlZEltYWdlJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEZvcm1hdHRlZCB0ZXh0IHR5cGUgbXVzdCBiZSAnc3RyaW5nJywgJ3ZhbHVlJywgJ2ltYWdlJyBvciAnbnVsbCcuYCk7XG5cbiAgICAgICAgICAgICAgICBuZXh0VG9rZW5NYXlCZU9iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7Y29udGVudCwgc2NhbGU6IG51bGwsIGZvbnQ6IG51bGwsIHRleHRDb2xvcjogbnVsbH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKHNlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlU2VjdGlvbiA9IHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkQ29udGVudCA9IHNlY3Rpb24uY29udGVudC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgaWYgKHR5cGVPZihldmFsdWF0ZWRDb250ZW50KSA9PT0gUmVzb2x2ZWRJbWFnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZFNlY3Rpb24oJycsIGV2YWx1YXRlZENvbnRlbnQsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZFNlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKGV2YWx1YXRlZENvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLnNjYWxlID8gc2VjdGlvbi5zY2FsZS5ldmFsdWF0ZShjdHgpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5mb250ID8gc2VjdGlvbi5mb250LmV2YWx1YXRlKGN0eCkuam9pbignLCcpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi50ZXh0Q29sb3IgPyBzZWN0aW9uLnRleHRDb2xvci5ldmFsdWF0ZShjdHgpIDogbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZCh0aGlzLnNlY3Rpb25zLm1hcChldmFsdWF0ZVNlY3Rpb24pKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBmbihzZWN0aW9uLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLnNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnQpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLmZvbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi50ZXh0Q29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhlIGNvbWJpbmF0b3JpYyBzZXQgb2YgYWxsIGNoaWxkcmVuXG4gICAgICAgIC8vIFVzdWFsbHksIHRoaXMudGV4dCB3aWxsIGJlIHVuZGVmaW5lZCBhbnl3YXlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLmNvbnRlbnQuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWydmb250LXNjYWxlJ10gPSBzZWN0aW9uLnNjYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uZm9udCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3RleHQtZm9udCddID0gc2VjdGlvbi5mb250LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1sndGV4dC1jb2xvciddID0gc2VjdGlvbi50ZXh0Q29sb3Iuc2VyaWFsaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtSZXNvbHZlZEltYWdlVHlwZSwgU3RyaW5nVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE5vIGltYWdlIG5hbWUgcHJvdmlkZWQuYCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUV4cHJlc3Npb24obmFtZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRJbWFnZU5hbWUgPSB0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBSZXNvbHZlZEltYWdlLmZyb21TdHJpbmcoZXZhbHVhdGVkSW1hZ2VOYW1lKTtcbiAgICAgICAgaWYgKHZhbHVlICYmIGN0eC5hdmFpbGFibGVJbWFnZXMpIHZhbHVlLmF2YWlsYWJsZSA9IGN0eC5hdmFpbGFibGVJbWFnZXMuaW5kZXhPZihldmFsdWF0ZWRJbWFnZU5hbWUpID4gLTE7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgLy8gVGhlIG91dHB1dCBvZiBpbWFnZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbWFnZXMgaW4gdGhlIGV2YWx1YXRpb24gY29udGV4dFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIFZhbHVlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHtDb2xvciwgdG9TdHJpbmcgYXMgdmFsdWVUb1N0cmluZywgdmFsaWRhdGVSR0JBfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBGb3JtYXRFeHByZXNzaW9uIGZyb20gJy4uL2RlZmluaXRpb25zL2Zvcm1hdC5qcyc7XG5pbXBvcnQgSW1hZ2VFeHByZXNzaW9uIGZyb20gJy4uL2RlZmluaXRpb25zL2ltYWdlLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jb25zdCB0eXBlcyA9IHtcbiAgICAndG8tYm9vbGVhbic6IEJvb2xlYW5UeXBlLFxuICAgICd0by1jb2xvcic6IENvbG9yVHlwZSxcbiAgICAndG8tbnVtYmVyJzogTnVtYmVyVHlwZSxcbiAgICAndG8tc3RyaW5nJzogU3RyaW5nVHlwZVxufTtcblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGVycm9yLWNvYWxlc2NpbmcgY29lcmNpb24gZXhwcmVzc2lvbnMgXCJ0by1udW1iZXJcIixcbiAqIFwidG8tY29sb3JcIi4gIFNpbmNlIHRoZXNlIGNvZXJjaW9ucyBjYW4gZmFpbCBhdCBydW50aW1lLCB0aGV5IGFjY2VwdCBtdWx0aXBsZVxuICogYXJndW1lbnRzLCBvbmx5IGV2YWx1YXRpbmcgb25lIGF0IGEgdGltZSB1bnRpbCBvbmUgc3VjY2VlZHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29lcmNpb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGFzc2VydCh0eXBlc1tuYW1lXSwgbmFtZSk7XG5cbiAgICAgICAgaWYgKChuYW1lID09PSAndG8tYm9vbGVhbicgfHwgbmFtZSA9PT0gJ3RvLXN0cmluZycpICYmIGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbbmFtZV07XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29lcmNpb24odHlwZSwgcGFyc2VkKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGxldCBpbnB1dDtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGN0eC5wYXJzZUNvbG9yKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDMgfHwgaW5wdXQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBgSW52YWxpZCByYmdhIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoaW5wdXQpfTogZXhwZWN0ZWQgYW4gYXJyYXkgY29udGFpbmluZyBlaXRoZXIgdGhyZWUgb3IgZm91ciBudW1lcmljIHZhbHVlcy5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZVJHQkEoaW5wdXRbMF0sIGlucHV0WzFdLCBpbnB1dFsyXSwgaW5wdXRbM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IoKGlucHV0WzBdOiBhbnkpIC8gMjU1LCAoaW5wdXRbMV06IGFueSkgLyAyNTUsIChpbnB1dFsyXTogYW55KSAvIDI1NSwgKGlucHV0WzNdOiBhbnkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IgfHwgYENvdWxkIG5vdCBwYXJzZSBjb2xvciBmcm9tIHZhbHVlICcke3R5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IFN0cmluZyhKU09OLnN0cmluZ2lmeShpbnB1dCkpfSdgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSB0byBudW1iZXIuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBleHBsaWNpdCAndG8tZm9ybWF0dGVkJyBidXQgdGhpcyBjb2VyY2lvbiBjYW4gYmUgaW1wbGljaXRseVxuICAgICAgICAgICAgLy8gY3JlYXRlZCBieSBwcm9wZXJ0aWVzIHRoYXQgZXhwZWN0IHRoZSAnZm9ybWF0dGVkJyB0eXBlLlxuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoYXJnID0+IGFyZy5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnZm9ybWF0dGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKFt7Y29udGVudDogdGhpcy5hcmdzWzBdLCBzY2FsZTogbnVsbCwgZm9udDogbnVsbCwgdGV4dENvbG9yOiBudWxsfV0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VFeHByZXNzaW9uKHRoaXMuYXJnc1swXSkuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW2B0by0ke3RoaXMudHlwZS5raW5kfWBdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZXJjaW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIHtHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlLCBGZWF0dXJlU3RhdGV9IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuXG5jb25zdCBnZW9tZXRyeVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5jbGFzcyBFdmFsdWF0aW9uQ29udGV4dCB7XG4gICAgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcztcbiAgICBmZWF0dXJlOiA/RmVhdHVyZTtcbiAgICBmZWF0dXJlU3RhdGU6ID9GZWF0dXJlU3RhdGU7XG4gICAgZm9ybWF0dGVkU2VjdGlvbjogP0Zvcm1hdHRlZFNlY3Rpb247XG4gICAgYXZhaWxhYmxlSW1hZ2VzOiA/QXJyYXk8c3RyaW5nPjtcbiAgICBjYW5vbmljYWw6ID9DYW5vbmljYWxUaWxlSUQ7XG5cbiAgICBfcGFyc2VDb2xvckNhY2hlOiB7W186IHN0cmluZ106ID9Db2xvcn07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxzID0gKG51bGw6IGFueSk7XG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmVhdHVyZVN0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtYXR0ZWRTZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGFyc2VDb2xvckNhY2hlID0ge307XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSW1hZ2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBudWxsO1xuICAgIH1cblxuICAgIGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdpZCcgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZW9tZXRyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyB0eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGUgPT09ICdudW1iZXInID8gZ2VvbWV0cnlUeXBlc1t0aGlzLmZlYXR1cmUudHlwZV0gOiB0aGlzLmZlYXR1cmUudHlwZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2VvbWV0cnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgJ2dlb21ldHJ5JyBpbiB0aGlzLmZlYXR1cmUgPyB0aGlzLmZlYXR1cmUuZ2VvbWV0cnkgOiBudWxsO1xuICAgIH1cblxuICAgIGNhbm9uaWNhbElEKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWw7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiB0aGlzLmZlYXR1cmUucHJvcGVydGllcyB8fCB7fTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbG9yKGlucHV0OiBzdHJpbmcpOiA/Q29sb3Ige1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcGFyc2VDb2xvckNhY2hlW2lucHV0XTtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICAgIGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF0gPSBDb2xvci5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2YWx1YXRpb25Db250ZXh0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt0b1N0cmluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJ5fSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFZhcmFyZ3MgPSB7fCB0eXBlOiBUeXBlIHx9O1xudHlwZSBTaWduYXR1cmUgPSBBcnJheTxUeXBlPiB8IFZhcmFyZ3M7XG50eXBlIEV2YWx1YXRlID0gKEV2YWx1YXRpb25Db250ZXh0LCBBcnJheTxFeHByZXNzaW9uPikgPT4gVmFsdWU7XG50eXBlIERlZmluaXRpb24gPSBbVHlwZSwgU2lnbmF0dXJlLCBFdmFsdWF0ZV0gfFxuICAgIHt8dHlwZTogVHlwZSwgb3ZlcmxvYWRzOiBBcnJheTxbU2lnbmF0dXJlLCBFdmFsdWF0ZV0+fH07XG5cbmNsYXNzIENvbXBvdW5kRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBUeXBlO1xuICAgIF9ldmFsdWF0ZTogRXZhbHVhdGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBzdGF0aWMgZGVmaW5pdGlvbnM6IHtbXzogc3RyaW5nXTogRGVmaW5pdGlvbiB9O1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlLCBldmFsdWF0ZTogRXZhbHVhdGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlID0gZXZhbHVhdGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUoY3R4LCB0aGlzLmFyZ3MpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5hbWVdLmNvbmNhdCh0aGlzLmFyZ3MubWFwKGFyZyA9PiBhcmcuc2VyaWFsaXplKCkpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgY29uc3Qgb3A6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zW29wXTtcbiAgICAgICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBleHByZXNzaW9uIFwiJHtvcH1cIi4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyBjaGVjayBhcmd1bWVudCB0eXBlcyBhZ2FpbnN0IGVhY2ggc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIGRlZmluaXRpb25bMF0gOiBkZWZpbml0aW9uLnR5cGU7XG5cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlT3ZlcmxvYWRzID0gQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSA/XG4gICAgICAgICAgICBbW2RlZmluaXRpb25bMV0sIGRlZmluaXRpb25bMl1dXSA6XG4gICAgICAgICAgICBkZWZpbml0aW9uLm92ZXJsb2FkcztcblxuICAgICAgICBjb25zdCBvdmVybG9hZHMgPSBhdmFpbGFibGVPdmVybG9hZHMuZmlsdGVyKChbc2lnbmF0dXJlXSkgPT4gKFxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSB8fCAvLyB2YXJhZ3NcbiAgICAgICAgICAgIHNpZ25hdHVyZS5sZW5ndGggPT09IGFyZ3MubGVuZ3RoIC0gMSAvLyBjb3JyZWN0IHBhcmFtIGNvdW50XG4gICAgICAgICkpO1xuXG4gICAgICAgIGxldCBzaWduYXR1cmVDb250ZXh0OiBQYXJzaW5nQ29udGV4dCA9IChudWxsOiBhbnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhcmFtcywgZXZhbHVhdGVdIG9mIG92ZXJsb2Fkcykge1xuICAgICAgICAgICAgLy8gVXNlIGEgZnJlc2ggY29udGV4dCBmb3IgZWFjaCBhdHRlbXB0ZWQgc2lnbmF0dXJlIHNvIHRoYXQsIGlmXG4gICAgICAgICAgICAvLyB3ZSBldmVudHVhbGx5IHN1Y2NlZWQsIHdlIGhhdmVuJ3QgcG9sbHV0ZWQgYGNvbnRleHQuZXJyb3JzYC5cbiAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQgPSBuZXcgUGFyc2luZ0NvbnRleHQoY29udGV4dC5yZWdpc3RyeSwgY29udGV4dC5wYXRoLCBudWxsLCBjb250ZXh0LnNjb3BlKTtcblxuICAgICAgICAgICAgLy8gRmlyc3QgcGFyc2UgYWxsIHRoZSBhcmdzLCBwb3RlbnRpYWxseSBjb2VyY2luZyB0byB0aGVcbiAgICAgICAgICAgIC8vIHR5cGVzIGV4cGVjdGVkIGJ5IHRoaXMgb3ZlcmxvYWQuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzOiBBcnJheTxFeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICAgICAgbGV0IGFyZ1BhcnNlRmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpIC0gMV0gOlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudHlwZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHNpZ25hdHVyZUNvbnRleHQucGFyc2UoYXJnLCAxICsgcGFyc2VkQXJncy5sZW5ndGgsIGV4cGVjdGVkVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnUGFyc2VGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyc2VkQXJncy5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnUGFyc2VGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBjb2VyY2UgYXJncyBvZiB0aGlzIG92ZXJsb2FkIHRvIGV4cGVjdGVkIHR5cGUsIG1vdmVcbiAgICAgICAgICAgICAgICAvLyBvbiB0byBuZXh0IG9uZS5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSBwYXJzZWRBcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVDb250ZXh0LmVycm9yKGBFeHBlY3RlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7cGFyc2VkQXJncy5sZW5ndGh9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZWRBcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBwYXJhbXNbaV0gOiBwYXJhbXMudHlwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBwYXJzZWRBcmdzW2ldO1xuICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuY29uY2F0KGkgKyAxKS5jaGVja1N1YnR5cGUoZXhwZWN0ZWQsIGFyZy50eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNpZ25hdHVyZUNvbnRleHQuZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRFeHByZXNzaW9uKG9wLCB0eXBlLCBldmFsdWF0ZSwgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoIXNpZ25hdHVyZUNvbnRleHQgfHwgc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgaWYgKG92ZXJsb2Fkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goLi4uc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBvdmVybG9hZHMubGVuZ3RoID8gb3ZlcmxvYWRzIDogYXZhaWxhYmxlT3ZlcmxvYWRzO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGV4cGVjdGVkXG4gICAgICAgICAgICAgICAgLm1hcCgoW3BhcmFtc10pID0+IHN0cmluZ2lmeVNpZ25hdHVyZShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgfCAnKTtcblxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVHlwZXMgPSBbXTtcbiAgICAgICAgICAgIC8vIEZvciBlcnJvciBtZXNzYWdlLCByZS1wYXJzZSBhcmd1bWVudHMgd2l0aG91dCB0cnlpbmcgdG9cbiAgICAgICAgICAgIC8vIGFwcGx5IGFueSBjb2VyY2lvbnNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgMSArIGFjdHVhbFR5cGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVzLnB1c2godG9TdHJpbmcocGFyc2VkLnR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBvZiB0eXBlICR7c2lnbmF0dXJlc30sIGJ1dCBmb3VuZCAoJHthY3R1YWxUeXBlcy5qb2luKCcsICcpfSkgaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyByZWdpc3RlcihcbiAgICAgICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeSxcbiAgICAgICAgZGVmaW5pdGlvbnM6IHtbXzogc3RyaW5nXTogRGVmaW5pdGlvbiB9XG4gICAgKSB7XG4gICAgICAgIGFzc2VydCghQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zKTtcbiAgICAgICAgQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkZWZpbml0aW9ucykge1xuICAgICAgICAgICAgcmVnaXN0cnlbbmFtZV0gPSBDb21wb3VuZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSkge1xuICAgICAgICByZXR1cm4gYCgke3NpZ25hdHVyZS5tYXAodG9TdHJpbmcpLmpvaW4oJywgJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAoJHt0b1N0cmluZyhzaWduYXR1cmUudHlwZSl9Li4uKWA7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb3VuZEV4cHJlc3Npb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1N0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBDb2xsYXRvciBmcm9tICcuLi90eXBlcy9jb2xsYXRvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBjYXNlU2Vuc2l0aXZlOiBFeHByZXNzaW9uO1xuICAgIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBFeHByZXNzaW9uLCBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENvbGxhdG9yVHlwZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlID0gZGlhY3JpdGljU2Vuc2l0aXZlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gY29udGV4dC5wYXJzZShcbiAgICAgICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpYWNyaXRpY1NlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddLCAxLCBCb29sZWFuVHlwZSk7XG4gICAgICAgIGlmICghZGlhY3JpdGljU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3JFeHByZXNzaW9uKGNhc2VTZW5zaXRpdmUsIGRpYWNyaXRpY1NlbnNpdGl2ZSwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3IodGhpcy5jYXNlU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5jYXNlU2Vuc2l0aXZlKTtcbiAgICAgICAgZm4odGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIC8vIFRlY2huaWNhbGx5IHRoZSBzZXQgb2YgcG9zc2libGUgb3V0cHV0cyBpcyB0aGUgY29tYmluYXRvcmljIHNldCBvZiBDb2xsYXRvcnMgcHJvZHVjZWRcbiAgICAgICAgLy8gYnkgYWxsIHBvc3NpYmxlIG91dHB1dHMgb2YgbG9jYWxlL2Nhc2VTZW5zaXRpdmUvZGlhY3JpdGljU2Vuc2l0aXZlXG4gICAgICAgIC8vIEJ1dCBmb3IgdGhlIHByaW1hcnkgdXNlIG9mIENvbGxhdG9ycyBpbiBjb21wYXJpc29uIG9wZXJhdG9ycywgd2UgaWdub3JlIHRoZSBDb2xsYXRvcidzXG4gICAgICAgIC8vIHBvc3NpYmxlIG91dHB1dHMgYW55d2F5LCBzbyB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBsZWF2aW5nIHRoaXMgZmFsc2UgZm9yIG5vdy5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICBvcHRpb25zWydjYXNlLXNlbnNpdGl2ZSddID0gdGhpcy5jYXNlU2Vuc2l0aXZlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPSB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBvcHRpb25zWydsb2NhbGUnXSA9IHRoaXMubG9jYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJjb2xsYXRvclwiLCBvcHRpb25zXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2lzVmFsdWV9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHtCb29sZWFuVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTiwgR2VvSlNPTlBvbHlnb24sIEdlb0pTT05NdWx0aVBvbHlnb259IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbnR5cGUgR2VvSlNPTlBvbHlnb25zID18IEdlb0pTT05Qb2x5Z29uIHwgR2VvSlNPTk11bHRpUG9seWdvbjtcblxuLy8gbWluWCwgbWluWSwgbWF4WCwgbWF4WVxudHlwZSBCQm94ID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5jb25zdCBFWFRFTlQgPSA4MTkyO1xuXG5mdW5jdGlvbiB1cGRhdGVCQm94KGJib3g6IEJCb3gsIGNvb3JkOiBQb2ludCkge1xuICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBjb29yZFswXSk7XG4gICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIGNvb3JkWzFdKTtcbiAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgY29vcmRbMF0pO1xuICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBjb29yZFsxXSk7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWWZyb21MYXQobGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCAtICgxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSkpKSAvIDM2MDtcbn1cblxuZnVuY3Rpb24gYm94V2l0aGluQm94KGJib3gxOiBCQm94LCBiYm94MjogQkJveCkge1xuICAgIGlmIChiYm94MVswXSA8PSBiYm94MlswXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsyXSA+PSBiYm94MlsyXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsxXSA8PSBiYm94MlsxXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVszXSA+PSBiYm94MlszXSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlQ29vcmRpbmF0ZXMocCwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCB4ID0gbWVyY2F0b3JYZnJvbUxuZyhwWzBdKTtcbiAgICBjb25zdCB5ID0gbWVyY2F0b3JZZnJvbUxhdChwWzFdKTtcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcbiAgICByZXR1cm4gW01hdGgucm91bmQoeCAqIHRpbGVzQXRab29tICogRVhURU5UKSwgTWF0aC5yb3VuZCh5ICogdGlsZXNBdFpvb20gKiBFWFRFTlQpXTtcbn1cblxuZnVuY3Rpb24gb25Cb3VuZGFyeShwLCBwMSwgcDIpIHtcbiAgICBjb25zdCB4MSA9IHBbMF0gLSBwMVswXTtcbiAgICBjb25zdCB5MSA9IHBbMV0gLSBwMVsxXTtcbiAgICBjb25zdCB4MiA9IHBbMF0gLSBwMlswXTtcbiAgICBjb25zdCB5MiA9IHBbMV0gLSBwMlsxXTtcbiAgICByZXR1cm4gKHgxICogeTIgLSB4MiAqIHkxID09PSAwKSAmJiAoeDEgKiB4MiA8PSAwKSAmJiAoeTEgKiB5MiA8PSAwKTtcbn1cblxuZnVuY3Rpb24gcmF5SW50ZXJzZWN0KHAsIHAxLCBwMikge1xuICAgIHJldHVybiAoKHAxWzFdID4gcFsxXSkgIT09IChwMlsxXSA+IHBbMV0pKSAmJiAocFswXSA8IChwMlswXSAtIHAxWzBdKSAqIChwWzFdIC0gcDFbMV0pIC8gKHAyWzFdIC0gcDFbMV0pICsgcDFbMF0pO1xufVxuXG4vLyByYXkgY2FzdGluZyBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBpZiBwb2ludCBpcyBpbiBwb2x5Z29uXG5mdW5jdGlvbiBwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHJpbmdzKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcmluZ3NbaV07XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW4yID0gcmluZy5sZW5ndGg7IGogPCBsZW4yIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBpZiAob25Cb3VuZGFyeShwb2ludCwgcmluZ1tqXSwgcmluZ1tqICsgMV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmF5SW50ZXJzZWN0KHBvaW50LCByaW5nW2pdLCByaW5nW2ogKyAxXSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuZnVuY3Rpb24gcG9pbnRXaXRoaW5Qb2x5Z29ucyhwb2ludCwgcG9seWdvbnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGVycCh2MSwgdjIpIHtcbiAgICByZXR1cm4gKHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdKTtcbn1cblxuLy8gY2hlY2sgaWYgcDEgYW5kIHAyIGFyZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2YgbGluZSBzZWdtZW50IHExLT5xMlxuZnVuY3Rpb24gIHR3b1NpZGVkKHAxLCBwMiwgcTEsIHEyKSB7XG4gICAgLy8gcTEtPnAxICh4MSwgeTEpLCBxMS0+cDIgKHgyLCB5MiksIHExLT5xMiAoeDMsIHkzKVxuICAgIGNvbnN0IHgxID0gcDFbMF0gLSBxMVswXTtcbiAgICBjb25zdCB5MSA9IHAxWzFdIC0gcTFbMV07XG4gICAgY29uc3QgeDIgPSBwMlswXSAtIHExWzBdO1xuICAgIGNvbnN0IHkyID0gcDJbMV0gLSBxMVsxXTtcbiAgICBjb25zdCB4MyA9IHEyWzBdIC0gcTFbMF07XG4gICAgY29uc3QgeTMgPSBxMlsxXSAtIHExWzFdO1xuICAgIGNvbnN0IGRldDEgPSAoeDEgKiB5MyAtIHgzICogeTEpO1xuICAgIGNvbnN0IGRldDIgPSAgKHgyICogeTMgLSB4MyAqIHkyKTtcbiAgICBpZiAoKGRldDEgPiAwICYmIGRldDIgPCAwKSB8fCAoZGV0MSA8IDAgJiYgZGV0MiA+IDApKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBhLCBiIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQxLCBjIGFuZCBkIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQyXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0TGluZShhLCBiLCBjLCBkKSB7XG4gICAgLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGFyZSBwYXJhbGxlbCBvciBub3RcbiAgICAvLyBwcmVjb25kaXRpb24gaXMgZW5kIHBvaW50IGEsIGIgaXMgaW5zaWRlIHBvbHlnb24sIGlmIGxpbmUgYS0+YiBpc1xuICAgIC8vIHBhcmFsbGVsIHRvIHBvbHlnb24gZWRnZSBjLT5kLCB0aGVuIGEtPmIgd29uJ3QgaW50ZXJzZWN0IHdpdGggYy0+ZFxuICAgIGNvbnN0IHZlY3RvclAgPSBbYlswXSAtIGFbMF0sIGJbMV0gLSBhWzFdXTtcbiAgICBjb25zdCB2ZWN0b3JRID0gW2RbMF0gLSBjWzBdLCBkWzFdIC0gY1sxXV07XG4gICAgaWYgKHBlcnAodmVjdG9yUSwgdmVjdG9yUCkgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIElmIGxpbmVzIGFyZSBpbnRlcnNlY3Rpbmcgd2l0aCBlYWNoIG90aGVyLCB0aGUgcmVsYXRpdmUgbG9jYXRpb24gc2hvdWxkIGJlOlxuICAgIC8vIGEgYW5kIGIgbGllIGluIGRpZmZlcmVudCBzaWRlcyBvZiBzZWdtZW50IGMtPmRcbiAgICAvLyBjIGFuZCBkIGxpZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2Ygc2VnbWVudCBhLT5iXG4gICAgaWYgKHR3b1NpZGVkKGEsIGIsIGMsIGQpICYmIHR3b1NpZGVkKGMsIGQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RQb2x5Z29uKHAxLCBwMiwgcG9seWdvbikge1xuICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBldmVyeSBlZGdlIG9mIHRoZSByaW5nXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmluZy5sZW5ndGggLSAxOyArK2opIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW50ZXJzZWN0TGluZShwMSwgcDIsIHJpbmdbal0sIHJpbmdbaiArIDFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZVN0cmluZ1dpdGhpblBvbHlnb24obGluZSwgcG9seWdvbikge1xuICAgIC8vIEZpcnN0LCBjaGVjayBpZiBnZW9tZXRyeSBwb2ludHMgb2YgbGluZSBzZWdtZW50cyBhcmUgYWxsIGluc2lkZSBwb2x5Z29uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICghcG9pbnRXaXRoaW5Qb2x5Z29uKGxpbmVbaV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIGNoZWNrIGlmIHRoZXJlIGlzIGxpbmUgc2VnbWVudCBpbnRlcnNlY3RpbmcgcG9seWdvbiBlZGdlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpZiAobGluZUludGVyc2VjdFBvbHlnb24obGluZVtpXSwgbGluZVtpICsgMV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29ucyhsaW5lLCBwb2x5Z29ucykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb24oY29vcmRpbmF0ZXMsIGJib3gsIGNhbm9uaWNhbCkge1xuICAgIGNvbnN0IHBvbHlnb24gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY29vcmQgPSBnZXRUaWxlQ29vcmRpbmF0ZXMoY29vcmRpbmF0ZXNbaV1bal0sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICB1cGRhdGVCQm94KGJib3gsIGNvb3JkKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChjb29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcG9seWdvbi5wdXNoKHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcG9seWdvbjtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb25zKGNvb3JkaW5hdGVzLCBiYm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCBwb2x5Z29ucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IGdldFRpbGVQb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBiYm94LCBjYW5vbmljYWwpO1xuICAgICAgICBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgIH1cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvaW50KHAsIGJib3gsIHBvbHlCQm94LCB3b3JsZFNpemUpIHtcbiAgICBpZiAocFswXSA8IHBvbHlCQm94WzBdIHx8IHBbMF0gPiBwb2x5QkJveFsyXSkge1xuICAgICAgICBjb25zdCBoYWxmV29ybGRTaXplID0gd29ybGRTaXplICogMC41O1xuICAgICAgICBsZXQgc2hpZnQgPSAocFswXSAtIHBvbHlCQm94WzBdID4gaGFsZldvcmxkU2l6ZSkgPyAtd29ybGRTaXplIDogKHBvbHlCQm94WzBdIC0gcFswXSA+IGhhbGZXb3JsZFNpemUpID8gd29ybGRTaXplIDogMDtcbiAgICAgICAgaWYgKHNoaWZ0ID09PSAwKSB7XG4gICAgICAgICAgICBzaGlmdCA9IChwWzBdIC0gcG9seUJCb3hbMl0gPiBoYWxmV29ybGRTaXplKSA/IC13b3JsZFNpemUgOiAocG9seUJCb3hbMl0gLSBwWzBdID4gaGFsZldvcmxkU2l6ZSkgPyB3b3JsZFNpemUgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHBbMF0gKz0gc2hpZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUJCb3goYmJveCwgcCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0QkJveChiYm94KSB7XG4gICAgYmJveFswXSA9IGJib3hbMV0gPSBJbmZpbml0eTtcbiAgICBiYm94WzJdID0gYmJveFszXSA9IC1JbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvaW50cyhnZW9tZXRyeSwgcG9pbnRCQm94LCBwb2x5QkJveCwgY2Fub25pY2FsKSB7XG4gICAgY29uc3Qgd29ybGRTaXplID0gTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogRVhURU5UO1xuICAgIGNvbnN0IHNoaWZ0cyA9IFtjYW5vbmljYWwueCAqIEVYVEVOVCwgY2Fub25pY2FsLnkgKiBFWFRFTlRdO1xuICAgIGNvbnN0IHRpbGVQb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBvaW50cyBvZiBnZW9tZXRyeSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZVBvaW50KHAsIHBvaW50QkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB0aWxlUG9pbnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVQb2ludHM7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVMaW5lcyhnZW9tZXRyeSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCB3b3JsZFNpemUgPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueikgKiBFWFRFTlQ7XG4gICAgY29uc3Qgc2hpZnRzID0gW2Nhbm9uaWNhbC54ICogRVhURU5ULCBjYW5vbmljYWwueSAqIEVYVEVOVF07XG4gICAgY29uc3QgdGlsZUxpbmVzID0gW107XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgbGluZSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZUJCb3gobGluZUJCb3gsIHApO1xuICAgICAgICAgICAgdGlsZUxpbmUucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aWxlTGluZXMucHVzaCh0aWxlTGluZSk7XG4gICAgfVxuICAgIGlmIChsaW5lQkJveFsyXSAtIGxpbmVCQm94WzBdIDw9IHdvcmxkU2l6ZSAvIDIpIHtcbiAgICAgICAgcmVzZXRCQm94KGxpbmVCQm94KTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIGxpbmUpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2ludChwLCBsaW5lQkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVMaW5lcztcbn1cblxuZnVuY3Rpb24gcG9pbnRzV2l0aGluUG9seWdvbnMoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgcG9seWdvbkdlb21ldHJ5OiBHZW9KU09OUG9seWdvbnMpIHtcbiAgICBjb25zdCBwb2ludEJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbihwb2ludCwgdGlsZVBvbHlnb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb25HZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbnMgPSBnZXRUaWxlUG9seWdvbnMocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbnMocG9pbnQsIHRpbGVQb2x5Z29ucykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIHBvbHlnb25HZW9tZXRyeTogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgY29uc3QgbGluZUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZUxpbmVzID0gZ2V0VGlsZUxpbmVzKGN0eC5nZW9tZXRyeSgpLCBsaW5lQkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KGxpbmVCQm94LCBwb2x5QkJveCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGlsZUxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHRpbGVQb2x5Z29uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgdGlsZVBvbHlnb25zID0gZ2V0VGlsZVBvbHlnb25zKHBvbHlnb25HZW9tZXRyeS5jb29yZGluYXRlcywgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lcyA9IGdldFRpbGVMaW5lcyhjdHguZ2VvbWV0cnkoKSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBpZiAoIWJveFdpdGhpbkJveChsaW5lQkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgaWYgKCFsaW5lU3RyaW5nV2l0aGluUG9seWdvbnMobGluZSwgdGlsZVBvbHlnb25zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5jbGFzcyBXaXRoaW4gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGdlb2pzb246IEdlb0pTT05cbiAgICBnZW9tZXRyaWVzOiBHZW9KU09OUG9seWdvbnM7XG5cbiAgICBjb25zdHJ1Y3RvcihnZW9qc29uOiBHZW9KU09OLCBnZW9tZXRyaWVzOiBHZW9KU09OUG9seWdvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgIHRoaXMuZ2VvanNvbiA9IGdlb2pzb247XG4gICAgICAgIHRoaXMuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgaWYgKGlzVmFsdWUoYXJnc1sxXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb24gPSAoYXJnc1sxXTogT2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChnZW9qc29uLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdlb2pzb24uZmVhdHVyZXNbaV0uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXRoaW4oZ2VvanNvbiwgZ2VvanNvbi5mZWF0dXJlc1tpXS5nZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdlb2pzb24udHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdlb2pzb24uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aGluKGdlb2pzb24sIGdlb2pzb24uZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvanNvbi50eXBlICA9PT0gJ1BvbHlnb24nIHx8IGdlb2pzb24udHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhpbihnZW9qc29uLCBnZW9qc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyB2YWxpZCBnZW9qc29uIG9iamVjdCB0aGF0IGNvbnRhaW5zIHBvbHlnb24gZ2VvbWV0cnkgdHlwZS5gKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChjdHguZ2VvbWV0cnkoKSAhPSBudWxsICYmIGN0eC5jYW5vbmljYWxJRCgpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRzV2l0aGluUG9seWdvbnMoY3R4LCB0aGlzLmdlb21ldHJpZXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eCwgdGhpcy5nZW9tZXRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gW1wid2l0aGluXCIsIHRoaXMuZ2VvanNvbl07XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFdpdGhpbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBXaXRoaW4gZnJvbSAnLi9kZWZpbml0aW9ucy93aXRoaW4uanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5cbmZ1bmN0aW9uIGlzRmVhdHVyZUNvbnN0YW50KGU6IEV4cHJlc3Npb24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoZS5uYW1lID09PSAnZ2V0JyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnZmVhdHVyZS1zdGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLm5hbWUgPT09ICdoYXMnICYmIGUuYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ3Byb3BlcnRpZXMnIHx8XG4gICAgICAgICAgICBlLm5hbWUgPT09ICdnZW9tZXRyeS10eXBlJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnaWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eZmlsdGVyLS8udGVzdChlLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIFdpdGhpbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoYXJnKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNTdGF0ZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZTogRXhwcmVzc2lvbiwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmIHByb3BlcnRpZXMuaW5kZXhPZihlLm5hbWUpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICYmICFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoYXJnLCBwcm9wZXJ0aWVzKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7aXNGZWF0dXJlQ29uc3RhbnQsIGlzR2xvYmFsUHJvcGVydHlDb25zdGFudCwgaXNTdGF0ZUNvbnN0YW50fTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbmNsYXNzIFZhciBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgYm91bmRFeHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGJvdW5kRXhwcmVzc2lvbi50eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmJvdW5kRXhwcmVzc2lvbiA9IGJvdW5kRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIgfHwgdHlwZW9mIGFyZ3NbMV0gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghY29udGV4dC5zY29wZS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIHZhcmlhYmxlIFwiJHtuYW1lfVwiLiBNYWtlIHN1cmUgXCIke25hbWV9XCIgaGFzIGJlZW4gYm91bmQgaW4gYW4gZW5jbG9zaW5nIFwibGV0XCIgZXhwcmVzc2lvbiBiZWZvcmUgdXNpbmcgaXQuYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFZhcihuYW1lLCBjb250ZXh0LnNjb3BlLmdldChuYW1lKSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcInZhclwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmFyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFNjb3BlIGZyb20gJy4vc2NvcGUuanMnO1xuaW1wb3J0IHtjaGVja1N1YnR5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL3BhcnNpbmdfZXJyb3IuanMnO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9kZWZpbml0aW9ucy9saXRlcmFsLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9kZWZpbml0aW9ucy9hc3NlcnRpb24uanMnO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29lcmNpb24uanMnO1xuaW1wb3J0IEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9kZWZpbml0aW9ucy9jb2xsYXRvci5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vZGVmaW5pdGlvbnMvd2l0aGluLmpzJztcbmltcG9ydCB7aXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50LCBpc0ZlYXR1cmVDb25zdGFudH0gZnJvbSAnLi9pc19jb25zdGFudC5qcyc7XG5pbXBvcnQgVmFyIGZyb20gJy4vZGVmaW5pdGlvbnMvdmFyLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIEV4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBTdGF0ZSBhc3NvY2lhdGVkIHBhcnNpbmcgYXQgYSBnaXZlbiBwb2ludCBpbiBhbiBleHByZXNzaW9uIHRyZWUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYXJzaW5nQ29udGV4dCB7XG4gICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeTtcbiAgICBwYXRoOiBBcnJheTxudW1iZXI+O1xuICAgIGtleTogc3RyaW5nO1xuICAgIHNjb3BlOiBTY29wZTtcbiAgICBlcnJvcnM6IEFycmF5PFBhcnNpbmdFcnJvcj47XG5cbiAgICAvLyBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24uIFByb3ZpZGVkIG9ubHkgdG8gYWxsb3cgRXhwcmVzc2lvblxuICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBpbmZlciBhcmd1bWVudCB0eXBlczogRXhwcmVzc2lvbiNwYXJzZSgpIG5lZWQgbm90XG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHBhcnNlZCBleHByZXNzaW9uIG1hdGNoZXNcbiAgICAvLyBgZXhwZWN0ZWRUeXBlYC5cbiAgICBleHBlY3RlZFR5cGU6ID9UeXBlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnksXG4gICAgICAgIHBhdGg6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICAgICAgZXhwZWN0ZWRUeXBlOiA/VHlwZSxcbiAgICAgICAgc2NvcGU6IFNjb3BlID0gbmV3IFNjb3BlKCksXG4gICAgICAgIGVycm9yczogQXJyYXk8UGFyc2luZ0Vycm9yPiA9IFtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5rZXkgPSBwYXRoLm1hcChwYXJ0ID0+IGBbJHtwYXJ0fV1gKS5qb2luKCcnKTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgdGhpcy5leHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGV4cHIgdGhlIEpTT04gZXhwcmVzc2lvbiB0byBwYXJzZVxuICAgICAqIEBwYXJhbSBpbmRleCB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaW5kZXggaWYgdGhpcyBleHByZXNzaW9uIGlzIGFuIGFyZ3VtZW50IG9mIGEgcGFyZW50IGV4cHJlc3Npb24gdGhhdCdzIGJlaW5nIHBhcnNlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMub21pdFR5cGVBbm5vdGF0aW9ucyBzZXQgdHJ1ZSB0byBvbWl0IGluZmVycmVkIHR5cGUgYW5ub3RhdGlvbnMuICBDYWxsZXIgYmV3YXJlOiB3aXRoIHRoaXMgb3B0aW9uIHNldCwgdGhlIHBhcnNlZCBleHByZXNzaW9uJ3MgdHlwZSB3aWxsIE5PVCBzYXRpc2Z5IGBleHBlY3RlZFR5cGVgIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHdyYXBwZWQgaW4gYW4gaW5mZXJyZWQgYW5ub3RhdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBhcnNlKFxuICAgICAgICBleHByOiBtaXhlZCxcbiAgICAgICAgaW5kZXg/OiBudW1iZXIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT86ID9UeXBlLFxuICAgICAgICBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPixcbiAgICAgICAgb3B0aW9uczoge3R5cGVBbm5vdGF0aW9uPzogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0J30gPSB7fVxuICAgICk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25jYXQoaW5kZXgsIGV4cGVjdGVkVHlwZSwgYmluZGluZ3MpLl9wYXJzZShleHByLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2UoZXhwciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgX3BhcnNlKGV4cHI6IG1peGVkLCBvcHRpb25zOiB7dHlwZUFubm90YXRpb24/OiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnfSk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGV4cHIgPT09IG51bGwgfHwgdHlwZW9mIGV4cHIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBleHByID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGV4cHIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBleHByID0gWydsaXRlcmFsJywgZXhwcl07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhbm5vdGF0ZShwYXJzZWQsIHR5cGUsIHR5cGVBbm5vdGF0aW9uOiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZUFubm90YXRpb24gPT09ICdhc3NlcnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odHlwZSwgW3BhcnNlZF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQW5ub3RhdGlvbiA9PT0gJ2NvZXJjZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvZXJjaW9uKHR5cGUsIFtwYXJzZWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFtdXS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3AgPSBleHByWzBdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBFeHByZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG9wfSBpbnN0ZWFkLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBFeHByID0gdGhpcy5yZWdpc3RyeVtvcF07XG4gICAgICAgICAgICBpZiAoRXhwcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBFeHByLnBhcnNlKGV4cHIsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cGVjdGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuZXhwZWN0ZWRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBwYXJzZWQudHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGV4cGVjdCBhIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBvciBhcnJheSBidXQgaGF2ZSBhIHZhbHVlLCB3cmFwIGl0IGluIGFuIGFzc2VydGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBjb2xvciBvciBmb3JtYXR0ZWQgc3RyaW5nLCBidXQgaGF2ZSBhIHN0cmluZyBvciB2YWx1ZSwgd3JhcCBpdCBpbiBhIGNvZXJjaW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvIHN0YXRpYyB0eXBlLWNoZWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBiZWhhdmlvcnMgYXJlIG92ZXJyaWRhYmxlIGZvcjpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFRoZSBcImNvYWxlc2NlXCIgb3BlcmF0b3IsIHdoaWNoIG5lZWRzIHRvIG9taXQgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFN0cmluZy12YWx1ZWQgcHJvcGVydGllcyAoZS5nLiBgdGV4dC1maWVsZGApLCB3aGVyZSBjb2VyY2lvbiBpcyBtb3JlIGNvbnZlbmllbnQgdGhhbiBhc3NlcnRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ3N0cmluZycgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ251bWJlcicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2Jvb2xlYW4nIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdvYmplY3QnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScpICYmIGFjdHVhbC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdhc3NlcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ2NvbG9yJyB8fCBleHBlY3RlZC5raW5kID09PSAnZm9ybWF0dGVkJyB8fCBleHBlY3RlZC5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpICYmIChhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJyB8fCBhY3R1YWwua2luZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdjb2VyY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYWN0dWFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBleHByZXNzaW9uJ3MgYXJndW1lbnRzIGFyZSBhbGwgbGl0ZXJhbHMsIHdlIGNhbiBldmFsdWF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGltbWVkaWF0ZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBsaXRlcmFsIHZhbHVlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcnNlZC9jb21waWxlZCByZXN1bHQuIEV4cHJlc3Npb25zIHRoYXQgZXhwZWN0IGFuIGltYWdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIG5vdCBiZSByZXNvbHZlZCBoZXJlIHNvIHdlIGNhbiBsYXRlciBnZXQgdGhlIGF2YWlsYWJsZSBpbWFnZXMuXG4gICAgICAgICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgKHBhcnNlZC50eXBlLmtpbmQgIT09ICdyZXNvbHZlZEltYWdlJykgJiYgaXNDb25zdGFudChwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVjID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBuZXcgTGl0ZXJhbChwYXJzZWQudHlwZSwgcGFyc2VkLmV2YWx1YXRlKGVjKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7b3B9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgJ3VuZGVmaW5lZCcgdmFsdWUgaW52YWxpZC4gVXNlIG51bGwgaW5zdGVhZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFtcImxpdGVyYWxcIiwgey4uLn1dIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXksIGJ1dCBmb3VuZCAke3R5cGVvZiBleHByfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBjb250ZXh0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHRoZSBzdWJleHByZXNzaW9uIGF0XG4gICAgICogaW5kZXggYGluZGV4YCwgb3B0aW9uYWxseSBhcHBlbmRpbmcgdG8gJ2xldCcgYmluZGluZyBtYXAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYGVycm9yc2AgcHJvcGVydHksIGludGVuZGVkIGZvciBjb2xsZWN0aW5nIGVycm9ycyB3aGlsZVxuICAgICAqIHBhcnNpbmcsIGlzIGNvcGllZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY2xvbmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uY2F0KGluZGV4OiBudW1iZXIsIGV4cGVjdGVkVHlwZT86ID9UeXBlLCBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPikge1xuICAgICAgICBjb25zdCBwYXRoID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHRoaXMucGF0aC5jb25jYXQoaW5kZXgpIDogdGhpcy5wYXRoO1xuICAgICAgICBjb25zdCBzY29wZSA9IGJpbmRpbmdzID8gdGhpcy5zY29wZS5jb25jYXQoYmluZGluZ3MpIDogdGhpcy5zY29wZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzaW5nQ29udGV4dChcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVzaCBhIHBhcnNpbmcgKG9yIHR5cGUgY2hlY2tpbmcpIGVycm9yIGludG8gdGhlIGB0aGlzLmVycm9yc2BcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ga2V5cyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IgYXQgYSBjaGlsZFxuICAgICAqIG9mIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gYXQgYHRoaXMua2V5YC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGVycm9yKGVycm9yOiBzdHJpbmcsIC4uLmtleXM6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7dGhpcy5rZXl9JHtrZXlzLm1hcChrID0+IGBbJHtrfV1gKS5qb2luKCcnKX1gO1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBQYXJzaW5nRXJyb3Ioa2V5LCBlcnJvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gICAgICogZXJyb3IgbWVzc2FnZSBhbmQgYWxzbyBwdXNoZXMgaXQgdG8gYHRoaXMuZXJyb3JzYC5cbiAgICAgKi9cbiAgICBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBjaGVja1N1YnR5cGUoZXhwZWN0ZWQsIHQpO1xuICAgICAgICBpZiAoZXJyb3IpIHRoaXMuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzaW5nQ29udGV4dDtcblxuZnVuY3Rpb24gaXNDb25zdGFudChleHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbi5ib3VuZEV4cHJlc3Npb24pO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLm5hbWUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbGxhdG9yRXhwcmVzc2lvbikge1xuICAgICAgICAvLyBBbHRob3VnaCB0aGUgcmVzdWx0cyBvZiBhIENvbGxhdG9yIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZ2VuZXJhbGx5IHNob3VsZG4ndCBjaGFuZ2UgYmV0d2VlbiBleGVjdXRpb25zLCB3ZSBjYW4ndCBzZXJpYWxpemUgdGhlbVxuICAgICAgICAvLyBhcyBjb25zdGFudCBleHByZXNzaW9ucyBiZWNhdXNlIHJlc3VsdHMgY2hhbmdlIGJhc2VkIG9uIGVudmlyb25tZW50LlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgV2l0aGluKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1R5cGVBbm5vdGF0aW9uID0gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvZXJjaW9uIHx8XG4gICAgICAgIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBc3NlcnRpb247XG5cbiAgICBsZXQgY2hpbGRyZW5Db25zdGFudCA9IHRydWU7XG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoY2hpbGQgPT4ge1xuICAgICAgICAvLyBXZSBjYW4gX2FsbW9zdF8gYXNzdW1lIHRoYXQgaWYgYGV4cHJlc3Npb25zYCBjaGlsZHJlbiBhcmUgY29uc3RhbnQsXG4gICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gZXZhbHVhdGVkIHRvIExpdGVyYWwgdmFsdWVzIHdoZW4gdGhleVxuICAgICAgICAvLyB3ZXJlIHBhcnNlZC4gIFR5cGUgYW5ub3RhdGlvbnMgYXJlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgdGhleSBtaWdodFxuICAgICAgICAvLyBoYXZlIGJlZW4gaW5mZXJyZWQgYW5kIGFkZGVkIGFmdGVyIGEgY2hpbGQgd2FzIHBhcnNlZC5cblxuICAgICAgICAvLyBTbyB3ZSByZWN1cnNlIGludG8gaXNDb25zdGFudCgpIGZvciB0aGUgY2hpbGRyZW4gb2YgdHlwZSBhbm5vdGF0aW9ucyxcbiAgICAgICAgLy8gYnV0IG90aGVyd2lzZSBzaW1wbHkgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBMaXRlcmFscy5cbiAgICAgICAgaWYgKGlzVHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuQ29uc3RhbnQgPSBjaGlsZHJlbkNvbnN0YW50ICYmIGlzQ29uc3RhbnQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGRyZW5Db25zdGFudCA9IGNoaWxkcmVuQ29uc3RhbnQgJiYgY2hpbGQgaW5zdGFuY2VvZiBMaXRlcmFsO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFjaGlsZHJlbkNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGZWF0dXJlQ29uc3RhbnQoZXhwcmVzc2lvbikgJiZcbiAgICAgICAgaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGV4cHJlc3Npb24sIFsnem9vbScsICdoZWF0bWFwLWRlbnNpdHknLCAnbGluZS1wcm9ncmVzcycsICdza3ktcmFkaWFsLXByb2dyZXNzJywgJ2FjY3VtdWxhdGVkJywgJ2lzLXN1cHBvcnRlZC1zY3JpcHQnXSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4vcnVudGltZV9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG5leHBvcnQgdHlwZSBTdG9wcyA9IEFycmF5PFtudW1iZXIsIEV4cHJlc3Npb25dPjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdG9wIDw9IGlucHV0LCBvciAwIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhzdG9wczogQXJyYXk8bnVtYmVyPiwgaW5wdXQ6IG51bWJlcikge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0b3BzLmxlbmd0aCAtIDE7XG4gICAgbGV0IGxvd2VySW5kZXggPSAwO1xuICAgIGxldCB1cHBlckluZGV4ID0gbGFzdEluZGV4O1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWUsIG5leHRWYWx1ZTtcblxuICAgIHdoaWxlIChsb3dlckluZGV4IDw9IHVwcGVySW5kZXgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gTWF0aC5mbG9vcigobG93ZXJJbmRleCArIHVwcGVySW5kZXgpIC8gMik7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleF07XG4gICAgICAgIG5leHRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPD0gaW5wdXQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IGxhc3RJbmRleCB8fCBpbnB1dCA8IG5leHRWYWx1ZSkgeyAvLyBTZWFyY2ggY29tcGxldGVcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb3dlckluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgPiBpbnB1dCkge1xuICAgICAgICAgICAgdXBwZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKCdJbnB1dCBpcyBub3QgYSBudW1iZXIuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL3N0b3BzLmpzJztcblxuaW1wb3J0IHR5cGUge1N0b3BzfSBmcm9tICcuLi9zdG9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIFN0ZXAgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgbGFiZWxzOiBBcnJheTxudW1iZXI+O1xuICAgIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIHN0b3BzOiBTdG9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2xhYmVsLCBleHByZXNzaW9uXSBvZiBzdG9wcykge1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dHMucHVzaChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIDEgPCA0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYXJncy5sZW5ndGggLSAxKSAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHN0b3BzOiBTdG9wcyA9IFtdO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaSA9PT0gMSA/IC1JbmZpbml0eSA6IGFyZ3NbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbEtleSA9IGk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUtleSA9IGkgKyAxO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwic3RlcFwiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3BzLmxlbmd0aCAmJiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVswXSA+PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwic3RlcFwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgdmFsdWVLZXksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBzdG9wcy5wdXNoKFtsYWJlbCwgcGFyc2VkXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFN0ZXAob3V0cHV0VHlwZSwgaW5wdXQsIHN0b3BzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMubGFiZWxzO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRzO1xuXG4gICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgaWYgKHZhbHVlIDw9IGxhYmVsc1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3BDb3VudCA9IGxhYmVscy5sZW5ndGg7XG4gICAgICAgIGlmICh2YWx1ZSA+PSBsYWJlbHNbc3RvcENvdW50IC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzW3N0b3BDb3VudCAtIDFdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8obGFiZWxzLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBvdXRwdXRzW2luZGV4XS5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShvdXQgPT4gb3V0Lm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wic3RlcFwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMubGFiZWxzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLm91dHB1dHNbaV0uc2VyaWFsaXplKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3RlcDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxuICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1JcbiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBQb3J0ZWQgZnJvbSBXZWJraXRcbiAqIGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVuay9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmhcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXRCZXppZXI7XG5cbmZ1bmN0aW9uIFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgaW1wbGljaXQgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHMgYXJlICgwLDApIGFuZCAoMSwxKS5cbiAgICB0aGlzLmN4ID0gMy4wICogcDF4O1xuICAgIHRoaXMuYnggPSAzLjAgKiAocDJ4IC0gcDF4KSAtIHRoaXMuY3g7XG4gICAgdGhpcy5heCA9IDEuMCAtIHRoaXMuY3ggLSB0aGlzLmJ4O1xuXG4gICAgdGhpcy5jeSA9IDMuMCAqIHAxeTtcbiAgICB0aGlzLmJ5ID0gMy4wICogKHAyeSAtIHAxeSkgLSB0aGlzLmN5O1xuICAgIHRoaXMuYXkgPSAxLjAgLSB0aGlzLmN5IC0gdGhpcy5ieTtcblxuICAgIHRoaXMucDF4ID0gcDF4O1xuICAgIHRoaXMucDF5ID0gcDJ5O1xuICAgIHRoaXMucDJ4ID0gcDJ4O1xuICAgIHRoaXMucDJ5ID0gcDJ5O1xufVxuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgcmV0dXJuICgodGhpcy5heCAqIHQgKyB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVkgPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgodGhpcy5heSAqIHQgKyB0aGlzLmJ5KSAqIHQgKyB0aGlzLmN5KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoMy4wICogdGhpcy5heCAqIHQgKyAyLjAgKiB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgaWYgKHR5cGVvZiBlcHNpbG9uID09PSAndW5kZWZpbmVkJykgZXBzaWxvbiA9IDFlLTY7XG5cbiAgICB2YXIgdDAsIHQxLCB0MiwgeDIsIGk7XG5cbiAgICAvLyBGaXJzdCB0cnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgLS0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgIGZvciAodDIgPSB4LCBpID0gMDsgaSA8IDg7IGkrKykge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpIC0geDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgdDIgPSB0MiAtIHgyIC8gZDI7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiaXNlY3Rpb24gbWV0aG9kIGZvciByZWxpYWJpbGl0eS5cbiAgICB0MCA9IDAuMDtcbiAgICB0MSA9IDEuMDtcbiAgICB0MiA9IHg7XG5cbiAgICBpZiAodDIgPCB0MCkgcmV0dXJuIHQwO1xuICAgIGlmICh0MiA+IHQxKSByZXR1cm4gdDE7XG5cbiAgICB3aGlsZSAodDAgPCB0MSkge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIgLSB4KSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICBpZiAoeCA+IHgyKSB7XG4gICAgICAgICAgICB0MCA9IHQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHQyID0gKHQxIC0gdDApICogMC41ICsgdDA7XG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZS5cbiAgICByZXR1cm4gdDI7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3IuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihmcm9tOiBDb2xvciwgdG86IENvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICBudW1iZXIoZnJvbS5yLCB0by5yLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uZywgdG8uZywgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5hLCB0by5hLCB0KVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmcm9tOiBBcnJheTxudW1iZXI+LCB0bzogQXJyYXk8bnVtYmVyPiwgdDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb20ubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIoZCwgdG9baV0sIHQpO1xuICAgIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3IuanMnO1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZU51bWJlcn0gZnJvbSAnLi9pbnRlcnBvbGF0ZS5qcyc7XG5cbnR5cGUgTEFCQ29sb3IgPSB7XG4gICAgbDogbnVtYmVyLFxuICAgIGE6IG51bWJlcixcbiAgICBiOiBudW1iZXIsXG4gICAgYWxwaGE6IG51bWJlclxufTtcblxudHlwZSBIQ0xDb2xvciA9IHtcbiAgICBoOiBudW1iZXIsXG4gICAgYzogbnVtYmVyLFxuICAgIGw6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFhuID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFluID0gMSxcbiAgICBabiA9IDEuMDg4ODMwLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDEsXG4gICAgZGVnMnJhZCA9IE1hdGguUEkgLyAxODAsXG4gICAgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7XG5cbi8vIFV0aWxpdGllc1xuZnVuY3Rpb24geHl6MmxhYih0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7XG59XG5cbmZ1bmN0aW9uIGxhYjJ4eXoodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIHh5ejJyZ2IoeDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeDogbnVtYmVyKSB7XG4gICAgeCAvPSAyNTU7XG4gICAgcmV0dXJuIHggPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG59XG5cbi8vIExBQlxuZnVuY3Rpb24gcmdiVG9MYWIocmdiQ29sb3I6IENvbG9yKTogTEFCQ29sb3Ige1xuICAgIGNvbnN0IGIgPSByZ2IyeHl6KHJnYkNvbG9yLnIpLFxuICAgICAgICBhID0gcmdiMnh5eihyZ2JDb2xvci5nKSxcbiAgICAgICAgbCA9IHJnYjJ4eXoocmdiQ29sb3IuYiksXG4gICAgICAgIHggPSB4eXoybGFiKCgwLjQxMjQ1NjQgKiBiICsgMC4zNTc1NzYxICogYSArIDAuMTgwNDM3NSAqIGwpIC8gWG4pLFxuICAgICAgICB5ID0geHl6MmxhYigoMC4yMTI2NzI5ICogYiArIDAuNzE1MTUyMiAqIGEgKyAwLjA3MjE3NTAgKiBsKSAvIFluKSxcbiAgICAgICAgeiA9IHh5ejJsYWIoKDAuMDE5MzMzOSAqIGIgKyAwLjExOTE5MjAgKiBhICsgMC45NTAzMDQxICogbCkgLyBabik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsOiAxMTYgKiB5IC0gMTYsXG4gICAgICAgIGE6IDUwMCAqICh4IC0geSksXG4gICAgICAgIGI6IDIwMCAqICh5IC0geiksXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGFiVG9SZ2IobGFiQ29sb3I6IExBQkNvbG9yKTogQ29sb3Ige1xuICAgIGxldCB5ID0gKGxhYkNvbG9yLmwgKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTihsYWJDb2xvci5hKSA/IHkgOiB5ICsgbGFiQ29sb3IuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKGxhYkNvbG9yLmIpID8geSA6IHkgLSBsYWJDb2xvci5iIC8gMjAwO1xuICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7XG4gICAgeCA9IFhuICogbGFiMnh5eih4KTtcbiAgICB6ID0gWm4gKiBsYWIyeHl6KHopO1xuICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgIHh5ejJyZ2IoMy4yNDA0NTQyICogeCAtIDEuNTM3MTM4NSAqIHkgLSAwLjQ5ODUzMTQgKiB6KSwgLy8gRDY1IC0+IHNSR0JcbiAgICAgICAgeHl6MnJnYigtMC45NjkyNjYwICogeCArIDEuODc2MDEwOCAqIHkgKyAwLjA0MTU1NjAgKiB6KSxcbiAgICAgICAgeHl6MnJnYigwLjA1NTY0MzQgKiB4IC0gMC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopLFxuICAgICAgICBsYWJDb2xvci5hbHBoYVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGFiKGZyb206IExBQkNvbG9yLCB0bzogTEFCQ29sb3IsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGw6IGludGVycG9sYXRlTnVtYmVyKGZyb20ubCwgdG8ubCwgdCksXG4gICAgICAgIGE6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYSwgdG8uYSwgdCksXG4gICAgICAgIGI6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYiwgdG8uYiwgdCksXG4gICAgICAgIGFscGhhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmFscGhhLCB0by5hbHBoYSwgdClcbiAgICB9O1xufVxuXG4vLyBIQ0xcbmZ1bmN0aW9uIHJnYlRvSGNsKHJnYkNvbG9yOiBDb2xvcik6IEhDTENvbG9yIHtcbiAgICBjb25zdCB7bCwgYSwgYn0gPSByZ2JUb0xhYihyZ2JDb2xvcik7XG4gICAgY29uc3QgaCA9IE1hdGguYXRhbjIoYiwgYSkgKiByYWQyZGVnO1xuICAgIHJldHVybiB7XG4gICAgICAgIGg6IGggPCAwID8gaCArIDM2MCA6IGgsXG4gICAgICAgIGM6IE1hdGguc3FydChhICogYSArIGIgKiBiKSxcbiAgICAgICAgbCxcbiAgICAgICAgYWxwaGE6IHJnYkNvbG9yLmFcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoY2xUb1JnYihoY2xDb2xvcjogSENMQ29sb3IpOiBDb2xvciB7XG4gICAgY29uc3QgaCA9IGhjbENvbG9yLmggKiBkZWcycmFkLFxuICAgICAgICBjID0gaGNsQ29sb3IuYyxcbiAgICAgICAgbCA9IGhjbENvbG9yLmw7XG4gICAgcmV0dXJuIGxhYlRvUmdiKHtcbiAgICAgICAgbCxcbiAgICAgICAgYTogTWF0aC5jb3MoaCkgKiBjLFxuICAgICAgICBiOiBNYXRoLnNpbihoKSAqIGMsXG4gICAgICAgIGFscGhhOiBoY2xDb2xvci5hbHBoYVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUh1ZShhOiBudW1iZXIsIGI6IG51bWJlciwgdDogbnVtYmVyKSB7XG4gICAgY29uc3QgZCA9IGIgLSBhO1xuICAgIHJldHVybiBhICsgdCAqIChkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVIY2woZnJvbTogSENMQ29sb3IsIHRvOiBIQ0xDb2xvciwgdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogaW50ZXJwb2xhdGVIdWUoZnJvbS5oLCB0by5oLCB0KSxcbiAgICAgICAgYzogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5jLCB0by5jLCB0KSxcbiAgICAgICAgbDogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5sLCB0by5sLCB0KSxcbiAgICAgICAgYWxwaGE6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYWxwaGEsIHRvLmFscGhhLCB0KVxuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBsYWIgPSB7XG4gICAgZm9yd2FyZDogcmdiVG9MYWIsXG4gICAgcmV2ZXJzZTogbGFiVG9SZ2IsXG4gICAgaW50ZXJwb2xhdGU6IGludGVycG9sYXRlTGFiXG59O1xuXG5leHBvcnQgY29uc3QgaGNsID0ge1xuICAgIGZvcndhcmQ6IHJnYlRvSGNsLFxuICAgIHJldmVyc2U6IGhjbFRvUmdiLFxuICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZUhjbFxufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBVbml0QmV6aWVyIGZyb20gJ0BtYXBib3gvdW5pdGJlemllcic7XG5cbmltcG9ydCAqIGFzIGludGVycG9sYXRlIGZyb20gJy4uLy4uL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IHt0b1N0cmluZywgTnVtYmVyVHlwZSwgQ29sb3JUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL3N0b3BzLmpzJztcbmltcG9ydCB7aGNsLCBsYWJ9IGZyb20gJy4uLy4uL3V0aWwvY29sb3Jfc3BhY2VzLmpzJztcblxuaW1wb3J0IHR5cGUge1N0b3BzfSBmcm9tICcuLi9zdG9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIEludGVycG9sYXRpb25UeXBlID1cbiAgICB7IG5hbWU6ICdsaW5lYXInIH0gfFxuICAgIHsgbmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogbnVtYmVyIH0gfFxuICAgIHsgbmFtZTogJ2N1YmljLWJlemllcicsIGNvbnRyb2xQb2ludHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIH07XG5cbmNsYXNzIEludGVycG9sYXRlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJztcbiAgICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBvcGVyYXRvcjogJ2ludGVycG9sYXRlJyB8ICdpbnRlcnBvbGF0ZS1oY2wnIHwgJ2ludGVycG9sYXRlLWxhYicsIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIGludGVycG9sYXRpb24uYmFzZSwgbG93ZXIsIHVwcGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICB0ID0gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbnRlcnBvbGF0aW9uLmNvbnRyb2xQb2ludHM7XG4gICAgICAgICAgICBjb25zdCB1YiA9IG5ldyBVbml0QmV6aWVyKGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pO1xuICAgICAgICAgICAgdCA9IHViLnNvbHZlKGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgMSwgbG93ZXIsIHVwcGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgbGV0IFtvcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIC4uLnJlc3RdID0gYXJncztcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW50ZXJwb2xhdGlvbikgfHwgaW50ZXJwb2xhdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBpbnRlcnBvbGF0aW9uIHR5cGUgZXhwcmVzc2lvbi5gLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGludGVycG9sYXRpb25bMV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBvbmVudGlhbCBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGEgbnVtZXJpYyBiYXNlLmAsIDEsIDEpO1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgICAgICAgIGJhc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xQb2ludHMgPSBpbnRlcnBvbGF0aW9uLnNsaWNlKDEpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHMubGVuZ3RoICE9PSA0IHx8XG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50cy5zb21lKHQgPT4gdHlwZW9mIHQgIT09ICdudW1iZXInIHx8IHQgPCAwIHx8IHQgPiAxKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0N1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLicsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdjdWJpYy1iZXppZXInLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHM6IChjb250cm9sUG9pbnRzOiBhbnkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlICR7U3RyaW5nKGludGVycG9sYXRpb25bMF0pfWAsIDEsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gMSA8IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhcmdzLmxlbmd0aCAtIDEpICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gY29udGV4dC5wYXJzZShpbnB1dCwgMiwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHN0b3BzOiBTdG9wcyA9IFtdO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGlmIChvcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWhjbCcgfHwgb3BlcmF0b3IgPT09ICdpbnRlcnBvbGF0ZS1sYWInKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gQ29sb3JUeXBlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByZXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0W2kgKyAxXTtcblxuICAgICAgICAgICAgY29uc3QgbGFiZWxLZXkgPSBpICsgMztcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gaSArIDQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3BzLmxlbmd0aCAmJiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVswXSA+PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UodmFsdWUsIHZhbHVlS2V5LCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgc3RvcHMucHVzaChbbGFiZWwsIHBhcnNlZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG91dHB1dFR5cGUua2luZCAhPT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIG91dHB1dFR5cGUua2luZCAhPT0gJ2NvbG9yJyAmJlxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICBvdXRwdXRUeXBlLmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICAgICBvdXRwdXRUeXBlLml0ZW1UeXBlLmtpbmQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dFR5cGUuTiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVHlwZSAke3RvU3RyaW5nKG91dHB1dFR5cGUpfSBpcyBub3QgaW50ZXJwb2xhdGFibGUuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRlKG91dHB1dFR5cGUsIChvcGVyYXRvcjogYW55KSwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIHN0b3BzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMubGFiZWxzO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRzO1xuXG4gICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgaWYgKHZhbHVlIDw9IGxhYmVsc1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3BDb3VudCA9IGxhYmVscy5sZW5ndGg7XG4gICAgICAgIGlmICh2YWx1ZSA+PSBsYWJlbHNbc3RvcENvdW50IC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzW3N0b3BDb3VudCAtIDFdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8obGFiZWxzLCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGxvd2VyID0gbGFiZWxzW2luZGV4XTtcbiAgICAgICAgY29uc3QgdXBwZXIgPSBsYWJlbHNbaW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgdCA9IEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uLCB2YWx1ZSwgbG93ZXIsIHVwcGVyKTtcblxuICAgICAgICBjb25zdCBvdXRwdXRMb3dlciA9IG91dHB1dHNbaW5kZXhdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIGNvbnN0IG91dHB1dFVwcGVyID0gb3V0cHV0c1tpbmRleCArIDFdLmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICdpbnRlcnBvbGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW50ZXJwb2xhdGVbdGhpcy50eXBlLmtpbmQudG9Mb3dlckNhc2UoKV06IGFueSkob3V0cHV0TG93ZXIsIG91dHB1dFVwcGVyLCB0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWhjbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBoY2wucmV2ZXJzZShoY2wuaW50ZXJwb2xhdGUoaGNsLmZvcndhcmQob3V0cHV0TG93ZXIpLCBoY2wuZm9yd2FyZChvdXRwdXRVcHBlciksIHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsYWIucmV2ZXJzZShsYWIuaW50ZXJwb2xhdGUobGFiLmZvcndhcmQob3V0cHV0TG93ZXIpLCBsYWIuZm9yd2FyZChvdXRwdXRVcHBlciksIHQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShvdXQgPT4gb3V0Lm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGxldCBpbnRlcnBvbGF0aW9uO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wibGluZWFyXCJdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbi5uYW1lID09PSAnZXhwb25lbnRpYWwnKSB7XG4gICAgICAgICAgICBpZiAgKHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImxpbmVhclwiXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImV4cG9uZW50aWFsXCIsIHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJjdWJpYy1iZXppZXJcIiBdLmNvbmNhdCh0aGlzLmludGVycG9sYXRpb24uY29udHJvbFBvaW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW3RoaXMub3BlcmF0b3IsIGludGVycG9sYXRpb24sIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsc1tpXSxcbiAgICAgICAgICAgICAgICB0aGlzLm91dHB1dHNbaV0uc2VyaWFsaXplKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSByYXRpbyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gZXhwb25lbnRpYWwgZnVuY3Rpb25cbiAqIHN0b3BzLlxuICogSG93IGl0IHdvcmtzOiBUd28gY29uc2VjdXRpdmUgc3RvcCB2YWx1ZXMgZGVmaW5lIGEgKHNjYWxlZCBhbmQgc2hpZnRlZCkgZXhwb25lbnRpYWwgZnVuY3Rpb24gYGYoeCkgPSBhICogYmFzZV54ICsgYmAsIHdoZXJlIGBiYXNlYCBpcyB0aGUgdXNlci1zcGVjaWZpZWQgYmFzZSxcbiAqIGFuZCBgYWAgYW5kIGBiYCBhcmUgY29uc3RhbnRzIGFmZm9yZGluZyBzdWZmaWNpZW50IGRlZ3JlZXMgb2YgZnJlZWRvbSB0byBmaXRcbiAqIHRoZSBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gc3RvcHMuXG4gKlxuICogSGVyZSdzIGEgYml0IG9mIGFsZ2VicmEgdGhhdCBsZXRzIHVzIGNvbXB1dGUgYGYoeClgIGRpcmVjdGx5IGZyb20gdGhlIHN0b3BcbiAqIHZhbHVlcyB3aXRob3V0IGV4cGxpY2l0bHkgc29sdmluZyBmb3IgYGFgIGFuZCBgYmA6XG4gKlxuICogRmlyc3Qgc3RvcCB2YWx1ZTogYGYoeDApID0geTAgPSBhICogYmFzZV54MCArIGJgXG4gKiBTZWNvbmQgc3RvcCB2YWx1ZTogYGYoeDEpID0geTEgPSBhICogYmFzZV54MSArIGJgXG4gKiA9PiBgeTEgLSB5MCA9IGEoYmFzZV54MSAtIGJhc2VeeDApYFxuICogPT4gYGEgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKWBcbiAqXG4gKiBEZXNpcmVkIHZhbHVlOiBgZih4KSA9IHkgPSBhICogYmFzZV54ICsgYmBcbiAqID0+IGBmKHgpID0geTAgKyBhICogKGJhc2VeeCAtIGJhc2VeeDApYFxuICpcbiAqIEZyb20gdGhlIGFib3ZlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgYGFgIGluIGBhICogKGJhc2VeeCAtIGJhc2VeeDApYCBhbmQgZG8gYVxuICogbGl0dGxlIGFsZ2VicmE6XG4gKiBgYGBcbiAqIGEgKiAoYmFzZV54IC0gYmFzZV54MCkgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKSAqIChiYXNlXnggLSBiYXNlXngwKVxuICogICAgICAgICAgICAgICAgICAgICA9ICh5MSAtIHkwKSAqIChiYXNlXnggLSBiYXNlXngwKSAvIChiYXNlXngxIC0gYmFzZV54MClcbiAqIGBgYFxuICpcbiAqIElmIHdlIGxldCBgKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgYmFzZV54MClgLCB0aGVuIHdlIGhhdmVcbiAqIGBmKHgpID0geTAgKyAoeTEgLSB5MCkgKiByYXRpb2AuICBJbiBvdGhlciB3b3JkcywgYHJhdGlvYCBtYXkgYmUgdHJlYXRlZCBhc1xuICogYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiB0aGUgdHdvIHN0b3BzJyBvdXRwdXQgdmFsdWVzLlxuICpcbiAqIChOb3RlOiBhIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtIGZvciBgcmF0aW9gLFxuICogYChiYXNlXih4LXgwKSAtIDEpIC8gKGJhc2VeKHgxLXgwKSAtIDEpIGAsIGlzIGVxdWl2YWxlbnQsIGJ1dCByZXF1aXJlcyBmZXdlclxuICogZXhwZW5zaXZlIGBNYXRoLnBvdygpYCBvcGVyYXRpb25zLilcbiAqXG4gKiBAcHJpdmF0ZVxuKi9cbmZ1bmN0aW9uIGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgYmFzZSwgbG93ZXJWYWx1ZSwgdXBwZXJWYWx1ZSkge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB1cHBlclZhbHVlIC0gbG93ZXJWYWx1ZTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGlucHV0IC0gbG93ZXJWYWx1ZTtcblxuICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoYmFzZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgLyBkaWZmZXJlbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5wb3coYmFzZSwgcHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgZGlmZmVyZW5jZSkgLSAxKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVycG9sYXRlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge2NoZWNrU3VidHlwZSwgVmFsdWVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgQ29hbGVzY2UgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihcIkV4cGVjdGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIGlmIChleHBlY3RlZFR5cGUgJiYgZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBleHBlY3RlZFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UoYXJnLCAxICsgcGFyc2VkQXJncy5sZW5ndGgsIG91dHB1dFR5cGUsIHVuZGVmaW5lZCwge3R5cGVBbm5vdGF0aW9uOiAnb21pdCd9KTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgcGFyc2VkQXJncy5wdXNoKHBhcnNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KG91dHB1dFR5cGUpO1xuXG4gICAgICAgIC8vIEFib3ZlLCB3ZSBwYXJzZSBhcmd1bWVudHMgd2l0aG91dCBpbmZlcnJlZCB0eXBlIGFubm90YXRpb24gc28gdGhhdFxuICAgICAgICAvLyB0aGV5IGRvbid0IHByb2R1Y2UgYSBydW50aW1lIGVycm9yIGZvciBgbnVsbGAgaW5wdXQsIHdoaWNoIHdvdWxkXG4gICAgICAgIC8vIHByZWVtcHQgdGhlIGRlc2lyZWQgbnVsbC1jb2FsZXNjaW5nIGJlaGF2aW9yLlxuICAgICAgICAvLyBUaHVzLCBpZiBhbnkgb2Ygb3VyIGFyZ3VtZW50cyB3b3VsZCBoYXZlIG5lZWRlZCBhbiBhbm5vdGF0aW9uLCB3ZVxuICAgICAgICAvLyBuZWVkIHRvIHdyYXAgdGhlIGVuY2xvc2luZyBjb2FsZXNjZSBleHByZXNzaW9uIHdpdGggaXQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgbmVlZHNBbm5vdGF0aW9uID0gZXhwZWN0ZWRUeXBlICYmXG4gICAgICAgICAgICBwYXJzZWRBcmdzLnNvbWUoYXJnID0+IGNoZWNrU3VidHlwZShleHBlY3RlZFR5cGUsIGFyZy50eXBlKSk7XG5cbiAgICAgICAgcmV0dXJuIG5lZWRzQW5ub3RhdGlvbiA/XG4gICAgICAgICAgICBuZXcgQ29hbGVzY2UoVmFsdWVUeXBlLCBwYXJzZWRBcmdzKSA6XG4gICAgICAgICAgICBuZXcgQ29hbGVzY2UoKG91dHB1dFR5cGU6IGFueSksIHBhcnNlZEFyZ3MpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGxldCBhcmdDb3VudCA9IDA7XG4gICAgICAgIGxldCByZXF1ZXN0ZWRJbWFnZU5hbWU7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgYXJnQ291bnQrKztcbiAgICAgICAgICAgIHJlc3VsdCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCByZXF1ZXN0ZWQgaW1hZ2UgaW4gYSBjb2FsZXNjZSBzdGF0ZW1lbnRcbiAgICAgICAgICAgIC8vIGlmIGNvYWxlc2NlIGNhbid0IGZpbmQgYSB2YWxpZCBpbWFnZSwgd2UgcmV0dXJuIHRoZSBmaXJzdCBpbWFnZSBuYW1lIHNvIHN0eWxlaW1hZ2VtaXNzaW5nIGNhbiBmaXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UgJiYgIXJlc3VsdC5hdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RlZEltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbWFnZU5hbWUgPSByZXN1bHQubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnQ291bnQgPT09IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVxdWVzdGVkSW1hZ2VOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGFyZyA9PiBhcmcub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJjb2FsZXNjZVwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2FsZXNjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbmNsYXNzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPjtcbiAgICByZXN1bHQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+LCByZXN1bHQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gcmVzdWx0LnR5cGU7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSBbXS5jb25jYXQoYmluZGluZ3MpO1xuICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgIGZuKGJpbmRpbmdbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGZuKHRoaXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYXJnc1tpXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBzdHJpbmcsIGJ1dCBmb3VuZCAke3R5cGVvZiBuYW1lfSBpbnN0ZWFkLmAsIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL1teYS16QS1aMC05X10vLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVmFyaWFibGUgbmFtZXMgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgJ18nLmAsIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRleHQucGFyc2UoYXJnc1tpICsgMV0sIGkgKyAxKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBiaW5kaW5ncy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgY29udGV4dC5leHBlY3RlZFR5cGUsIGJpbmRpbmdzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGV0KGJpbmRpbmdzLCByZXN1bHQpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibGV0XCJdO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBleHByXSBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2gobmFtZSwgZXhwci5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMucmVzdWx0LnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMZXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2FycmF5LCBWYWx1ZVR5cGUsIE51bWJlclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZSwgQXJyYXlUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VmFsdWV9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmNsYXNzIEF0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbmRleDogRXhwcmVzc2lvbjtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGluZGV4OiBFeHByZXNzaW9uLCBpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDMpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBhcnJheShjb250ZXh0LmV4cGVjdGVkVHlwZSB8fCBWYWx1ZVR5cGUpKTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdDogQXJyYXlUeXBlID0gKGlucHV0LnR5cGU6IGFueSk7XG4gICAgICAgIHJldHVybiBuZXcgQXQodC5pdGVtVHlwZSwgaW5kZXgsIGlucHV0KTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKCh0aGlzLmluZGV4LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IEFycmF5PFZhbHVlPik7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPCAwLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPiAke2FycmF5Lmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBNYXRoLmZsb29yKGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZm91bmQgJHtpbmRleH0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheVtpbmRleF07XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmluZGV4KTtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcImF0XCIsIHRoaXMuaW5kZXguc2VyaWFsaXplKCksIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGUsIE51bGxUeXBlLCB0b1N0cmluZywgTnVtYmVyVHlwZSwgaXNWYWxpZFR5cGUsIGlzVmFsaWROYXRpdmVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgSW4gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG5lZWRsZTogRXhwcmVzc2lvbjtcbiAgICBoYXlzdGFjazogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5lZWRsZTogRXhwcmVzc2lvbiwgaGF5c3RhY2s6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgIHRoaXMubmVlZGxlID0gbmVlZGxlO1xuICAgICAgICB0aGlzLmhheXN0YWNrID0gaGF5c3RhY2s7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5lZWRsZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcblxuICAgICAgICBjb25zdCBoYXlzdGFjayA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgVmFsdWVUeXBlKTtcblxuICAgICAgICBpZiAoIW5lZWRsZSB8fCAhaGF5c3RhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFR5cGUobmVlZGxlLnR5cGUsIFtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgTnVsbFR5cGUsIFZhbHVlVHlwZV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyhuZWVkbGUudHlwZSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSW4obmVlZGxlLCBoYXlzdGFjayk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBuZWVkbGUgPSAodGhpcy5uZWVkbGUuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSAodGhpcy5oYXlzdGFjay5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuXG4gICAgICAgIGlmICghaGF5c3RhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKG5lZWRsZSwgWydib29sZWFuJywgJ3N0cmluZycsICdudW1iZXInLCAnbnVsbCddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YobmVlZGxlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKGhheXN0YWNrLCBbJ3N0cmluZycsICdhcnJheSddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaGF5c3RhY2spKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPj0gMDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMubmVlZGxlKTtcbiAgICAgICAgZm4odGhpcy5oYXlzdGFjayk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1wiaW5cIiwgdGhpcy5uZWVkbGUuc2VyaWFsaXplKCksIHRoaXMuaGF5c3RhY2suc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW47XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGUsIE51bGxUeXBlLCB0b1N0cmluZywgTnVtYmVyVHlwZSwgaXNWYWxpZFR5cGUsIGlzVmFsaWROYXRpdmVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgSW5kZXhPZiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmVlZGxlOiBFeHByZXNzaW9uO1xuICAgIGhheXN0YWNrOiBFeHByZXNzaW9uO1xuICAgIGZyb21JbmRleDogP0V4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihuZWVkbGU6IEV4cHJlc3Npb24sIGhheXN0YWNrOiBFeHByZXNzaW9uLCBmcm9tSW5kZXg/OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IE51bWJlclR5cGU7XG4gICAgICAgIHRoaXMubmVlZGxlID0gbmVlZGxlO1xuICAgICAgICB0aGlzLmhheXN0YWNrID0gaGF5c3RhY2s7XG4gICAgICAgIHRoaXMuZnJvbUluZGV4ID0gZnJvbUluZGV4O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAyIHx8ICBhcmdzLmxlbmd0aCA+PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMyBvciA0IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmVlZGxlID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuXG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBWYWx1ZVR5cGUpO1xuXG4gICAgICAgIGlmICghbmVlZGxlIHx8ICFoYXlzdGFjaykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghaXNWYWxpZFR5cGUobmVlZGxlLnR5cGUsIFtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgTnVsbFR5cGUsIFZhbHVlVHlwZV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyhuZWVkbGUudHlwZSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzNdLCAzLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgIGlmICghZnJvbUluZGV4KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhPZihuZWVkbGUsIGhheXN0YWNrLCBmcm9tSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleE9mKG5lZWRsZSwgaGF5c3RhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBuZWVkbGUgPSAodGhpcy5uZWVkbGUuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSAodGhpcy5oYXlzdGFjay5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUobmVlZGxlLCBbJ2Jvb2xlYW4nLCAnc3RyaW5nJywgJ251bWJlcicsICdudWxsJ10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihuZWVkbGUpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUoaGF5c3RhY2ssIFsnc3RyaW5nJywgJ2FycmF5J10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihoYXlzdGFjaykpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZnJvbUluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tSW5kZXggPSAodGhpcy5mcm9tSW5kZXguZXZhbHVhdGUoY3R4KTogbnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSwgZnJvbUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLm5lZWRsZSk7XG4gICAgICAgIGZuKHRoaXMuaGF5c3RhY2spO1xuICAgICAgICBpZiAodGhpcy5mcm9tSW5kZXgpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuZnJvbUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZyb21JbmRleCAhPSBudWxsICYmIHRoaXMuZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMuZnJvbUluZGV4LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIFtcImluZGV4LW9mXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpLCBmcm9tSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJpbmRleC1vZlwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbmRleE9mO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB7VmFsdWVUeXBlLCB0eXBlIFR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbi8vIE1hcCBpbnB1dCBsYWJlbCB2YWx1ZXMgdG8gb3V0cHV0IGV4cHJlc3Npb24gaW5kZXhcbnR5cGUgQ2FzZXMgPSB7W251bWJlciB8IHN0cmluZ106IG51bWJlcn07XG5cbmNsYXNzIE1hdGNoIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbnB1dFR5cGU6IFR5cGU7XG5cbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBjYXNlczogQ2FzZXM7XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG4gICAgb3RoZXJ3aXNlOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXRUeXBlOiBUeXBlLCBvdXRwdXRUeXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgY2FzZXM6IENhc2VzLCBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPiwgb3RoZXJ3aXNlOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuaW5wdXRUeXBlID0gaW5wdXRUeXBlO1xuICAgICAgICB0aGlzLnR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuY2FzZXMgPSBjYXNlcztcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggJSAyICE9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICBsZXQgaW5wdXRUeXBlO1xuICAgICAgICBsZXQgb3V0cHV0VHlwZTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYXNlcyA9IHt9O1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbHMgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW2kgKyAxXTtcblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxhYmVscykpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMgPSBbbGFiZWxzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGFiZWxDb250ZXh0ID0gY29udGV4dC5jb25jYXQoaSk7XG4gICAgICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSBicmFuY2ggbGFiZWwuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2YgbGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBCcmFuY2ggbGFiZWxzIG11c3QgYmUgbnVtYmVycyBvciBzdHJpbmdzLmApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJyAmJiBNYXRoLmFicyhsYWJlbCkgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBCcmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlcnMgbm8gbGFyZ2VyIHRoYW4gJHtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0uYCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicgJiYgTWF0aC5mbG9vcihsYWJlbCkgIT09IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYE51bWVyaWMgYnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXIgdmFsdWVzLmApO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IHR5cGVPZihsYWJlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYWJlbENvbnRleHQuY2hlY2tTdWJ0eXBlKGlucHV0VHlwZSwgdHlwZU9mKGxhYmVsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXNlc1tTdHJpbmcobGFiZWwpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcignQnJhbmNoIGxhYmVscyBtdXN0IGJlIHVuaXF1ZS4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlc1tTdHJpbmcobGFiZWwpXSA9IG91dHB1dHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCBpLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHJlc3VsdC50eXBlO1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgb3RoZXJ3aXNlID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmICghb3RoZXJ3aXNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBhc3NlcnQoaW5wdXRUeXBlICYmIG91dHB1dFR5cGUpO1xuXG4gICAgICAgIGlmIChpbnB1dC50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiYgY29udGV4dC5jb25jYXQoMSkuY2hlY2tTdWJ0eXBlKChpbnB1dFR5cGU6IGFueSksIGlucHV0LnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTWF0Y2goKGlucHV0VHlwZTogYW55KSwgKG91dHB1dFR5cGU6IGFueSksIGlucHV0LCBjYXNlcywgb3V0cHV0cywgb3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gKHR5cGVPZihpbnB1dCkgPT09IHRoaXMuaW5wdXRUeXBlICYmIHRoaXMub3V0cHV0c1t0aGlzLmNhc2VzW2lucHV0XV0pIHx8IHRoaXMub3RoZXJ3aXNlO1xuICAgICAgICByZXR1cm4gb3V0cHV0LmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgdGhpcy5vdXRwdXRzLmZvckVhY2goZm4pO1xuICAgICAgICBmbih0aGlzLm90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShvdXQgPT4gb3V0Lm91dHB1dERlZmluZWQoKSkgJiYgdGhpcy5vdGhlcndpc2Uub3V0cHV0RGVmaW5lZCgpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibWF0Y2hcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgLy8gU29ydCBzbyBzZXJpYWxpemF0aW9uIGhhcyBhbiBhcmJpdHJhcnkgZGVmaW5lZCBvcmRlciwgZXZlbiB0aG91Z2hcbiAgICAgICAgLy8gYnJhbmNoIG9yZGVyIGRvZXNuJ3QgYWZmZWN0IGV2YWx1YXRpb25cbiAgICAgICAgY29uc3Qgc29ydGVkTGFiZWxzID0gT2JqZWN0LmtleXModGhpcy5jYXNlcykuc29ydCgpO1xuXG4gICAgICAgIC8vIEdyb3VwIGJyYW5jaGVzIGJ5IHVuaXF1ZSBtYXRjaCBleHByZXNzaW9uIHRvIHN1cHBvcnQgY29uZGVuc2VkXG4gICAgICAgIC8vIHNlcmlhbGl6YXRpb25zIG9mIHRoZSBmb3JtIFtjYXNlMSwgY2FzZTIsIC4uLl0gLT4gbWF0Y2hFeHByZXNzaW9uXG4gICAgICAgIGNvbnN0IGdyb3VwZWRCeU91dHB1dDogQXJyYXk8W251bWJlciwgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPl0+ID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dExvb2t1cDoge1tpbmRleDogbnVtYmVyXTogbnVtYmVyfSA9IHt9OyAvLyBsb29rdXAgaW5kZXggaW50byBncm91cGVkQnlPdXRwdXQgZm9yIGEgZ2l2ZW4gb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBzb3J0ZWRMYWJlbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gb3V0cHV0TG9va3VwW3RoaXMuY2FzZXNbbGFiZWxdXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyBvdXRwdXQsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBncm91cGVkIGxpc3RcbiAgICAgICAgICAgICAgICBvdXRwdXRMb29rdXBbdGhpcy5jYXNlc1tsYWJlbF1dID0gZ3JvdXBlZEJ5T3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXQucHVzaChbdGhpcy5jYXNlc1tsYWJlbF0sIFtsYWJlbF1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgc2VlbiB0aGlzIGV4cHJlc3Npb24gYmVmb3JlLCBhZGQgdGhlIGxhYmVsIHRvIHRoYXQgb3V0cHV0J3MgZ3JvdXBcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXRbb3V0cHV0SW5kZXhdWzFdLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29lcmNlTGFiZWwgPSAobGFiZWwpID0+IHRoaXMuaW5wdXRUeXBlLmtpbmQgPT09ICdudW1iZXInID8gTnVtYmVyKGxhYmVsKSA6IGxhYmVsO1xuXG4gICAgICAgIGZvciAoY29uc3QgW291dHB1dEluZGV4LCBsYWJlbHNdIG9mIGdyb3VwZWRCeU91dHB1dCkge1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGEgc2luZ2xlIGxhYmVsIG1hdGNoZXMgdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChjb2VyY2VMYWJlbChsYWJlbHNbMF0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgbGl0ZXJhbCBsYWJlbHMgcG9pbnRpbmcgdG8gdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChsYWJlbHMubWFwKGNvZXJjZUxhYmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW291dHB1dEluZGV4XS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3RoZXJ3aXNlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRjaDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtCb29sZWFuVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbnR5cGUgQnJhbmNoZXMgPSBBcnJheTxbRXhwcmVzc2lvbiwgRXhwcmVzc2lvbl0+O1xuXG5jbGFzcyBDYXNlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIGJyYW5jaGVzOiBCcmFuY2hlcztcbiAgICBvdGhlcndpc2U6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBicmFuY2hlczogQnJhbmNoZXMsIG90aGVyd2lzZTogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmJyYW5jaGVzID0gYnJhbmNoZXM7XG4gICAgICAgIHRoaXMub3RoZXJ3aXNlID0gb3RoZXJ3aXNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogP1R5cGU7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmFuY2hlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBCb29sZWFuVHlwZSk7XG4gICAgICAgICAgICBpZiAoIXRlc3QpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGJyYW5jaGVzLnB1c2goW3Rlc3QsIHJlc3VsdF0pO1xuXG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCByZXN1bHQudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG90aGVyd2lzZSA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoIW90aGVyd2lzZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXNzZXJ0KG91dHB1dFR5cGUpO1xuICAgICAgICByZXR1cm4gbmV3IENhc2UoKG91dHB1dFR5cGU6IGFueSksIGJyYW5jaGVzLCBvdGhlcndpc2UpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGVzdCwgZXhwcmVzc2lvbl0gb2YgdGhpcy5icmFuY2hlcykge1xuICAgICAgICAgICAgaWYgKHRlc3QuZXZhbHVhdGUoY3R4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub3RoZXJ3aXNlLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0ZXN0LCBleHByZXNzaW9uXSBvZiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICBmbih0ZXN0KTtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGZuKHRoaXMub3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5icmFuY2hlcy5ldmVyeSgoW18sIG91dF0pID0+IG91dC5vdXRwdXREZWZpbmVkKCkpICYmIHRoaXMub3RoZXJ3aXNlLm91dHB1dERlZmluZWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJjYXNlXCJdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhc2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1ZhbHVlVHlwZSwgTnVtYmVyVHlwZSwgU3RyaW5nVHlwZSwgYXJyYXksIHRvU3RyaW5nLCBpc1ZhbGlkVHlwZSwgaXNWYWxpZE5hdGl2ZVR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBTbGljZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgYmVnaW5JbmRleDogRXhwcmVzc2lvbjtcbiAgICBlbmRJbmRleDogP0V4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgYmVnaW5JbmRleDogRXhwcmVzc2lvbiwgZW5kSW5kZXg/OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5iZWdpbkluZGV4ID0gYmVnaW5JbmRleDtcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4O1xuXG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDIgfHwgIGFyZ3MubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAzIG9yIDQgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgY29uc3QgYmVnaW5JbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgTnVtYmVyVHlwZSk7XG5cbiAgICAgICAgaWYgKCFpbnB1dCB8fCAhYmVnaW5JbmRleCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZShpbnB1dC50eXBlLCBbYXJyYXkoVmFsdWVUeXBlKSwgU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7dG9TdHJpbmcoaW5wdXQudHlwZSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFlbmRJbmRleCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGlucHV0LnR5cGUsIGlucHV0LCBiZWdpbkluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGlucHV0LnR5cGUsIGlucHV0LCBiZWdpbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSAodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuICAgICAgICBjb25zdCBiZWdpbkluZGV4ID0gKHRoaXMuYmVnaW5JbmRleC5ldmFsdWF0ZShjdHgpOiBudW1iZXIpO1xuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUoaW5wdXQsIFsnc3RyaW5nJywgJ2FycmF5J10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKGlucHV0KSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSAodGhpcy5lbmRJbmRleC5ldmFsdWF0ZShjdHgpOiBudW1iZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnNsaWNlKGJlZ2luSW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnB1dC5zbGljZShiZWdpbkluZGV4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICBmbih0aGlzLmJlZ2luSW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCkge1xuICAgICAgICAgICAgZm4odGhpcy5lbmRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCAhPSBudWxsICYmIHRoaXMuZW5kSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmVuZEluZGV4LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIFtcInNsaWNlXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCksIHRoaXMuYmVnaW5JbmRleC5zZXJpYWxpemUoKSwgZW5kSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJzbGljZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpLCB0aGlzLmJlZ2luSW5kZXguc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2xpY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3RvU3RyaW5nLCBWYWx1ZVR5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9hc3NlcnRpb24uanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbnR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gJz09JyB8ICchPScgfCAnPCcgfCAnPicgfCAnPD0nIHwgJz49JyA7XG5cbmZ1bmN0aW9uIGlzQ29tcGFyYWJsZVR5cGUob3A6IENvbXBhcmlzb25PcGVyYXRvciwgdHlwZTogVHlwZSkge1xuICAgIGlmIChvcCA9PT0gJz09JyB8fCBvcCA9PT0gJyE9Jykge1xuICAgICAgICAvLyBlcXVhbGl0eSBvcGVyYXRvclxuICAgICAgICByZXR1cm4gdHlwZS5raW5kID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bGwnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3JkZXJpbmcgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSA9PT0gYjsgfVxuZnVuY3Rpb24gbmVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSAhPT0gYjsgfVxuZnVuY3Rpb24gbHQoY3R4LCBhLCBiKSB7IHJldHVybiBhIDwgYjsgfVxuZnVuY3Rpb24gZ3QoY3R4LCBhLCBiKSB7IHJldHVybiBhID4gYjsgfVxuZnVuY3Rpb24gbHRlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPD0gYjsgfVxuZnVuY3Rpb24gZ3RlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPj0gYjsgfVxuXG5mdW5jdGlvbiBlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPT09IDA7IH1cbmZ1bmN0aW9uIG5lcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiAhZXFDb2xsYXRlKGN0eCwgYSwgYiwgYyk7IH1cbmZ1bmN0aW9uIGx0Q29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA8IDA7IH1cbmZ1bmN0aW9uIGd0Q29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA+IDA7IH1cbmZ1bmN0aW9uIGx0ZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpIDw9IDA7IH1cbmZ1bmN0aW9uIGd0ZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID49IDA7IH1cblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBpbXBsZW1lbnRpbmcgdGhlIHNpZ25hdHVyZXM6XG4gKiAtIChULCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKFQsIHZhbHVlLCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKHZhbHVlLCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqXG4gKiBGb3IgaW5lcXVhbGl0aWVzLCBUIG11c3QgYmUgZWl0aGVyIHZhbHVlLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yID09LyE9LCBpdFxuICogY2FuIGFsc28gYmUgYm9vbGVhbiBvciBudWxsLlxuICpcbiAqIEVxdWFsaXR5IHNlbWFudGljcyBhcmUgZXF1aXZhbGVudCB0byBKYXZhc2NyaXB0J3Mgc3RyaWN0IGVxdWFsaXR5ICg9PT0vIT09KVxuICogLS0gaS5lLiwgd2hlbiB0aGUgYXJndW1lbnRzJyB0eXBlcyBkb24ndCBtYXRjaCwgPT0gZXZhbHVhdGVzIHRvIGZhbHNlLCAhPSB0b1xuICogdHJ1ZS5cbiAqXG4gKiBXaGVuIHR5cGVzIGRvbid0IG1hdGNoIGluIGFuIG9yZGVyaW5nIGNvbXBhcmlzb24sIGEgcnVudGltZSBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZUNvbXBhcmlzb24ob3A6IENvbXBhcmlzb25PcGVyYXRvciwgY29tcGFyZUJhc2ljLCBjb21wYXJlV2l0aENvbGxhdG9yKSB7XG4gICAgY29uc3QgaXNPcmRlckNvbXBhcmlzb24gPSBvcCAhPT0gJz09JyAmJiBvcCAhPT0gJyE9JztcblxuICAgIHJldHVybiBjbGFzcyBDb21wYXJpc29uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgICAgIHR5cGU6IFR5cGU7XG4gICAgICAgIGxoczogRXhwcmVzc2lvbjtcbiAgICAgICAgcmhzOiBFeHByZXNzaW9uO1xuICAgICAgICBjb2xsYXRvcjogP0V4cHJlc3Npb247XG4gICAgICAgIGhhc1VudHlwZWRBcmd1bWVudDogYm9vbGVhbjtcblxuICAgICAgICBjb25zdHJ1Y3RvcihsaHM6IEV4cHJlc3Npb24sIHJoczogRXhwcmVzc2lvbiwgY29sbGF0b3I6ID9FeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBCb29sZWFuVHlwZTtcbiAgICAgICAgICAgIHRoaXMubGhzID0gbGhzO1xuICAgICAgICAgICAgdGhpcy5yaHMgPSByaHM7XG4gICAgICAgICAgICB0aGlzLmNvbGxhdG9yID0gY29sbGF0b3I7XG4gICAgICAgICAgICB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCA9IGxocy50eXBlLmtpbmQgPT09ICd2YWx1ZScgfHwgcmhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzICYmIGFyZ3MubGVuZ3RoICE9PSA0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gb3IgdGhyZWUgYXJndW1lbnRzLmApO1xuXG4gICAgICAgICAgICBjb25zdCBvcDogQ29tcGFyaXNvbk9wZXJhdG9yID0gKGFyZ3NbMF06IGFueSk7XG5cbiAgICAgICAgICAgIGxldCBsaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxocykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoIWlzQ29tcGFyYWJsZVR5cGUob3AsIGxocy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbmNhdCgxKS5lcnJvcihgXCIke29wfVwiIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICcke3RvU3RyaW5nKGxocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJocyA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmhzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICghaXNDb21wYXJhYmxlVHlwZShvcCwgcmhzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29uY2F0KDIpLmVycm9yKGBcIiR7b3B9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7dG9TdHJpbmcocmhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSByaHMudHlwZS5raW5kICYmXG4gICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJlxuICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBDYW5ub3QgY29tcGFyZSB0eXBlcyAnJHt0b1N0cmluZyhsaHMudHlwZSl9JyBhbmQgJyR7dG9TdHJpbmcocmhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09yZGVyQ29tcGFyaXNvbikge1xuICAgICAgICAgICAgICAgIC8vIHR5cGluZyBydWxlcyBzcGVjaWZpYyB0byBsZXNzL2dyZWF0ZXIgdGhhbiBvcGVyYXRvcnNcbiAgICAgICAgICAgICAgICBpZiAobGhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJyAmJiByaHMudHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSwgVClcbiAgICAgICAgICAgICAgICAgICAgbGhzID0gbmV3IEFzc2VydGlvbihyaHMudHlwZSwgW2xoc10pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJiByaHMudHlwZS5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIChULCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmhzID0gbmV3IEFzc2VydGlvbihsaHMudHlwZSwgW3Joc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbGxhdG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJlxuICAgICAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAndmFsdWUnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBDYW5ub3QgdXNlIGNvbGxhdG9yIHRvIGNvbXBhcmUgbm9uLXN0cmluZyB0eXBlcy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sbGF0b3IgPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIENvbGxhdG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xsYXRvcikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvbihsaHMsIHJocywgY29sbGF0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICAgICAgY29uc3QgbGhzID0gdGhpcy5saHMuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHJocyA9IHRoaXMucmhzLmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgICAgIGlmIChpc09yZGVyQ29tcGFyaXNvbiAmJiB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGx0ID0gdHlwZU9mKGxocyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnQgPSB0eXBlT2YocmhzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHR5cGUgaXMgc3RyaW5nIG9yIG51bWJlciwgYW5kIGVxdWFsXG4gICAgICAgICAgICAgICAgaWYgKGx0LmtpbmQgIT09IHJ0LmtpbmQgfHwgIShsdC5raW5kID09PSAnc3RyaW5nJyB8fCBsdC5raW5kID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgYXJndW1lbnRzIGZvciBcIiR7b3B9XCIgdG8gYmUgKHN0cmluZywgc3RyaW5nKSBvciAobnVtYmVyLCBudW1iZXIpLCBidXQgZm91bmQgKCR7bHQua2luZH0sICR7cnQua2luZH0pIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvciAmJiAhaXNPcmRlckNvbXBhcmlzb24gJiYgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsdCA9IHR5cGVPZihsaHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ0ID0gdHlwZU9mKHJocyk7XG4gICAgICAgICAgICAgICAgaWYgKGx0LmtpbmQgIT09ICdzdHJpbmcnIHx8IHJ0LmtpbmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQmFzaWMoY3R4LCBsaHMsIHJocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvciA/XG4gICAgICAgICAgICAgICAgY29tcGFyZVdpdGhDb2xsYXRvcihjdHgsIGxocywgcmhzLCB0aGlzLmNvbGxhdG9yLmV2YWx1YXRlKGN0eCkpIDpcbiAgICAgICAgICAgICAgICBjb21wYXJlQmFzaWMoY3R4LCBsaHMsIHJocyk7XG4gICAgICAgIH1cblxuICAgICAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxocyk7XG4gICAgICAgICAgICBmbih0aGlzLnJocyk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvcikge1xuICAgICAgICAgICAgICAgIGZuKHRoaXMuY29sbGF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtvcF07XG4gICAgICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgRXF1YWxzID0gbWFrZUNvbXBhcmlzb24oJz09JywgZXEsIGVxQ29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTm90RXF1YWxzID0gbWFrZUNvbXBhcmlzb24oJyE9JywgbmVxLCBuZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBMZXNzVGhhbiA9IG1ha2VDb21wYXJpc29uKCc8JywgbHQsIGx0Q29sbGF0ZSk7XG5leHBvcnQgY29uc3QgR3JlYXRlclRoYW4gPSBtYWtlQ29tcGFyaXNvbignPicsIGd0LCBndENvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IExlc3NUaGFuT3JFcXVhbCA9IG1ha2VDb21wYXJpc29uKCc8PScsIGx0ZXEsIGx0ZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBHcmVhdGVyVGhhbk9yRXF1YWwgPSBtYWtlQ29tcGFyaXNvbignPj0nLCBndGVxLCBndGVxQ29sbGF0ZSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1N0cmluZ1R5cGUsIE51bWJlclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgTnVtYmVyRm9ybWF0OiBDbGFzczxJbnRsJE51bWJlckZvcm1hdD5cbn07XG5cbmRlY2xhcmUgY2xhc3MgSW50bCROdW1iZXJGb3JtYXQge1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgc3RhdGljIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgZm9ybWF0KGE6IG51bWJlcik6IHN0cmluZztcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHtcbiAgICBzdHlsZT86ICdkZWNpbWFsJyB8ICdjdXJyZW5jeScgfCAncGVyY2VudCc7XG4gICAgY3VycmVuY3k/OiBudWxsIHwgc3RyaW5nO1xuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0cz86IG51bGwgfCBzdHJpbmc7XG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzPzogbnVsbCB8IHN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlckZvcm1hdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbnVtYmVyOiBFeHByZXNzaW9uO1xuICAgIGxvY2FsZTogRXhwcmVzc2lvbiB8IG51bGw7ICAgLy8gQkNQIDQ3IGxhbmd1YWdlIHRhZ1xuICAgIGN1cnJlbmN5OiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gSVNPIDQyMTcgY3VycmVuY3kgY29kZSwgcmVxdWlyZWQgaWYgc3R5bGU9Y3VycmVuY3lcbiAgICBtaW5GcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGw7IC8vIERlZmF1bHQgMFxuICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gRGVmYXVsdCAzXG5cbiAgICBjb25zdHJ1Y3RvcihudW1iZXI6IEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSBTdHJpbmdUeXBlO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY3VycmVuY3kgPSBjdXJyZW5jeTtcbiAgICAgICAgdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID0gbWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGNvbnN0IG51bWJlciA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghbnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMl06IGFueSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE51bWJlckZvcm1hdCBvcHRpb25zIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LmApO1xuXG4gICAgICAgIGxldCBsb2NhbGUgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbG9jYWxlJ10pIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbG9jYWxlJ10sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbmN5ID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2N1cnJlbmN5J10pIHtcbiAgICAgICAgICAgIGN1cnJlbmN5ID0gY29udGV4dC5wYXJzZShvcHRpb25zWydjdXJyZW5jeSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghY3VycmVuY3kpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1pbkZyYWN0aW9uRGlnaXRzID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSkge1xuICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1pbkZyYWN0aW9uRGlnaXRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhGcmFjdGlvbkRpZ2l0cyA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10pIHtcbiAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzID0gY29udGV4dC5wYXJzZShvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtYXhGcmFjdGlvbkRpZ2l0cykgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE51bWJlckZvcm1hdChudW1iZXIsIGxvY2FsZSwgY3VycmVuY3ksIG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IFtdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLmN1cnJlbmN5ID8gXCJjdXJyZW5jeVwiIDogXCJkZWNpbWFsXCIsXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3kgPyB0aGlzLmN1cnJlbmN5LmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID8gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyA/IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh0aGlzLm51bWJlci5ldmFsdWF0ZShjdHgpKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMubnVtYmVyKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxvY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVuY3kpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuY3VycmVuY3kpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBmbih0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgZm4odGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgb3B0aW9uc1snbG9jYWxlJ10gPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeSkge1xuICAgICAgICAgICAgb3B0aW9uc1snY3VycmVuY3knXSA9IHRoaXMuY3VycmVuY3kuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSA9IHRoaXMubWluRnJhY3Rpb25EaWdpdHMuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4RnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSA9IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcIm51bWJlci1mb3JtYXRcIiwgdGhpcy5udW1iZXIuc2VyaWFsaXplKCksIG9wdGlvbnNdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZSwgdG9TdHJpbmd9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIExlbmd0aCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBOdW1iZXJUeXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDEgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnB1dC50eXBlLmtpbmQgIT09ICdhcnJheScgJiYgaW5wdXQudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlLmtpbmQgIT09ICd2YWx1ZScpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCAke3RvU3RyaW5nKGlucHV0LnR5cGUpfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVuZ3RoKGlucHV0KTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaW5wdXQpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImxlbmd0aFwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMZW5ndGg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIHR5cGUgVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIEVycm9yVHlwZSxcbiAgICBDb2xsYXRvclR5cGUsXG4gICAgYXJyYXksXG4gICAgdG9TdHJpbmcgYXMgdHlwZVRvU3RyaW5nXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHt0eXBlT2YsIENvbG9yLCB2YWxpZGF0ZVJHQkEsIHRvU3RyaW5nIGFzIHZhbHVlVG9TdHJpbmd9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4uL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCBMZXQgZnJvbSAnLi9sZXQuanMnO1xuaW1wb3J0IFZhciBmcm9tICcuL3Zhci5qcyc7XG5pbXBvcnQgTGl0ZXJhbCBmcm9tICcuL2xpdGVyYWwuanMnO1xuaW1wb3J0IEFzc2VydGlvbiBmcm9tICcuL2Fzc2VydGlvbi5qcyc7XG5pbXBvcnQgQ29lcmNpb24gZnJvbSAnLi9jb2VyY2lvbi5qcyc7XG5pbXBvcnQgQXQgZnJvbSAnLi9hdC5qcyc7XG5pbXBvcnQgSW4gZnJvbSAnLi9pbi5qcyc7XG5pbXBvcnQgSW5kZXhPZiBmcm9tICcuL2luZGV4X29mLmpzJztcbmltcG9ydCBNYXRjaCBmcm9tICcuL21hdGNoLmpzJztcbmltcG9ydCBDYXNlIGZyb20gJy4vY2FzZS5qcyc7XG5pbXBvcnQgU2xpY2UgZnJvbSAnLi9zbGljZS5qcyc7XG5pbXBvcnQgU3RlcCBmcm9tICcuL3N0ZXAuanMnO1xuaW1wb3J0IEludGVycG9sYXRlIGZyb20gJy4vaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IENvYWxlc2NlIGZyb20gJy4vY29hbGVzY2UuanMnO1xuaW1wb3J0IHtcbiAgICBFcXVhbHMsXG4gICAgTm90RXF1YWxzLFxuICAgIExlc3NUaGFuLFxuICAgIEdyZWF0ZXJUaGFuLFxuICAgIExlc3NUaGFuT3JFcXVhbCxcbiAgICBHcmVhdGVyVGhhbk9yRXF1YWxcbn0gZnJvbSAnLi9jb21wYXJpc29uLmpzJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9jb2xsYXRvci5qcyc7XG5pbXBvcnQgTnVtYmVyRm9ybWF0IGZyb20gJy4vbnVtYmVyX2Zvcm1hdC5qcyc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuL2Zvcm1hdC5qcyc7XG5pbXBvcnQgSW1hZ2VFeHByZXNzaW9uIGZyb20gJy4vaW1hZ2UuanMnO1xuaW1wb3J0IExlbmd0aCBmcm9tICcuL2xlbmd0aC5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vd2l0aGluLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhcmFyZ3N9IGZyb20gJy4uL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5cbmNvbnN0IGV4cHJlc3Npb25zOiBFeHByZXNzaW9uUmVnaXN0cnkgPSB7XG4gICAgLy8gc3BlY2lhbCBmb3Jtc1xuICAgICc9PSc6IEVxdWFscyxcbiAgICAnIT0nOiBOb3RFcXVhbHMsXG4gICAgJz4nOiBHcmVhdGVyVGhhbixcbiAgICAnPCc6IExlc3NUaGFuLFxuICAgICc+PSc6IEdyZWF0ZXJUaGFuT3JFcXVhbCxcbiAgICAnPD0nOiBMZXNzVGhhbk9yRXF1YWwsXG4gICAgJ2FycmF5JzogQXNzZXJ0aW9uLFxuICAgICdhdCc6IEF0LFxuICAgICdib29sZWFuJzogQXNzZXJ0aW9uLFxuICAgICdjYXNlJzogQ2FzZSxcbiAgICAnY29hbGVzY2UnOiBDb2FsZXNjZSxcbiAgICAnY29sbGF0b3InOiBDb2xsYXRvckV4cHJlc3Npb24sXG4gICAgJ2Zvcm1hdCc6IEZvcm1hdEV4cHJlc3Npb24sXG4gICAgJ2ltYWdlJzogSW1hZ2VFeHByZXNzaW9uLFxuICAgICdpbic6IEluLFxuICAgICdpbmRleC1vZic6IEluZGV4T2YsXG4gICAgJ2ludGVycG9sYXRlJzogSW50ZXJwb2xhdGUsXG4gICAgJ2ludGVycG9sYXRlLWhjbCc6IEludGVycG9sYXRlLFxuICAgICdpbnRlcnBvbGF0ZS1sYWInOiBJbnRlcnBvbGF0ZSxcbiAgICAnbGVuZ3RoJzogTGVuZ3RoLFxuICAgICdsZXQnOiBMZXQsXG4gICAgJ2xpdGVyYWwnOiBMaXRlcmFsLFxuICAgICdtYXRjaCc6IE1hdGNoLFxuICAgICdudW1iZXInOiBBc3NlcnRpb24sXG4gICAgJ251bWJlci1mb3JtYXQnOiBOdW1iZXJGb3JtYXQsXG4gICAgJ29iamVjdCc6IEFzc2VydGlvbixcbiAgICAnc2xpY2UnOiBTbGljZSxcbiAgICAnc3RlcCc6IFN0ZXAsXG4gICAgJ3N0cmluZyc6IEFzc2VydGlvbixcbiAgICAndG8tYm9vbGVhbic6IENvZXJjaW9uLFxuICAgICd0by1jb2xvcic6IENvZXJjaW9uLFxuICAgICd0by1udW1iZXInOiBDb2VyY2lvbixcbiAgICAndG8tc3RyaW5nJzogQ29lcmNpb24sXG4gICAgJ3Zhcic6IFZhcixcbiAgICAnd2l0aGluJzogV2l0aGluXG59O1xuXG5mdW5jdGlvbiByZ2JhKGN0eCwgW3IsIGcsIGIsIGFdKSB7XG4gICAgciA9IHIuZXZhbHVhdGUoY3R4KTtcbiAgICBnID0gZy5ldmFsdWF0ZShjdHgpO1xuICAgIGIgPSBiLmV2YWx1YXRlKGN0eCk7XG4gICAgY29uc3QgYWxwaGEgPSBhID8gYS5ldmFsdWF0ZShjdHgpIDogMTtcbiAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlUkdCQShyLCBnLCBiLCBhbHBoYSk7XG4gICAgaWYgKGVycm9yKSB0aHJvdyBuZXcgUnVudGltZUVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gbmV3IENvbG9yKHIgLyAyNTUgKiBhbHBoYSwgZyAvIDI1NSAqIGFscGhhLCBiIC8gMjU1ICogYWxwaGEsIGFscGhhKTtcbn1cblxuZnVuY3Rpb24gaGFzKGtleSwgb2JqKSB7XG4gICAgcmV0dXJuIGtleSBpbiBvYmo7XG59XG5cbmZ1bmN0aW9uIGdldChrZXksIG9iaikge1xuICAgIGNvbnN0IHYgPSBvYmpba2V5XTtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHY7XG59XG5cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaCh2LCBhLCBpLCBqKSB7XG4gICAgd2hpbGUgKGkgPD0gaikge1xuICAgICAgICBjb25zdCBtID0gKGkgKyBqKSA+PiAxO1xuICAgICAgICBpZiAoYVttXSA9PT0gdilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYVttXSA+IHYpXG4gICAgICAgICAgICBqID0gbSAtIDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGkgPSBtICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB2YXJhcmdzKHR5cGU6IFR5cGUpOiBWYXJhcmdzIHtcbiAgICByZXR1cm4ge3R5cGV9O1xufVxuXG5Db21wb3VuZEV4cHJlc3Npb24ucmVnaXN0ZXIoZXhwcmVzc2lvbnMsIHtcbiAgICAnZXJyb3InOiBbXG4gICAgICAgIEVycm9yVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHsgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcih2LmV2YWx1YXRlKGN0eCkpOyB9XG4gICAgXSxcbiAgICAndHlwZW9mJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB0eXBlVG9TdHJpbmcodHlwZU9mKHYuZXZhbHVhdGUoY3R4KSkpXG4gICAgXSxcbiAgICAndG8tcmdiYSc6IFtcbiAgICAgICAgYXJyYXkoTnVtYmVyVHlwZSwgNCksXG4gICAgICAgIFtDb2xvclR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2LmV2YWx1YXRlKGN0eCkudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAncmdiJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ3JnYmEnOiBbXG4gICAgICAgIENvbG9yVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICByZ2JhXG4gICAgXSxcbiAgICAnaGFzJzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGhhcyhrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdnZXQnOiB7XG4gICAgICAgIHR5cGU6IFZhbHVlVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdmZWF0dXJlLXN0YXRlJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW2tleV0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgY3R4LmZlYXR1cmVTdGF0ZSB8fCB7fSlcbiAgICBdLFxuICAgICdwcm9wZXJ0aWVzJzogW1xuICAgICAgICBPYmplY3RUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2dlb21ldHJ5LXR5cGUnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2VvbWV0cnlUeXBlKClcbiAgICBdLFxuICAgICdpZCc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LmlkKClcbiAgICBdLFxuICAgICd6b29tJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuem9vbVxuICAgIF0sXG4gICAgJ2hlYXRtYXAtZGVuc2l0eSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmhlYXRtYXBEZW5zaXR5IHx8IDBcbiAgICBdLFxuICAgICdsaW5lLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMubGluZVByb2dyZXNzIHx8IDBcbiAgICBdLFxuICAgICdza3ktcmFkaWFsLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuc2t5UmFkaWFsUHJvZ3Jlc3MgfHwgMFxuICAgIF0sXG4gICAgJ2FjY3VtdWxhdGVkJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5hY2N1bXVsYXRlZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN0eC5nbG9iYWxzLmFjY3VtdWxhdGVkXG4gICAgXSxcbiAgICAnKyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJyonOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSAxO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCAqPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICctJzoge1xuICAgICAgICB0eXBlOiBOdW1iZXJUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLSBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2FdKSA9PiAtYS5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICcvJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIC8gYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnJSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAlIGIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJ2xuMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguTE4yXG4gICAgXSxcbiAgICAncGknOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLlBJXG4gICAgXSxcbiAgICAnZSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguRVxuICAgIF0sXG4gICAgJ14nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2IsIGVdKSA9PiBNYXRoLnBvdyhiLmV2YWx1YXRlKGN0eCksIGUuZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdzcXJ0JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFt4XSkgPT4gTWF0aC5zcXJ0KHguZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cxMCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSkgLyBNYXRoLkxOMTBcbiAgICBdLFxuICAgICdsbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cyJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKSAvIE1hdGguTE4yXG4gICAgXSxcbiAgICAnc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5zaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Nvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICd0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXNpbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYWNvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXRhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbWluJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1pbiguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ21heCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5tYXgoLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdhYnMnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFicyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAncm91bmQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gSmF2YXNjcmlwdCdzIE1hdGgucm91bmQoKSByb3VuZHMgdG93YXJkcyArSW5maW5pdHkgZm9yIGhhbGZ3YXlcbiAgICAgICAgICAgIC8vIHZhbHVlcywgZXZlbiB3aGVuIHRoZXkncmUgbmVnYXRpdmUuIEl0J3MgbW9yZSBjb21tb24gdG8gcm91bmRcbiAgICAgICAgICAgIC8vIGF3YXkgZnJvbSAwIChlLmcuLCB0aGlzIGlzIHdoYXQgcHl0aG9uIGFuZCBDKysgZG8pXG4gICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAtTWF0aC5yb3VuZCgtdikgOiBNYXRoLnJvdW5kKHYpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmxvb3InOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmZsb29yKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdjZWlsJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5jZWlsKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdmaWx0ZXItPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguaWQoKSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaGFzJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrXSkgPT4gKGs6IGFueSkudmFsdWUgaW4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMtaWQnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gKGN0eC5pZCgpICE9PSBudWxsICYmIGN0eC5pZCgpICE9PSB1bmRlZmluZWQpXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoU3RyaW5nVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4Lmdlb21ldHJ5VHlwZSgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LmlkKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tc21hbGwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhbiBhcnJheSBsaXRlcmFsXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gKHY6IGFueSkudmFsdWUuaW5kZXhPZihjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1sYXJnZSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGEgYXJyYXkgbGl0ZXJhbCB3aXRoIHZhbHVlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBvZiBhIHNpbmdsZSB0eXBlXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gYmluYXJ5U2VhcmNoKGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdLCAodjogYW55KS52YWx1ZSwgMCwgKHY6IGFueSkudmFsdWUubGVuZ3RoIC0gMSlcbiAgICBdLFxuICAgICdhbGwnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAmJiBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdhbnknOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSB8fCBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJyEnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbQm9vbGVhblR5cGVdLFxuICAgICAgICAoY3R4LCBbYl0pID0+ICFiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdpcy1zdXBwb3J0ZWQtc2NyaXB0JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAvLyBBdCBwYXJzZSB0aW1lIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUsIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSB0aGlzIGV4cHJlc3Npb24gd2l0aCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnRcbiAgICAgICAgKGN0eCwgW3NdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1N1cHBvcnRlZFNjcmlwdCA9IGN0eC5nbG9iYWxzICYmIGN0eC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkU2NyaXB0KHMuZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhWYWx1ZVR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBhcmdzLm1hcChhcmcgPT4gdmFsdWVUb1N0cmluZyhhcmcuZXZhbHVhdGUoY3R4KSkpLmpvaW4oJycpXG4gICAgXSxcbiAgICAncmVzb2x2ZWQtbG9jYWxlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbQ29sbGF0b3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW2NvbGxhdG9yXSkgPT4gY29sbGF0b3IuZXZhbHVhdGUoY3R4KS5yZXNvbHZlZExvY2FsZSgpXG4gICAgXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cHJlc3Npb25zO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBBIHR5cGUgdXNlZCBmb3IgcmV0dXJuaW5nIGFuZCBwcm9wYWdhdGluZyBlcnJvcnMuIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB1bmlvblxuICogcmVwcmVzZW50cyBzdWNjZXNzIGFuZCBjb250YWlucyBhIHZhbHVlLCBhbmQgdGhlIHNlY29uZCByZXByZXNlbnRzIGFuIGVycm9yIGFuZFxuICogY29udGFpbnMgYW4gZXJyb3IgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuICAgIHwge3wgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlOiBUIHx9XG4gICAgfCB7fCByZXN1bHQ6ICdlcnJvcicsIHZhbHVlOiBFIHx9O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzczxULCBFPih2YWx1ZTogVCk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHtyZXN1bHQ6ICdzdWNjZXNzJywgdmFsdWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3I8VCwgRT4odmFsdWU6IEUpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7cmVzdWx0OiAnZXJyb3InLCB2YWx1ZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY1sncHJvcGVydHktdHlwZSddID09PSAnZGF0YS1kcml2ZW4nIHx8IHNwZWNbJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZignem9vbScpID4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ludGVycG9sYXRpb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLmludGVycG9sYXRlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFR5cGUodmFsOiBtaXhlZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgKiBhcyBjb2xvclNwYWNlcyBmcm9tICcuLi91dGlsL2NvbG9yX3NwYWNlcy5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuaW1wb3J0IHtzdXBwb3J0c0ludGVycG9sYXRpb259IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL2V4cHJlc3Npb24vc3RvcHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpIHtcbiAgICBjb25zdCBpc0NvbG9yID0gcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcic7XG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICBjb25zdCBmZWF0dXJlRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgcGFyYW1ldGVycy5wcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvb21EZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCAhZmVhdHVyZURlcGVuZGVudDtcbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IChzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAke3BhcmFtZXRlcnMuY29sb3JTcGFjZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgaW5uZXJGdW47XG4gICAgbGV0IGhhc2hlZFN0b3BzO1xuICAgIGxldCBjYXRlZ29yaWNhbEtleVR5cGU7XG4gICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbjtcblxuICAgICAgICAvLyBGb3IgY2F0ZWdvcmljYWwgZnVuY3Rpb25zLCBnZW5lcmF0ZSBhbiBPYmplY3QgYXMgYSBoYXNobWFwIG9mIHRoZSBzdG9wcyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAgICAgICAgaGFzaGVkU3RvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0b3Agb2YgcGFyYW1ldGVycy5zdG9wcykge1xuICAgICAgICAgICAgaGFzaGVkU3RvcHNbc3RvcFswXV0gPSBzdG9wWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIga2V5IHR5cGUgYmFzZWQgb24gZmlyc3Qgc3RvcCBrZXktLSB1c2VkIHRvIGVuY2ZvcmNlIHN0cmljdCB0eXBlIGNoZWNraW5nIGxhdGVyXG4gICAgICAgIGNhdGVnb3JpY2FsS2V5VHlwZSA9IHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKHpvb21BbmRGZWF0dXJlRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3Qgem9vbVN0b3BzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHBhcmFtZXRlcnMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHBhcmFtZXRlcnMuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB6b29tU3RvcHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0uc3RvcHMucHVzaChbc3RvcFswXS52YWx1ZSwgc3RvcFsxXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB6IG9mIHpvb21TdG9wcykge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHMucHVzaChbZmVhdHVyZUZ1bmN0aW9uc1t6XS56b29tLCBjcmVhdGVGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25zW3pdLCBwcm9wZXJ0eVNwZWMpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyA/XG4gICAgICAgICAgICB7bmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogcGFyYW1ldGVycy5iYXNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmJhc2UgOiAxfSA6IG51bGw7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBwYXJhbWV0ZXJzLnN0b3BzLm1hcChzID0+IHNbMF0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICh7em9vbX0pID0+IGlubmVyRnVuKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgem9vbSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICBldmFsdWF0ZShfLCBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllc1twYXJhbWV0ZXJzLnByb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHZhbHVlLCBoYXNoZWRTdG9wcywgY2F0ZWdvcmljYWxLZXlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgICBpZiAoYiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQsIGhhc2hlZFN0b3BzLCBrZXlUeXBlKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkID0gdHlwZW9mIGlucHV0ID09PSBrZXlUeXBlID8gaGFzaGVkU3RvcHNbaW5wdXRdIDogdW5kZWZpbmVkOyAvLyBFbmZvcmNlIHN0cmljdCB0eXBpbmcgb24gaW5wdXRcbiAgICByZXR1cm4gY29hbGVzY2UoZXZhbHVhdGVkLCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQpIHtcbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGNvbnN0IGJhc2UgPSBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDE7XG5cbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgIGlucHV0ID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGlucHV0LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAoZ2V0VHlwZShpbnB1dCkgIT09IHByb3BlcnR5U3BlYy50eXBlICYmIChwcm9wZXJ0eVNwZWMudHlwZSAhPT0gJ2VudW0nIHx8ICFwcm9wZXJ0eVNwZWMudmFsdWVzW2lucHV0XSkpIHtcbiAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjb2FsZXNjZShpbnB1dCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICogVHdvIGNvbnNlY3V0aXZlIHN0b3AgdmFsdWVzIGRlZmluZSBhIChzY2FsZWQgYW5kIHNoaWZ0ZWQpIGV4cG9uZW50aWFsXG4gKiBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRpb25GYWN0b3IoaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdXBwZXJWYWx1ZSAtIGxvd2VyVmFsdWU7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBpbnB1dCAtIGxvd2VyVmFsdWU7XG5cbiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gZGlmZmVyZW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9kZWZpbml0aW9ucy9zdGVwLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzJztcbmltcG9ydCBMZXQgZnJvbSAnLi9kZWZpbml0aW9ucy9sZXQuanMnO1xuaW1wb3J0IGRlZmluaXRpb25zIGZyb20gJy4vZGVmaW5pdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgaXNDb25zdGFudCBmcm9tICcuL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7c3VjY2VzcywgZXJyb3J9IGZyb20gJy4uL3V0aWwvcmVzdWx0LmpzJztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24sIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sIHN1cHBvcnRzSW50ZXJwb2xhdGlvbn0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQuanMnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlID0ge1xuICAgICt0eXBlOiAxIHwgMiB8IDMgfCAnVW5rbm93bicgfCAnUG9pbnQnIHwgJ011bHRpUG9pbnQnIHwgJ0xpbmVTdHJpbmcnIHwgJ011bHRpTGluZVN0cmluZycgfCAnUG9seWdvbicgfCAnTXVsdGlQb2x5Z29uJyxcbiAgICAraWQ/OiBhbnksXG4gICAgK3Byb3BlcnRpZXM6IHtbXzogc3RyaW5nXTogYW55fSxcbiAgICArcGF0dGVybnM/OiB7W186IHN0cmluZ106IHtcIm1pblwiOiBzdHJpbmcsIFwibWlkXCI6IHN0cmluZywgXCJtYXhcIjogc3RyaW5nfX0sXG4gICAgK2dlb21ldHJ5PzogQXJyYXk8QXJyYXk8UG9pbnQ+PlxufTtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlID0ge1tfOiBzdHJpbmddOiBhbnl9O1xuXG5leHBvcnQgdHlwZSBHbG9iYWxQcm9wZXJ0aWVzID0gJFJlYWRPbmx5PHtcbiAgICB6b29tOiBudW1iZXIsXG4gICAgaGVhdG1hcERlbnNpdHk/OiBudW1iZXIsXG4gICAgbGluZVByb2dyZXNzPzogbnVtYmVyLFxuICAgIHNreVJhZGlhbFByb2dyZXNzPzogbnVtYmVyLFxuICAgIGlzU3VwcG9ydGVkU2NyaXB0PzogKF86IHN0cmluZykgPT4gYm9vbGVhbixcbiAgICBhY2N1bXVsYXRlZD86IFZhbHVlXG59PjtcblxuZXhwb3J0IGNsYXNzIFN0eWxlRXhwcmVzc2lvbiB7XG4gICAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIF9ldmFsdWF0b3I6IEV2YWx1YXRpb25Db250ZXh0O1xuICAgIF9kZWZhdWx0VmFsdWU6IFZhbHVlO1xuICAgIF93YXJuaW5nSGlzdG9yeToge1trZXk6IHN0cmluZ106IGJvb2xlYW59O1xuICAgIF9lbnVtVmFsdWVzOiA/e1tfOiBzdHJpbmddOiBhbnl9O1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgcHJvcGVydHlTcGVjOiA/U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5fd2FybmluZ0hpc3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHByb3BlcnR5U3BlYyA/IGdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eVNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fZW51bVZhbHVlcyA9IHByb3BlcnR5U3BlYyAmJiBwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2VudW0nID8gcHJvcGVydHlTcGVjLnZhbHVlcyA6IG51bGw7XG4gICAgfVxuXG4gICAgZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlU3RhdGUgPSBmZWF0dXJlU3RhdGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5jYW5vbmljYWwgPSBjYW5vbmljYWw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXMgPSBhdmFpbGFibGVJbWFnZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZvcm1hdHRlZFNlY3Rpb24gPSBmb3JtYXR0ZWRTZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gYXZhaWxhYmxlSW1hZ2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbiB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCAhPT0gdmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZW51bVZhbHVlcyAmJiAhKHZhbCBpbiB0aGlzLl9lbnVtVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9uZSBvZiAke09iamVjdC5rZXlzKHRoaXMuX2VudW1WYWx1ZXMpLm1hcCh2ID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKCcsICcpfSwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkodmFsKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fd2FybmluZ0hpc3RvcnlbZS5tZXNzYWdlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhcm5pbmdIaXN0b3J5W2UubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24ubGVuZ3RoID4gMCAmJlxuICAgICAgICB0eXBlb2YgZXhwcmVzc2lvblswXSA9PT0gJ3N0cmluZycgJiYgZXhwcmVzc2lvblswXSBpbiBkZWZpbml0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdHlwZWNoZWNrIHRoZSBnaXZlbiBzdHlsZSBzcGVjIEpTT04gZXhwcmVzc2lvbi4gIElmXG4gKiBvcHRpb25zLmRlZmF1bHRWYWx1ZSBpcyBwcm92aWRlZCwgdGhlbiB0aGUgcmVzdWx0aW5nIFN0eWxlRXhwcmVzc2lvbidzXG4gKiBgZXZhbHVhdGUoKWAgbWV0aG9kIHdpbGwgaGFuZGxlIGVycm9ycyBieSBsb2dnaW5nIGEgd2FybmluZyAob25jZSBwZXJcbiAqIG1lc3NhZ2UpIGFuZCByZXR1cm5pbmcgdGhlIGRlZmF1bHQgdmFsdWUuICBPdGhlcndpc2UsIGl0IHdpbGwgdGhyb3dcbiAqIGV2YWx1YXRpb24gZXJyb3JzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb246IG1peGVkLCBwcm9wZXJ0eVNwZWM6ID9TdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFJlc3VsdDxTdHlsZUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2luZ0NvbnRleHQoZGVmaW5pdGlvbnMsIFtdLCBwcm9wZXJ0eVNwZWMgPyBnZXRFeHBlY3RlZFR5cGUocHJvcGVydHlTcGVjKSA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBGb3Igc3RyaW5nLXZhbHVlZCBwcm9wZXJ0aWVzLCBjb2VyY2UgdG8gc3RyaW5nIGF0IHRoZSB0b3AgbGV2ZWwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlci5wYXJzZShleHByZXNzaW9uLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLFxuICAgICAgICBwcm9wZXJ0eVNwZWMgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdzdHJpbmcnID8ge3R5cGVBbm5vdGF0aW9uOiAnY29lcmNlJ30gOiB1bmRlZmluZWQpO1xuXG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgYXNzZXJ0KHBhcnNlci5lcnJvcnMubGVuZ3RoID4gMCk7XG4gICAgICAgIHJldHVybiBlcnJvcihwYXJzZXIuZXJyb3JzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcyhuZXcgU3R5bGVFeHByZXNzaW9uKHBhcnNlZCwgcHJvcGVydHlTcGVjKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBab29tQ29uc3RhbnRFeHByZXNzaW9uPEtpbmQ6IEV2YWx1YXRpb25LaW5kPiB7XG4gICAga2luZDogS2luZDtcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuO1xuICAgIF9zdHlsZUV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NvbnN0YW50JzogRXZhbHVhdGlvbktpbmQpICYmICFpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBab29tRGVwZW5kZW50RXhwcmVzc2lvbjxLaW5kOiBFdmFsdWF0aW9uS2luZD4ge1xuICAgIGtpbmQ6IEtpbmQ7XG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+O1xuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW47XG5cbiAgICBfc3R5bGVFeHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb247XG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbiwgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+LCBpbnRlcnBvbGF0aW9uVHlwZT86IEludGVycG9sYXRpb25UeXBlKSB7XG4gICAgICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gICAgICAgIHRoaXMuem9vbVN0b3BzID0gem9vbVN0b3BzO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NhbWVyYSc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uVHlwZSA9IGludGVycG9sYXRpb25UeXBlO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQ29uc3RhbnRFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KSA9PiBhbnksXG59XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ3NvdXJjZScsXG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbixcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSA9PiBhbnksXG59O1xuXG5leHBvcnQgdHlwZSBDYW1lcmFFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjYW1lcmEnLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBDb21wb3NpdGVFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW4sXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiA9XG4gICAgfCBDb25zdGFudEV4cHJlc3Npb25cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENhbWVyYUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQsIHByb3BlcnR5U3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBleHByZXNzaW9uID0gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCBwcm9wZXJ0eVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBleHByZXNzaW9uLnZhbHVlLmV4cHJlc3Npb247XG5cbiAgICBjb25zdCBpc0ZlYXR1cmVDb25zdGFudCA9IGlzQ29uc3RhbnQuaXNGZWF0dXJlQ29uc3RhbnQocGFyc2VkKTtcbiAgICBpZiAoIWlzRmVhdHVyZUNvbnN0YW50ICYmICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ2RhdGEgZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNab29tQ29uc3RhbnQgPSBpc0NvbnN0YW50LmlzR2xvYmFsUHJvcGVydHlDb25zdGFudChwYXJzZWQsIFsnem9vbSddKTtcbiAgICBpZiAoIWlzWm9vbUNvbnN0YW50ICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnem9vbSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkJyldKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b29tQ3VydmUgPSBmaW5kWm9vbUN1cnZlKHBhcnNlZCk7XG4gICAgaWYgKCF6b29tQ3VydmUgJiYgIWlzWm9vbUNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbem9vbUN1cnZlXSk7XG4gICAgfSBlbHNlIGlmICh6b29tQ3VydmUgaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSAmJiAhc3VwcG9ydHNJbnRlcnBvbGF0aW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyBwcm9wZXJ0eScpXSk7XG4gICAgfVxuXG4gICAgaWYgKCF6b29tQ3VydmUpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoaXNGZWF0dXJlQ29uc3RhbnQgP1xuICAgICAgICAgICAgKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdjb25zdGFudCcsIGV4cHJlc3Npb24udmFsdWUpOiBDb25zdGFudEV4cHJlc3Npb24pIDpcbiAgICAgICAgICAgIChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignc291cmNlJywgZXhwcmVzc2lvbi52YWx1ZSk6IFNvdXJjZUV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHpvb21DdXJ2ZSBpbnN0YW5jZW9mIEludGVycG9sYXRlID8gem9vbUN1cnZlLmludGVycG9sYXRpb24gOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gc3VjY2Vzcyhpc0ZlYXR1cmVDb25zdGFudCA/XG4gICAgICAgIChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NhbWVyYScsIGV4cHJlc3Npb24udmFsdWUsIHpvb21DdXJ2ZS5sYWJlbHMsIGludGVycG9sYXRpb25UeXBlKTogQ2FtZXJhRXhwcmVzc2lvbikgOlxuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUubGFiZWxzLCBpbnRlcnBvbGF0aW9uVHlwZSk6IENvbXBvc2l0ZUV4cHJlc3Npb24pKTtcbn1cblxuaW1wb3J0IHtpc0Z1bmN0aW9uLCBjcmVhdGVGdW5jdGlvbn0gZnJvbSAnLi4vZnVuY3Rpb24vaW5kZXguanMnO1xuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi92YWx1ZXMuanMnO1xuXG4vLyBzZXJpYWxpemF0aW9uIHdyYXBwZXIgZm9yIG9sZC1zdHlsZSBzdG9wIGZ1bmN0aW9ucyBub3JtYWxpemVkIHRvIHRoZVxuLy8gZXhwcmVzc2lvbiBpbnRlcmZhY2VcbmV4cG9ydCBjbGFzcyBTdHlsZVByb3BlcnR5RnVuY3Rpb248VD4ge1xuICAgIF9wYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPjtcbiAgICBfc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBraW5kOiBFdmFsdWF0aW9uS2luZDtcbiAgICBldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlKSA9PiBhbnk7XG4gICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogPyhpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXI7XG4gICAgem9vbVN0b3BzOiA/QXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5fc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIGV4dGVuZCh0aGlzLCBjcmVhdGVGdW5jdGlvbih0aGlzLl9wYXJhbWV0ZXJzLCB0aGlzLl9zcGVjaWZpY2F0aW9uKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQ6IHtfcGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4sIF9zcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbn0pIHtcbiAgICAgICAgcmV0dXJuICgobmV3IFN0eWxlUHJvcGVydHlGdW5jdGlvbihzZXJpYWxpemVkLl9wYXJhbWV0ZXJzLCBzZXJpYWxpemVkLl9zcGVjaWZpY2F0aW9uKSk6IFN0eWxlUHJvcGVydHlGdW5jdGlvbjxUPik7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShpbnB1dDogU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfcGFyYW1ldGVyczogaW5wdXQuX3BhcmFtZXRlcnMsXG4gICAgICAgICAgICBfc3BlY2lmaWNhdGlvbjogaW5wdXQuX3NwZWNpZmljYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb248VD4odmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTogYW55KTtcblxuICAgIH0gZWxzZSBpZiAoaXNFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gY3JlYXRlUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGluIHZhbGlkYXRpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihleHByZXNzaW9uLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY29uc3RhbnQ6IGFueSA9IHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzcGVjaWZpY2F0aW9uLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0YW50ID0gQ29sb3IucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICgpID0+IGNvbnN0YW50XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBab29tLWRlcGVuZGVudCBleHByZXNzaW9ucyBtYXkgb25seSB1c2UgW1wiem9vbVwiXSBhcyB0aGUgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiXG4vLyBleHByZXNzaW9uIChjb2xsZWN0aXZlbHkgcmVmZXJyZWQgdG8gYXMgYSBcImN1cnZlXCIpLiBUaGUgY3VydmUgbWF5IGJlIHdyYXBwZWQgaW4gb25lIG9yIG1vcmUgXCJsZXRcIiBvclxuLy8gXCJjb2FsZXNjZVwiIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uOiBFeHByZXNzaW9uKTogU3RlcCB8IEludGVycG9sYXRlIHwgUGFyc2luZ0Vycm9yIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMZXQpIHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uLnJlc3VsdCk7XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2FsZXNjZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByZXNzaW9uLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoYXJnKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0ZXAgfHwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEludGVycG9sYXRlKSAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0IGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmXG4gICAgICAgIGV4cHJlc3Npb24uaW5wdXQubmFtZSA9PT0gJ3pvb20nKSB7XG5cbiAgICAgICAgcmVzdWx0ID0gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZFpvb21DdXJ2ZShjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZFJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2hpbGRSZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdCAmJiBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgJiYgY2hpbGRSZXN1bHQgJiYgcmVzdWx0ICE9PSBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ09ubHkgb25lIHpvb20tYmFzZWQgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIHN1YmV4cHJlc3Npb24gbWF5IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW1wb3J0IHtDb2xvclR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIEJvb2xlYW5UeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlLCBhcnJheX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmZ1bmN0aW9uIGdldEV4cGVjdGVkVHlwZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFR5cGUge1xuICAgIGNvbnN0IHR5cGVzID0ge1xuICAgICAgICBjb2xvcjogQ29sb3JUeXBlLFxuICAgICAgICBzdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICAgICAgZW51bTogU3RyaW5nVHlwZSxcbiAgICAgICAgYm9vbGVhbjogQm9vbGVhblR5cGUsXG4gICAgICAgIGZvcm1hdHRlZDogRm9ybWF0dGVkVHlwZSxcbiAgICAgICAgcmVzb2x2ZWRJbWFnZTogUmVzb2x2ZWRJbWFnZVR5cGVcbiAgICB9O1xuXG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gYXJyYXkodHlwZXNbc3BlYy52YWx1ZV0gfHwgVmFsdWVUeXBlLCBzcGVjLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzW3NwZWMudHlwZV07XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFZhbHVlIHtcbiAgICBpZiAoc3BlYy50eXBlID09PSAnY29sb3InICYmIGlzRnVuY3Rpb24oc3BlYy5kZWZhdWx0KSkge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGhlYXRtYXAtY29sb3I6IGl0IHVzZXMgdGhlICdkZWZhdWx0OicgdG8gZGVmaW5lIGFcbiAgICAgICAgLy8gZGVmYXVsdCBjb2xvciByYW1wLCBidXQgY3JlYXRlRXhwcmVzc2lvbiBleHBlY3RzIGEgc2ltcGxlIHZhbHVlIHRvIGZhbGxcbiAgICAgICAgLy8gYmFjayB0byBpbiBjYXNlIG9mIHJ1bnRpbWUgZXJyb3JzXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIGlmIChzcGVjLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnBhcnNlKHNwZWMuZGVmYXVsdCkgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNwZWMuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzcGVjLmRlZmF1bHQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY29udmVydEZ1bmN0aW9uO1xuXG5mdW5jdGlvbiBjb252ZXJ0TGl0ZXJhbCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gWydsaXRlcmFsJywgdmFsdWVdIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGdW5jdGlvbihwYXJhbWV0ZXJzOiBhbnksIHByb3BlcnR5U3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICBsZXQgc3RvcHMgPSBwYXJhbWV0ZXJzLnN0b3BzO1xuICAgIGlmICghc3RvcHMpIHtcbiAgICAgICAgLy8gaWRlbnRpdHkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRJZGVudGl0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBzdG9wcyAmJiB0eXBlb2Ygc3RvcHNbMF1bMF0gPT09ICdvYmplY3QnO1xuICAgIGNvbnN0IGZlYXR1cmVEZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCBwYXJhbWV0ZXJzLnByb3BlcnR5ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgem9vbURlcGVuZGVudCA9IHpvb21BbmRGZWF0dXJlRGVwZW5kZW50IHx8ICFmZWF0dXJlRGVwZW5kZW50O1xuXG4gICAgc3RvcHMgPSBzdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgaWYgKCFmZWF0dXJlRGVwZW5kZW50ICYmIHByb3BlcnR5U3BlYy50b2tlbnMgJiYgdHlwZW9mIHN0b3BbMV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIGNvbnZlcnRUb2tlblN0cmluZyhzdG9wWzFdKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtzdG9wWzBdLCBjb252ZXJ0TGl0ZXJhbChzdG9wWzFdKV07XG4gICAgfSk7XG5cbiAgICBpZiAoem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRab29tQW5kUHJvcGVydHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHN0b3BzKTtcbiAgICB9IGVsc2UgaWYgKHpvb21EZXBlbmRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRab29tRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBzdG9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgc3RvcHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydElkZW50aXR5RnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICBjb25zdCBnZXQgPSBbJ2dldCcsIHBhcmFtZXRlcnMucHJvcGVydHldO1xuXG4gICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGV4cHJlc3Npb25zIGZvciBzdHJpbmctdmFsdWVkIHByb3BlcnRpZXMgZ2V0IGNvZXJjZWQuIFRvIHByZXNlcnZlXG4gICAgICAgIC8vIGxlZ2FjeSBmdW5jdGlvbiBzZW1hbnRpY3MsIGluc2VydCBhbiBleHBsaWNpdCBhc3NlcnRpb24gaW5zdGVhZC5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5U3BlYy50eXBlID09PSAnc3RyaW5nJyA/IFsnc3RyaW5nJywgZ2V0XSA6IGdldDtcbiAgICB9IGVsc2UgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnZW51bScpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdtYXRjaCcsXG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0eVNwZWMudmFsdWVzKSxcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdFxuICAgICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcicgPyAndG8tY29sb3InIDogcHJvcGVydHlTcGVjLnR5cGUsIGdldCwgY29udmVydExpdGVyYWwocGFyYW1ldGVycy5kZWZhdWx0KV07XG4gICAgICAgIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgZXhwcmVzc2lvbi5zcGxpY2UoMSwgMCwgcHJvcGVydHlTcGVjLnZhbHVlLCBwcm9wZXJ0eVNwZWMubGVuZ3RoIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJwb2xhdGVPcGVyYXRvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3dpdGNoIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UpIHtcbiAgICBjYXNlICdoY2wnOiByZXR1cm4gJ2ludGVycG9sYXRlLWhjbCc7XG4gICAgY2FzZSAnbGFiJzogcmV0dXJuICdpbnRlcnBvbGF0ZS1sYWInO1xuICAgIGRlZmF1bHQ6IHJldHVybiAnaW50ZXJwb2xhdGUnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFpvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgc3RvcHMpIHtcbiAgICBjb25zdCBmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzID0ge307XG4gICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSB7fTtcbiAgICBjb25zdCB6b29tU3RvcHMgPSBbXTtcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHN0b3BzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN0b3AgPSBzdG9wc1tzXTtcbiAgICAgICAgY29uc3Qgem9vbSA9IHN0b3BbMF0uem9vbTtcbiAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvblBhcmFtZXRlcnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uUGFyYW1ldGVyc1t6b29tXSA9IHtcbiAgICAgICAgICAgICAgICB6b29tLFxuICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcGFyYW1ldGVycy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBwYXJhbWV0ZXJzLmRlZmF1bHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHNbem9vbV0gPSBbXTtcbiAgICAgICAgICAgIHpvb21TdG9wcy5wdXNoKHpvb20pO1xuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVGdW5jdGlvblN0b3BzW3pvb21dLnB1c2goW3N0b3BbMF0udmFsdWUsIHN0b3BbMV1dKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciB0aGUgem9vbSBkaW1lbnNpb24gb2YgYSB6b29tLWFuZC1wcm9wZXJ0eVxuICAgIC8vIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgZGlyZWN0bHkgZnJvbSB0aGUgc3R5bGUgcHJvcGVydHkgc3BlY2lmaWNhdGlvblxuICAgIC8vIGZvciB3aGljaCBpdCdzIGJlaW5nIHVzZWQ6IGxpbmVhciBmb3IgaW50ZXJwb2xhdGFibGUgcHJvcGVydGllcywgc3RlcFxuICAgIC8vIG90aGVyd2lzZS5cbiAgICBjb25zdCBmdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUoe30sIHByb3BlcnR5U3BlYyk7XG4gICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gW2dldEludGVycG9sYXRlT3BlcmF0b3IocGFyYW1ldGVycyksIFsnbGluZWFyJ10sIFsnem9vbSddXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygem9vbVN0b3BzKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBjb252ZXJ0UHJvcGVydHlGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzW3pdLCBwcm9wZXJ0eVNwZWMsIGZlYXR1cmVGdW5jdGlvblN0b3BzW3pdKTtcbiAgICAgICAgICAgIGFwcGVuZFN0b3BQYWlyKGV4cHJlc3Npb24sIHosIG91dHB1dCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFsnc3RlcCcsIFsnem9vbSddXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygem9vbVN0b3BzKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBjb252ZXJ0UHJvcGVydHlGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25QYXJhbWV0ZXJzW3pdLCBwcm9wZXJ0eVNwZWMsIGZlYXR1cmVGdW5jdGlvblN0b3BzW3pdKTtcbiAgICAgICAgICAgIGFwcGVuZFN0b3BQYWlyKGV4cHJlc3Npb24sIHosIG91dHB1dCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmaXh1cERlZ2VuZXJhdGVTdGVwQ3VydmUoZXhwcmVzc2lvbik7XG5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZShhLCBiKSB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGE7XG4gICAgaWYgKGIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGI7XG59XG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGNvbnZlcnRMaXRlcmFsKGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpKTtcblxuICAgIC8qXG4gICAgICogU29tZSBmaWVsZHMgd2l0aCB0eXBlOiByZXNvbHZlZEltYWdlIGhhdmUgYW4gdW5kZWZpbmVkIGRlZmF1bHQuXG4gICAgICogQmVjYXVzZSB1bmRlZmluZWQgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgcmVzb2x2ZWRJbWFnZSwgc2V0IGZhbGxiYWNrIHRvXG4gICAgICogYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgdW5kZWZpbmVkIHRvIGVuc3VyZSBvdXRwdXRcbiAgICAgKiBwYXNzZXMgdmFsaWRhdGlvbi5cbiAgICAgKi9cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdyZXNvbHZlZEltYWdlJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgc3RvcHMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0RnVuY3Rpb25UeXBlKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYyk7XG4gICAgY29uc3QgZ2V0ID0gWydnZXQnLCBwYXJhbWV0ZXJzLnByb3BlcnR5XTtcbiAgICBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlb2Ygc3RvcHNbMF1bMF0gPT09ICdib29sZWFuJykge1xuICAgICAgICBhc3NlcnQocGFyYW1ldGVycy5zdG9wcy5sZW5ndGggPiAwICYmIHBhcmFtZXRlcnMuc3RvcHMubGVuZ3RoIDw9IDIpO1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gWydjYXNlJ107XG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wcykge1xuICAgICAgICAgICAgZXhwcmVzc2lvbi5wdXNoKFsnPT0nLCBnZXQsIHN0b3BbMF1dLCBzdG9wWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb24ucHVzaChnZXRGYWxsYmFjayhwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpKTtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbJ21hdGNoJywgZ2V0XTtcbiAgICAgICAgZm9yIChjb25zdCBzdG9wIG9mIHN0b3BzKSB7XG4gICAgICAgICAgICBhcHBlbmRTdG9wUGFpcihleHByZXNzaW9uLCBzdG9wWzBdLCBzdG9wWzFdLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwcmVzc2lvbi5wdXNoKGdldEZhbGxiYWNrKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykpO1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFsnc3RlcCcsIFsnbnVtYmVyJywgZ2V0XV07XG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wcykge1xuICAgICAgICAgICAgYXBwZW5kU3RvcFBhaXIoZXhwcmVzc2lvbiwgc3RvcFswXSwgc3RvcFsxXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4dXBEZWdlbmVyYXRlU3RlcEN1cnZlKGV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5kZWZhdWx0ID09PSB1bmRlZmluZWQgPyBleHByZXNzaW9uIDogW1xuICAgICAgICAgICAgJ2Nhc2UnLFxuICAgICAgICAgICAgWyc9PScsIFsndHlwZW9mJywgZ2V0XSwgJ251bWJlciddLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGNvbnZlcnRMaXRlcmFsKHBhcmFtZXRlcnMuZGVmYXVsdClcbiAgICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFtcbiAgICAgICAgICAgIGdldEludGVycG9sYXRlT3BlcmF0b3IocGFyYW1ldGVycyksXG4gICAgICAgICAgICBiYXNlID09PSAxID8gW1wibGluZWFyXCJdIDogW1wiZXhwb25lbnRpYWxcIiwgYmFzZV0sXG4gICAgICAgICAgICBbXCJudW1iZXJcIiwgZ2V0XVxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wcykge1xuICAgICAgICAgICAgYXBwZW5kU3RvcFBhaXIoZXhwcmVzc2lvbiwgc3RvcFswXSwgc3RvcFsxXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmRlZmF1bHQgPT09IHVuZGVmaW5lZCA/IGV4cHJlc3Npb24gOiBbXG4gICAgICAgICAgICAnY2FzZScsXG4gICAgICAgICAgICBbJz09JywgWyd0eXBlb2YnLCBnZXRdLCAnbnVtYmVyJ10sXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgY29udmVydExpdGVyYWwocGFyYW1ldGVycy5kZWZhdWx0KVxuICAgICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9wZXJ0eSBmdW5jdGlvbiB0eXBlICR7dHlwZX1gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRab29tRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBzdG9wcywgaW5wdXQgPSBbJ3pvb20nXSkge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRGdW5jdGlvblR5cGUocGFyYW1ldGVycywgcHJvcGVydHlTcGVjKTtcbiAgICBsZXQgZXhwcmVzc2lvbjtcbiAgICBsZXQgaXNTdGVwID0gZmFsc2U7XG4gICAgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgZXhwcmVzc2lvbiA9IFsnc3RlcCcsIGlucHV0XTtcbiAgICAgICAgaXNTdGVwID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IFtnZXRJbnRlcnBvbGF0ZU9wZXJhdG9yKHBhcmFtZXRlcnMpLCBiYXNlID09PSAxID8gW1wibGluZWFyXCJdIDogW1wiZXhwb25lbnRpYWxcIiwgYmFzZV0sIGlucHV0XTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB6b29tIGZ1bmN0aW9uIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0b3Agb2Ygc3RvcHMpIHtcbiAgICAgICAgYXBwZW5kU3RvcFBhaXIoZXhwcmVzc2lvbiwgc3RvcFswXSwgc3RvcFsxXSwgaXNTdGVwKTtcbiAgICB9XG5cbiAgICBmaXh1cERlZ2VuZXJhdGVTdGVwQ3VydmUoZXhwcmVzc2lvbik7XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gZml4dXBEZWdlbmVyYXRlU3RlcEN1cnZlKGV4cHJlc3Npb24pIHtcbiAgICAvLyBkZWdlbmVyYXRlIHN0ZXAgY3VydmUgKGkuZS4gYSBjb25zdGFudCBmdW5jdGlvbik6IGFkZCBhIG5vb3Agc3RvcFxuICAgIGlmIChleHByZXNzaW9uWzBdID09PSAnc3RlcCcgJiYgZXhwcmVzc2lvbi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgZXhwcmVzc2lvbi5wdXNoKDApO1xuICAgICAgICBleHByZXNzaW9uLnB1c2goZXhwcmVzc2lvblszXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRTdG9wUGFpcihjdXJ2ZSwgaW5wdXQsIG91dHB1dCwgaXNTdGVwKSB7XG4gICAgLy8gU2tpcCBkdXBsaWNhdGUgc3RvcCB2YWx1ZXMuIFRoZXkgd2VyZSBub3QgdmFsaWRhdGVkIGZvciBmdW5jdGlvbnMsIGJ1dCB0aGV5IGFyZSBmb3IgZXhwcmVzc2lvbnMuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzQxMDdcbiAgICBpZiAoY3VydmUubGVuZ3RoID4gMyAmJiBpbnB1dCA9PT0gY3VydmVbY3VydmUubGVuZ3RoIC0gMl0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBzdGVwIGN1cnZlcyBkb24ndCBnZXQgdGhlIGZpcnN0IGlucHV0IHZhbHVlLCBhcyBpdCBpcyByZWR1bmRhbnQuXG4gICAgaWYgKCEoaXNTdGVwICYmIGN1cnZlLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgICAgY3VydmUucHVzaChpbnB1dCk7XG4gICAgfVxuICAgIGN1cnZlLnB1c2gob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gZ2V0RnVuY3Rpb25UeXBlKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykge1xuICAgIGlmIChwYXJhbWV0ZXJzLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMudHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQocHJvcGVydHlTcGVjLmV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gKHByb3BlcnR5U3BlYy5leHByZXNzaW9uOiBhbnkpLmludGVycG9sYXRlZCA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnO1xuICAgIH1cbn1cblxuLy8gXCJTdHJpbmcgd2l0aCB7bmFtZX0gdG9rZW5cIiA9PiBbXCJjb25jYXRcIiwgXCJTdHJpbmcgd2l0aCBcIiwgW1wiZ2V0XCIsIFwibmFtZVwiXSwgXCIgdG9rZW5cIl1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9rZW5TdHJpbmcoczogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gWydjb25jYXQnXTtcbiAgICBjb25zdCByZSA9IC97KFtee31dKyl9L2c7XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgZm9yIChsZXQgbWF0Y2ggPSByZS5leGVjKHMpOyBtYXRjaCAhPT0gbnVsbDsgbWF0Y2ggPSByZS5leGVjKHMpKSB7XG4gICAgICAgIGNvbnN0IGxpdGVyYWwgPSBzLnNsaWNlKHBvcywgcmUubGFzdEluZGV4IC0gbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgcG9zID0gcmUubGFzdEluZGV4O1xuICAgICAgICBpZiAobGl0ZXJhbC5sZW5ndGggPiAwKSByZXN1bHQucHVzaChsaXRlcmFsKTtcbiAgICAgICAgcmVzdWx0LnB1c2goWydnZXQnLCBtYXRjaFsxXV0pO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIGlmIChwb3MgPCBzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQucHVzaChzLnNsaWNlKHBvcykpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gWyd0by1zdHJpbmcnLCByZXN1bHRbMV1dO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7R2xvYmFsUHJvcGVydGllcywgRmVhdHVyZX0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbnR5cGUgRmlsdGVyRXhwcmVzc2lvbiA9IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGJvb2xlYW47XG5leHBvcnQgdHlwZSBGZWF0dXJlRmlsdGVyID17ZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uLCBuZWVkR2VvbWV0cnk6IGJvb2xlYW59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGaWx0ZXI7XG5leHBvcnQge2lzRXhwcmVzc2lvbkZpbHRlcn07XG5cbmZ1bmN0aW9uIGlzRXhwcmVzc2lvbkZpbHRlcihmaWx0ZXI6IGFueSkge1xuICAgIGlmIChmaWx0ZXIgPT09IHRydWUgfHwgZmlsdGVyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyKSB8fCBmaWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3dpdGNoIChmaWx0ZXJbMF0pIHtcbiAgICBjYXNlICdoYXMnOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA+PSAyICYmIGZpbHRlclsxXSAhPT0gJyRpZCcgJiYgZmlsdGVyWzFdICE9PSAnJHR5cGUnO1xuXG4gICAgY2FzZSAnaW4nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA+PSAzICYmICh0eXBlb2YgZmlsdGVyWzFdICE9PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGZpbHRlclsyXSkpO1xuXG4gICAgY2FzZSAnIWluJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCAhPT0gMyB8fCAoQXJyYXkuaXNBcnJheShmaWx0ZXJbMV0pIHx8IEFycmF5LmlzQXJyYXkoZmlsdGVyWzJdKSk7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGYpICYmIHR5cGVvZiBmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmNvbnN0IGZpbHRlclNwZWMgPSB7XG4gICAgJ3R5cGUnOiAnYm9vbGVhbicsXG4gICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAndHJhbnNpdGlvbic6IGZhbHNlLFxuICAgICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJyxcbiAgICAnZXhwcmVzc2lvbic6IHtcbiAgICAgICAgJ2ludGVycG9sYXRlZCc6IGZhbHNlLFxuICAgICAgICAncGFyYW1ldGVycyc6IFsnem9vbScsICdmZWF0dXJlJ11cbiAgICB9XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSk6IEZlYXR1cmVGaWx0ZXIge1xuICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6ICgpID0+IHRydWUsIG5lZWRHZW9tZXRyeTogZmFsc2V9O1xuICAgIH1cblxuICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gY29udmVydEZpbHRlcihmaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkID0gY3JlYXRlRXhwcmVzc2lvbihmaWx0ZXIsIGZpbHRlclNwZWMpO1xuICAgIGlmIChjb21waWxlZC5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gZ2VvbWV0cnlOZWVkZWQoZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGNvbXBpbGVkLnZhbHVlLmV2YWx1YXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgbmVlZEdlb21ldHJ5fTtcbiAgICB9XG59XG5cbi8vIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc29ydCBudW1iZXJzIGFuZCBzdHJpbmdzXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGdlb21ldHJ5TmVlZGVkKGZpbHRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGZpbHRlclswXSA9PT0gJ3dpdGhpbicpIHJldHVybiB0cnVlO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBmaWx0ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGlmIChnZW9tZXRyeU5lZWRlZChmaWx0ZXJbaW5kZXhdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29udmVydEZpbHRlcihmaWx0ZXI6ID9BcnJheTxhbnk+KTogbWl4ZWQge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBvcCA9IGZpbHRlclswXTtcbiAgICBpZiAoZmlsdGVyLmxlbmd0aCA8PSAxKSByZXR1cm4gKG9wICE9PSAnYW55Jyk7XG4gICAgY29uc3QgY29udmVydGVkID1cbiAgICAgICAgb3AgPT09ICc9PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSA6XG4gICAgICAgIG9wID09PSAnIT0nID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sICc9PScpKSA6XG4gICAgICAgIG9wID09PSAnPCcgfHxcbiAgICAgICAgb3AgPT09ICc+JyB8fFxuICAgICAgICBvcCA9PT0gJzw9JyB8fFxuICAgICAgICBvcCA9PT0gJz49JyA/IGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sIG9wKSA6XG4gICAgICAgIG9wID09PSAnYW55JyA/IGNvbnZlcnREaXNqdW5jdGlvbk9wKGZpbHRlci5zbGljZSgxKSkgOlxuICAgICAgICBvcCA9PT0gJ2FsbCcgPyBbJ2FsbCddLmNvbmNhdChmaWx0ZXIuc2xpY2UoMSkubWFwKGNvbnZlcnRGaWx0ZXIpKSA6XG4gICAgICAgIG9wID09PSAnbm9uZScgPyBbJ2FsbCddLmNvbmNhdChmaWx0ZXIuc2xpY2UoMSkubWFwKGNvbnZlcnRGaWx0ZXIpLm1hcChjb252ZXJ0TmVnYXRpb24pKSA6XG4gICAgICAgIG9wID09PSAnaW4nID8gY29udmVydEluT3AoZmlsdGVyWzFdLCBmaWx0ZXIuc2xpY2UoMikpIDpcbiAgICAgICAgb3AgPT09ICchaW4nID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSkgOlxuICAgICAgICBvcCA9PT0gJ2hhcycgPyBjb252ZXJ0SGFzT3AoZmlsdGVyWzFdKSA6XG4gICAgICAgIG9wID09PSAnIWhhcycgPyBjb252ZXJ0TmVnYXRpb24oY29udmVydEhhc09wKGZpbHRlclsxXSkpIDpcbiAgICAgICAgb3AgPT09ICd3aXRoaW4nID8gZmlsdGVyIDpcbiAgICAgICAgdHJ1ZTtcbiAgICByZXR1cm4gY29udmVydGVkO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q29tcGFyaXNvbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItdHlwZS0ke29wfWAsIHZhbHVlXTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaWQtJHtvcH1gLCB2YWx1ZV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLSR7b3B9YCwgcHJvcGVydHksIHZhbHVlXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREaXNqdW5jdGlvbk9wKGZpbHRlcnM6IEFycmF5PEFycmF5PGFueT4+KSB7XG4gICAgcmV0dXJuIFsnYW55J10uY29uY2F0KGZpbHRlcnMubWFwKGNvbnZlcnRGaWx0ZXIpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydEluT3AocHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBBcnJheTxhbnk+KSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtaW5gLCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaWQtaW5gLCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDIwMCAmJiAhdmFsdWVzLnNvbWUodiA9PiB0eXBlb2YgdiAhPT0gdHlwZW9mIHZhbHVlc1swXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1sYXJnZScsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXMuc29ydChjb21wYXJlKV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFsnZmlsdGVyLWluLXNtYWxsJywgcHJvcGVydHksIFsnbGl0ZXJhbCcsIHZhbHVlc11dO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0SGFzT3AocHJvcGVydHk6IHN0cmluZykge1xuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJyRpZCc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci1oYXMtaWRgXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzYCwgcHJvcGVydHldO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydE5lZ2F0aW9uKGZpbHRlcjogbWl4ZWQpIHtcbiAgICByZXR1cm4gWychJywgZmlsdGVyXTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7aXNFeHByZXNzaW9uRmlsdGVyfSBmcm9tICcuL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb259IGZyb20gJy4uL3R5cGVzLmpzJztcblxudHlwZSBFeHBlY3RlZFR5cGVzID0ge1tfOiBzdHJpbmddOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nfTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBsZWdhY3kgZmlsdGVyIHRvICh0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZikgYW5cbiAqIGVxdWl2YWxlbnQgZXhwcmVzc2lvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udmVydEZpbHRlcihmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24pOiBtaXhlZCB7XG4gICAgcmV0dXJuIF9jb252ZXJ0RmlsdGVyKGZpbHRlciwge30pO1xufVxuXG4vKlxuICogQ29udmVydCB0aGUgZ2l2ZW4gZmlsdGVyIHRvIGFuIGV4cHJlc3Npb24sIHN0b3JpbmcgdGhlIGV4cGVjdGVkIHR5cGVzIGZvclxuICogYW55IGZlYXR1cmUgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIGV4cGVjdGVkVHlwZXMuXG4gKlxuICogVGhlc2UgZXhwZWN0ZWQgdHlwZXMgYXJlIG5lZWRlZCBpbiBvcmRlciB0byBjb25zdHJ1Y3QgcHJlZmxpZ2h0IHR5cGUgY2hlY2tzXG4gKiBuZWVkZWQgZm9yIGhhbmRsaW5nICdhbnknIGZpbHRlcnMuIEEgcHJlZmxpZ2h0IHR5cGUgY2hlY2sgaXMgbmVjZXNzYXJ5IGluXG4gKiBvcmRlciB0byBtaW1pYyBsZWdhY3kgZmlsdGVycycgc2VtYW50aWNzIGFyb3VuZCBleHBlY3RlZCB0eXBlIG1pc21hdGNoZXMuXG4gKiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGxlZ2FjeSBmaWx0ZXI6XG4gKlxuICogICAgIFtcImFueVwiLCBbXCJhbGxcIiwgW1wiPlwiLCBcInlcIiwgMF0sIFtcIj5cIiwgXCJ5XCIsIDBdXSwgW1wiPlwiLCBcInhcIiwgMF1dXG4gKlxuICogTmFpdmVseSwgd2UgbWlnaHQgY29udmVydCB0aGlzIHRvIHRoZSBleHByZXNzaW9uOlxuICpcbiAqICAgICBbXCJhbnlcIiwgW1wiYWxsXCIsIFtcIj5cIiwgW1wiZ2V0XCIsIFwieVwiXSwgMF0sIFtcIj5cIiwgW1wiZ2V0XCIsIFwielwiXSwgMF1dLCBbXCI+XCIsIFtcImdldFwiLCBcInhcIl0sIDBdXVxuICpcbiAqIEJ1dCBpZiB3ZSB0cmllZCB0byBldmFsdWF0ZSB0aGlzIGFnYWluc3QsIHNheSBge3g6IDEsIHk6IG51bGwsIHo6IDB9YCwgdGhlXG4gKiBbXCI+XCIsIFtcImdldFwiLCBcInlcIl0sIDBdIHdvdWxkIGNhdXNlIGFuIGV2YWx1YXRpb24gZXJyb3IsIGxlYWRpbmcgdG8gdGhlXG4gKiBlbnRpcmUgZmlsdGVyIHJldHVybmluZyBmYWxzZS4gTGVnYWN5IGZpbHRlciBzZW1hbnRpY3MsIHRob3VnaCwgYXNrIGZvclxuICogW1wiPlwiLCBcInlcIiwgMF0gdG8gc2ltcGx5IHJldHVybiBgZmFsc2VgIHdoZW4gYHlgIGlzIG9mIHRoZSB3cm9uZyB0eXBlLFxuICogYWxsb3dpbmcgdGhlIHN1YnNlcXVlbnQgdGVybXMgb2YgdGhlIG91dGVyIFwiYW55XCIgZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWRcbiAqIChyZXN1bHRpbmcsIGluIHRoaXMgY2FzZSwgaW4gYSBgdHJ1ZWAgdmFsdWUsIGJlY2F1c2UgeCA+IDApLlxuICpcbiAqIFdlIGFjY291bnQgZm9yIHRoaXMgYnkgaW5zZXJ0aW5nIGEgcHJlZmxpZ2h0IHR5cGUtY2hlY2tpbmcgZXhwcmVzc2lvbiBiZWZvcmVcbiAqIGVhY2ggXCJhbnlcIiB0ZXJtLCBhbGxvd2luZyB1cyB0byBhdm9pZCBldmFsdWF0aW5nIHRoZSBhY3R1YWwgY29udmVydGVkIGZpbHRlclxuICogaWYgYW55IHR5cGUgbWlzbWF0Y2hlcyB3b3VsZCBjYXVzZSBpdCB0byBwcm9kdWNlIGFuIGV2YWxhdXRpb24gZXJyb3I6XG4gKlxuICogICAgIFtcImFueVwiLFxuICogICAgICAgW1wiY2FzZVwiLFxuICogICAgICAgICBbXCJhbGxcIiwgW1wiPT1cIiwgW1widHlwZW9mXCIsIFtcImdldFwiLCBcInlcIl1dLCBcIm51bWJlclwiXSwgW1wiPT1cIiwgW1widHlwZW9mXCIsIFtcImdldFwiLCBcInpcIl0sIFwibnVtYmVyXV0sXG4gKiAgICAgICAgIFtcImFsbFwiLCBbXCI+XCIsIFtcImdldFwiLCBcInlcIl0sIDBdLCBbXCI+XCIsIFtcImdldFwiLCBcInpcIl0sIDBdXSxcbiAqICAgICAgICAgZmFsc2VcbiAqICAgICAgIF0sXG4gKiAgICAgICBbXCJjYXNlXCIsXG4gKiAgICAgICAgIFtcIj09XCIsIFtcInR5cGVvZlwiLCBbXCJnZXRcIiwgXCJ4XCJdLCBcIm51bWJlclwiXV0sXG4gKiAgICAgICAgIFtcIj5cIiwgW1wiZ2V0XCIsIFwieFwiXSwgMF0sXG4gKiAgICAgICAgIGZhbHNlXG4gKiAgICAgICBdXG4gKiAgICAgXVxuICpcbiAqIEFuIGFsdGVybmF0aXZlLCBwb3NzaWJseSBtb3JlIGRpcmVjdCBhcHByb2FjaCB3b3VsZCBiZSB0byB1c2UgdHlwZSBjaGVja3NcbiAqIGluIHRoZSBjb252ZXJzaW9uIG9mIGVhY2ggY29tcGFyaXNvbiBvcGVyYXRvciwgc28gdGhhdCB0aGUgY29udmVydGVkIHZlcnNpb25cbiAqIG9mIGVhY2ggaW5kaXZpZHVhbCA9PSwgPj0sIGV0Yy4gd291bGQgbWltaWMgdGhlIGxlZ2FjeSBmaWx0ZXIgc2VtYW50aWNzLiBUaGVcbiAqIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBpdCBjYW4gbGVhZCB0byBtYW55IG1vcmUgdHlwZSBjaGVja3MgdGhhblxuICogd291bGQgb3RoZXJ3aXNlIGJlIG5lY2Vzc2FyeTogb3V0c2lkZSB0aGUgY29udGV4dCBvZiBhbiBcImFueVwiIGV4cHJlc3Npb24sXG4gKiBiYWlsaW5nIG91dCBkdWUgdG8gYSBydW50aW1lIHR5cGUgZXJyb3IgKGV4cHJlc3Npb24gc2VtYW50aWNzKSBhbmQgcmV0dXJuaW5nXG4gKiBmYWxzZSAobGVnYWN5IGZpbHRlciBzZW1hbnRpY3MpIGFyZSBlcXVpdmFsZW50OiB0aGV5IGNhdXNlIHRoZSBmaWx0ZXIgdG9cbiAqIHByb2R1Y2UgYSBgZmFsc2VgIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gX2NvbnZlcnRGaWx0ZXIoZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLCBleHBlY3RlZFR5cGVzOiBFeHBlY3RlZFR5cGVzKTogbWl4ZWQge1xuICAgIGlmIChpc0V4cHJlc3Npb25GaWx0ZXIoZmlsdGVyKSkgeyByZXR1cm4gZmlsdGVyOyB9XG5cbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBmaWx0ZXJbMF07XG4gICAgaWYgKGZpbHRlci5sZW5ndGggPD0gMSkgcmV0dXJuIChvcCAhPT0gJ2FueScpO1xuXG4gICAgbGV0IGNvbnZlcnRlZDtcblxuICAgIGlmIChcbiAgICAgICAgb3AgPT09ICc9PScgfHxcbiAgICAgICAgb3AgPT09ICchPScgfHxcbiAgICAgICAgb3AgPT09ICc8JyB8fFxuICAgICAgICBvcCA9PT0gJz4nIHx8XG4gICAgICAgIG9wID09PSAnPD0nIHx8XG4gICAgICAgIG9wID09PSAnPj0nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IFssIHByb3BlcnR5LCB2YWx1ZV0gPSAoZmlsdGVyOiBhbnkpO1xuICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0Q29tcGFyaXNvbk9wKHByb3BlcnR5LCB2YWx1ZSwgb3AsIGV4cGVjdGVkVHlwZXMpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICdhbnknKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGZpbHRlcjogYW55KS5zbGljZSgxKS5tYXAoZiA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBfY29udmVydEZpbHRlcihmLCB0eXBlcyk7XG4gICAgICAgICAgICBjb25zdCB0eXBlY2hlY2tzID0gcnVudGltZVR5cGVDaGVja3ModHlwZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVjaGVja3MgPT09IHRydWUgPyBjaGlsZCA6IFsnY2FzZScsIHR5cGVjaGVja3MsIGNoaWxkLCBmYWxzZV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gWydhbnknXS5jb25jYXQoY2hpbGRyZW4pO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICdhbGwnKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGZpbHRlcjogYW55KS5zbGljZSgxKS5tYXAoZiA9PiBfY29udmVydEZpbHRlcihmLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5sZW5ndGggPiAxID8gWydhbGwnXS5jb25jYXQoY2hpbGRyZW4pIDogW10uY29uY2F0KC4uLmNoaWxkcmVuKTtcbiAgICB9IGVsc2UgaWYgKG9wID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIFsnIScsIF9jb252ZXJ0RmlsdGVyKFsnYW55J10uY29uY2F0KGZpbHRlci5zbGljZSgxKSksIHt9KV07XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gJ2luJykge1xuICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0SW5PcCgoZmlsdGVyWzFdOiBhbnkpLCBmaWx0ZXIuc2xpY2UoMikpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICchaW4nKSB7XG4gICAgICAgIGNvbnZlcnRlZCA9IGNvbnZlcnRJbk9wKChmaWx0ZXJbMV06IGFueSksIGZpbHRlci5zbGljZSgyKSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gJ2hhcycpIHtcbiAgICAgICAgY29udmVydGVkID0gY29udmVydEhhc09wKChmaWx0ZXJbMV06IGFueSkpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICchaGFzJykge1xuICAgICAgICBjb252ZXJ0ZWQgPSBbJyEnLCBjb252ZXJ0SGFzT3AoKGZpbHRlclsxXTogYW55KSldO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnZlcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuLy8gR2l2ZW4gYSBzZXQgb2YgZmVhdHVyZSBwcm9wZXJ0aWVzIGFuZCBhbiBleHBlY3RlZCB0eXBlIGZvciBlYWNoIG9uZSxcbi8vIGNvbnN0cnVjdCBhbiBib29sZWFuIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGVhY2ggcHJvcGVydHkgaGFzIHRoZVxuLy8gcmlnaHQgdHlwZS5cbi8vIEUuZy46IGZvciB7bmFtZTogJ3N0cmluZycsIHBvcHVsYXRpb246ICdudW1iZXInfSwgcmV0dXJuXG4vLyBbICdhbGwnLFxuLy8gICBbJz09JywgWyd0eXBlb2YnLCBbJ2dldCcsICduYW1lJ10sICdzdHJpbmcnXV0sXG4vLyAgIFsnPT0nLCBbJ3R5cGVvZicsIFsnZ2V0JywgJ3BvcHVsYXRpb24nXSwgJ251bWJlcl1dXG4vLyBdXG5mdW5jdGlvbiBydW50aW1lVHlwZUNoZWNrcyhleHBlY3RlZFR5cGVzOiBFeHBlY3RlZFR5cGVzKSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZXhwZWN0ZWRUeXBlcykge1xuICAgICAgICBjb25zdCBnZXQgPSBwcm9wZXJ0eSA9PT0gJyRpZCcgPyBbJ2lkJ10gOiBbJ2dldCcsIHByb3BlcnR5XTtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKFsnPT0nLCBbJ3R5cGVvZicsIGdldF0sIGV4cGVjdGVkVHlwZXNbcHJvcGVydHldXSk7XG4gICAgfVxuICAgIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSByZXR1cm4gY29uZGl0aW9uc1swXTtcbiAgICByZXR1cm4gWydhbGwnXS5jb25jYXQoY29uZGl0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDb21wYXJpc29uT3AocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSwgb3A6IHN0cmluZywgZXhwZWN0ZWRUeXBlczogP0V4cGVjdGVkVHlwZXMpIHtcbiAgICBsZXQgZ2V0O1xuICAgIGlmIChwcm9wZXJ0eSA9PT0gJyR0eXBlJykge1xuICAgICAgICByZXR1cm4gW29wLCBbJ2dlb21ldHJ5LXR5cGUnXSwgdmFsdWVdO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICckaWQnKSB7XG4gICAgICAgIGdldCA9IFsnaWQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnZXQgPSBbJ2dldCcsIHByb3BlcnR5XTtcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0ZWRUeXBlcyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0eXBlID0gKCh0eXBlb2YgdmFsdWUpOiBhbnkpO1xuICAgICAgICBleHBlY3RlZFR5cGVzW3Byb3BlcnR5XSA9IHR5cGU7XG4gICAgfVxuXG4gICAgaWYgKG9wID09PSAnPT0nICYmIHByb3BlcnR5ICE9PSAnJGlkJyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2FsbCcsXG4gICAgICAgICAgICBbJ2hhcycsIHByb3BlcnR5XSwgLy8gbWlzc2luZyBwcm9wZXJ0eSAhPSBudWxsIGZvciBsZWdhY3kgZmlsdGVyc1xuICAgICAgICAgICAgWyc9PScsIGdldCwgbnVsbF1cbiAgICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKG9wID09PSAnIT0nICYmIHByb3BlcnR5ICE9PSAnJGlkJyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2FueScsXG4gICAgICAgICAgICBbJyEnLCBbJ2hhcycsIHByb3BlcnR5XV0sIC8vIG1pc3NpbmcgcHJvcGVydHkgIT0gbnVsbCBmb3IgbGVnYWN5IGZpbHRlcnNcbiAgICAgICAgICAgIFsnIT0nLCBnZXQsIG51bGxdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtvcCwgZ2V0LCB2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogQXJyYXk8YW55PiwgbmVnYXRlID0gZmFsc2UpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5lZ2F0ZTtcblxuICAgIGxldCBnZXQ7XG4gICAgaWYgKHByb3BlcnR5ID09PSAnJHR5cGUnKSB7XG4gICAgICAgIGdldCA9IFsnZ2VvbWV0cnktdHlwZSddO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICckaWQnKSB7XG4gICAgICAgIGdldCA9IFsnaWQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnZXQgPSBbJ2dldCcsIHByb3BlcnR5XTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGxpc3Qgb2YgdmFsdWVzIHRvIGJlIHNlYXJjaGVkIGlzIGhvbW9nZW5vdXNseSB0eXBlZC5cbiAgICAvLyBJZiBzbyAoYW5kIGlmIHRoZSB0eXBlIGlzIHN0cmluZyBvciBudW1iZXIpLCB0aGVuIHdlIGNhbiB1c2UgYVxuICAgIC8vIFttYXRjaCwgaW5wdXQsIFsuLi52YWx1ZXNdLCB0cnVlLCBmYWxzZV0gY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIGFcbiAgICAvLyBidW5jaCBvZiBgPT1gIHRlc3RzLlxuICAgIGxldCB1bmlmb3JtVHlwZXMgPSB0cnVlO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIHVuaWZvcm1UeXBlcyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5pZm9ybVR5cGVzICYmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgLy8gTWF0Y2ggZXhwcmVzc2lvbnMgbXVzdCBoYXZlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICAgIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IHZhbHVlcy5zb3J0KCkuZmlsdGVyKCh2LCBpKSA9PiBpID09PSAwIHx8IHZhbHVlc1tpIC0gMV0gIT09IHYpO1xuICAgICAgICByZXR1cm4gWydtYXRjaCcsIGdldCwgdW5pcXVlVmFsdWVzLCAhbmVnYXRlLCBuZWdhdGVdO1xuICAgIH1cblxuICAgIHJldHVybiBbIG5lZ2F0ZSA/ICdhbGwnIDogJ2FueScgXS5jb25jYXQoXG4gICAgICAgIHZhbHVlcy5tYXAodiA9PiBbbmVnYXRlID8gJyE9JyA6ICc9PScsIGdldCwgdl0pXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gY29udmVydEhhc09wKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvcGVydHkgPT09ICckdHlwZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PT0gJyRpZCcpIHtcbiAgICAgICAgcmV0dXJuIFsnIT0nLCBbJ2lkJ10sIG51bGxdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbJ2hhcycsIHByb3BlcnR5XTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGVhY2hMYXllcixcbiAgICBlYWNoUHJvcGVydHlcbn0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IGNvbnZlcnRGdW5jdGlvbiwge2NvbnZlcnRUb2tlblN0cmluZ30gZnJvbSAnLi4vZnVuY3Rpb24vY29udmVydC5qcyc7XG5pbXBvcnQgY29udmVydEZpbHRlciBmcm9tICcuLi9mZWF0dXJlX2ZpbHRlci9jb252ZXJ0LmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIE1pZ3JhdGUgdGhlIGdpdmVuIHN0eWxlIG9iamVjdCBpbiBwbGFjZSB0byB1c2UgZXhwcmVzc2lvbnMuIFNwZWNpZmljYWxseSxcbiAqIHRoaXMgd2lsbCBjb252ZXJ0IChhKSBcInN0b3BcIiBmdW5jdGlvbnMsIGFuZCAoYikgbGVnYWN5IGZpbHRlcnMgdG8gdGhlaXJcbiAqIGV4cHJlc3Npb24gZXF1aXZhbGVudHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24pIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBbXTtcblxuICAgIGVhY2hMYXllcihzdHlsZSwgKGxheWVyKSA9PiB7XG4gICAgICAgIGlmIChsYXllci5maWx0ZXIpIHtcbiAgICAgICAgICAgIGxheWVyLmZpbHRlciA9IChjb252ZXJ0RmlsdGVyKGxheWVyLmZpbHRlcik6IGFueSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVhY2hQcm9wZXJ0eShzdHlsZSwge3BhaW50OiB0cnVlLCBsYXlvdXQ6IHRydWV9LCAoe3BhdGgsIHZhbHVlLCByZWZlcmVuY2UsIHNldH0pID0+IHtcbiAgICAgICAgaWYgKGlzRXhwcmVzc2lvbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBzZXQoY29udmVydEZ1bmN0aW9uKHZhbHVlLCByZWZlcmVuY2UpKTtcbiAgICAgICAgICAgIGNvbnZlcnRlZC5wdXNoKHBhdGguam9pbignLicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2UudG9rZW5zICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNldChjb252ZXJ0VG9rZW5TdHJpbmcodmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0eWxlO1xufVxuXG4iLCJcbmltcG9ydCBtaWdyYXRlVG9WOCBmcm9tICcuL21pZ3JhdGUvdjguanMnO1xuaW1wb3J0IG1pZ3JhdGVUb0V4cHJlc3Npb25zIGZyb20gJy4vbWlncmF0ZS9leHByZXNzaW9ucy5qcyc7XG5cbi8qKlxuICogTWlncmF0ZSBhIE1hcGJveCBHTCBTdHlsZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBhbGlhcyBtaWdyYXRlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGUgYSBNYXBib3ggR0wgU3R5bGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IGEgbWlncmF0ZWQgc3R5bGVcbiAqIEBleGFtcGxlXG4gKiB2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuICogdmFyIG1pZ3JhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYycpLm1pZ3JhdGU7XG4gKiB2YXIgc3R5bGUgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc3R5bGUuanNvbicsICd1dGY4Jyk7XG4gKiBmcy53cml0ZUZpbGVTeW5jKCcuL3N0eWxlLmpzb24nLCBKU09OLnN0cmluZ2lmeShtaWdyYXRlKHN0eWxlKSkpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHlsZSkge1xuICAgIGxldCBtaWdyYXRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHN0eWxlLnZlcnNpb24gPT09IDcpIHtcbiAgICAgICAgc3R5bGUgPSBtaWdyYXRlVG9WOChzdHlsZSk7XG4gICAgICAgIG1pZ3JhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3R5bGUudmVyc2lvbiA9PT0gOCkge1xuICAgICAgICBtaWdyYXRlZCA9IG1pZ3JhdGVUb0V4cHJlc3Npb25zKHN0eWxlKTtcbiAgICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghbWlncmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgbWlncmF0ZSBmcm9tJywgc3R5bGUudmVyc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICBjb25zdCBzdHlsZUlEcyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZUlEcyA9IFtdO1xuICAgIGNvbnN0IGNvbXBvc2l0ZWRTb3VyY2VMYXllcnMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaWQgaW4gc3R5bGUuc291cmNlcykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzW2lkXTtcblxuICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09IFwidmVjdG9yXCIpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IC9ebWFwYm94OlxcL1xcLyguKikvLmV4ZWMoc291cmNlLnVybCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBzdHlsZUlEcy5wdXNoKGlkKTtcbiAgICAgICAgc291cmNlSURzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIGlmIChzdHlsZUlEcy5sZW5ndGggPCAyKVxuICAgICAgICByZXR1cm4gc3R5bGU7XG5cbiAgICBzdHlsZUlEcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBkZWxldGUgc3R5bGUuc291cmNlc1tpZF07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wb3NpdGVJRCA9IHNvdXJjZUlEcy5qb2luKFwiLFwiKTtcblxuICAgIHN0eWxlLnNvdXJjZXNbY29tcG9zaXRlSURdID0ge1xuICAgICAgICBcInR5cGVcIjogXCJ2ZWN0b3JcIixcbiAgICAgICAgXCJ1cmxcIjogYG1hcGJveDovLyR7Y29tcG9zaXRlSUR9YFxuICAgIH07XG5cbiAgICBzdHlsZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgaWYgKHN0eWxlSURzLmluZGV4T2YobGF5ZXIuc291cmNlKSA+PSAwKSB7XG4gICAgICAgICAgICBsYXllci5zb3VyY2UgPSBjb21wb3NpdGVJRDtcblxuICAgICAgICAgICAgaWYgKCdzb3VyY2UtbGF5ZXInIGluIGxheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZWRTb3VyY2VMYXllcnMuaW5kZXhPZihsYXllclsnc291cmNlLWxheWVyJ10pID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBzb3VyY2UgbGF5ZXIgbmFtZXMnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVkU291cmNlTGF5ZXJzLnB1c2gobGF5ZXJbJ3NvdXJjZS1sYXllciddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzdHlsZTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJywgJ2ZpbHRlcicsICdsYXlvdXQnXTtcbiIsIlxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzJztcblxuZnVuY3Rpb24gZGVyZWYobGF5ZXIsIHBhcmVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIGxheWVyKSB7XG4gICAgICAgIGlmIChrICE9PSAncmVmJykge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gbGF5ZXJba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZQcm9wZXJ0aWVzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgaWYgKGsgaW4gcGFyZW50KSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBwYXJlbnRba107XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlcmVmTGF5ZXJzO1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgc29tZSBvZiB3aGljaCBtYXkgY29udGFpbiBgcmVmYCBwcm9wZXJ0aWVzXG4gKiB3aG9zZSB2YWx1ZSBpcyB0aGUgYGlkYCBvZiBhbm90aGVyIHByb3BlcnR5LCByZXR1cm4gYSBuZXcgYXJyYXkgd2hlcmVcbiAqIHN1Y2ggbGF5ZXJzIGhhdmUgYmVlbiBhdWdtZW50ZWQgd2l0aCB0aGUgJ3R5cGUnLCAnc291cmNlJywgZXRjLiBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSBwYXJlbnQgbGF5ZXIsIGFuZCB0aGUgYHJlZmAgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnNcbiAqIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PExheWVyPn1cbiAqL1xuZnVuY3Rpb24gZGVyZWZMYXllcnMobGF5ZXJzKSB7XG4gICAgbGF5ZXJzID0gbGF5ZXJzLnNsaWNlKCk7XG5cbiAgICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcFtsYXllcnNbaV0uaWRdID0gbGF5ZXJzW2ldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgncmVmJyBpbiBsYXllcnNbaV0pIHtcbiAgICAgICAgICAgIGxheWVyc1tpXSA9IGRlcmVmKGxheWVyc1tpXSwgbWFwW2xheWVyc1tpXS5yZWZdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG59XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIERlZXBseSBjb21wYXJlcyB0d28gb2JqZWN0IGxpdGVyYWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChhOiA/bWl4ZWQsIGI6ID9taXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISh0eXBlb2YgYiA9PT0gJ29iamVjdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWVwRXF1YWw7XG4iLCJcbmltcG9ydCBpc0VxdWFsIGZyb20gJy4vdXRpbC9kZWVwX2VxdWFsLmpzJztcblxuY29uc3Qgb3BlcmF0aW9ucyA9IHtcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0U3R5bGUnLCBhcmdzOiBbc3R5bGVzaGVldF0gfVxuICAgICAqL1xuICAgIHNldFN0eWxlOiAnc2V0U3R5bGUnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdhZGRMYXllcicsIGFyZ3M6IFtsYXllciwgJ2JlZm9yZUxheWVySWQnXSB9XG4gICAgICovXG4gICAgYWRkTGF5ZXI6ICdhZGRMYXllcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3JlbW92ZUxheWVyJywgYXJnczogWydsYXllcklkJ10gfVxuICAgICAqL1xuICAgIHJlbW92ZUxheWVyOiAncmVtb3ZlTGF5ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRQYWludFByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldFBhaW50UHJvcGVydHk6ICdzZXRQYWludFByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5b3V0UHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6ICdzZXRMYXlvdXRQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEZpbHRlcicsIGFyZ3M6IFsnbGF5ZXJJZCcsIGZpbHRlcl0gfVxuICAgICAqL1xuICAgIHNldEZpbHRlcjogJ3NldEZpbHRlcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ2FkZFNvdXJjZScsIGFyZ3M6IFsnc291cmNlSWQnLCBzb3VyY2VdIH1cbiAgICAgKi9cbiAgICBhZGRTb3VyY2U6ICdhZGRTb3VyY2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdyZW1vdmVTb3VyY2UnLCBhcmdzOiBbJ3NvdXJjZUlkJ10gfVxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZTogJ3JlbW92ZVNvdXJjZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEdlb0pTT05Tb3VyY2VEYXRhJywgYXJnczogWydzb3VyY2VJZCcsIGRhdGFdIH1cbiAgICAgKi9cbiAgICBzZXRHZW9KU09OU291cmNlRGF0YTogJ3NldEdlb0pTT05Tb3VyY2VEYXRhJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5ZXJab29tUmFuZ2UnLCBhcmdzOiBbJ2xheWVySWQnLCAwLCAyMl0gfVxuICAgICAqL1xuICAgIHNldExheWVyWm9vbVJhbmdlOiAnc2V0TGF5ZXJab29tUmFuZ2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXllclByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldExheWVyUHJvcGVydHk6ICdzZXRMYXllclByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0Q2VudGVyJywgYXJnczogW1tsb24sIGxhdF1dIH1cbiAgICAgKi9cbiAgICBzZXRDZW50ZXI6ICdzZXRDZW50ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRab29tJywgYXJnczogW3pvb21dIH1cbiAgICAgKi9cbiAgICBzZXRab29tOiAnc2V0Wm9vbScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEJlYXJpbmcnLCBhcmdzOiBbYmVhcmluZ10gfVxuICAgICAqL1xuICAgIHNldEJlYXJpbmc6ICdzZXRCZWFyaW5nJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0UGl0Y2gnLCBhcmdzOiBbcGl0Y2hdIH1cbiAgICAgKi9cbiAgICBzZXRQaXRjaDogJ3NldFBpdGNoJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0U3ByaXRlJywgYXJnczogWydzcHJpdGVVcmwnXSB9XG4gICAgICovXG4gICAgc2V0U3ByaXRlOiAnc2V0U3ByaXRlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0R2x5cGhzJywgYXJnczogWydnbHlwaHNVcmwnXSB9XG4gICAgICovXG4gICAgc2V0R2x5cGhzOiAnc2V0R2x5cGhzJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0VHJhbnNpdGlvbicsIGFyZ3M6IFt0cmFuc2l0aW9uXSB9XG4gICAgICovXG4gICAgc2V0VHJhbnNpdGlvbjogJ3NldFRyYW5zaXRpb24nLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMaWdodGluZycsIGFyZ3M6IFtsaWdodFByb3BlcnRpZXNdIH1cbiAgICAgKi9cbiAgICBzZXRMaWdodDogJ3NldExpZ2h0JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0VGVycmFpbicsIGFyZ3M6IFt0ZXJyYWluUHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldFRlcnJhaW46ICdzZXRUZXJyYWluJyxcblxuICAgIC8qXG4gICAgICogIHsgY29tbWFuZDogJ3NldEZvZycsIGFyZ3M6IFtmb2dQcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0Rm9nOiAnc2V0Rm9nJ1xuXG59O1xuXG5mdW5jdGlvbiBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcykge1xuICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkU291cmNlLCBhcmdzOiBbc291cmNlSWQsIGFmdGVyW3NvdXJjZUlkXV19KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZVNvdXJjZSwgYXJnczogW3NvdXJjZUlkXX0pO1xuICAgIHNvdXJjZXNSZW1vdmVkW3NvdXJjZUlkXSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcyk7XG59XG5cbmZ1bmN0aW9uIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpIHtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWJlZm9yZVtzb3VyY2VJZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RhdGEnICYmICFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF1bcHJvcF0sIGFmdGVyW3NvdXJjZUlkXVtwcm9wXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXJbc291cmNlSWRdKSB7XG4gICAgICAgIGlmICghYWZ0ZXJbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRpZmZTb3VyY2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHNvdXJjZUlkO1xuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byByZW1vdmVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byBhZGQvdXBkYXRlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkgY29udGludWU7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF0sIGFmdGVyW3NvdXJjZUlkXSkpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBhZnRlcltzb3VyY2VJZF0udHlwZSA9PT0gJ2dlb2pzb24nICYmIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHZW9KU09OU291cmNlRGF0YSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF0uZGF0YV19KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gdXBkYXRlIGNvbW1hbmQsIG11c3QgcmVtb3ZlIHRoZW4gYWRkXG4gICAgICAgICAgICAgICAgdXBkYXRlU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBsYXllcklkLCBrbGFzcywgY29tbWFuZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHByb3A7XG5cbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlKSB7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZVtwcm9wXSwgYWZ0ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXX0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZCwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyW3Byb3BdLCBrbGFzc119KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Y2tJZChsYXllcikge1xuICAgIHJldHVybiBsYXllci5pZDtcbn1cbmZ1bmN0aW9uIGluZGV4QnlJZChncm91cCwgbGF5ZXIpIHtcbiAgICBncm91cFtsYXllci5pZF0gPSBsYXllcjtcbiAgICByZXR1cm4gZ3JvdXA7XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllcnMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwgW107XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCBbXTtcblxuICAgIC8vIG9yZGVyIG9mIGxheWVycyBieSBpZFxuICAgIGNvbnN0IGJlZm9yZU9yZGVyID0gYmVmb3JlLm1hcChwbHVja0lkKTtcbiAgICBjb25zdCBhZnRlck9yZGVyID0gYWZ0ZXIubWFwKHBsdWNrSWQpO1xuXG4gICAgLy8gaW5kZXggb2YgbGF5ZXIgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IGJlZm9yZS5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG4gICAgY29uc3QgYWZ0ZXJJbmRleCA9IGFmdGVyLnJlZHVjZShpbmRleEJ5SWQsIHt9KTtcblxuICAgIC8vIHRyYWNrIG9yZGVyIG9mIGxheWVycyBhcyBpZiB0aGV5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgY29uc3QgdHJhY2tlciA9IGJlZm9yZU9yZGVyLnNsaWNlKCk7XG5cbiAgICAvLyBsYXllcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgZG8gbm90IG5lZWQgdG8gYmUgZGlmZmVkXG4gICAgY29uc3QgY2xlYW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgbGV0IGksIGQsIGxheWVySWQsIGJlZm9yZUxheWVyLCBhZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkLCBwcm9wO1xuXG4gICAgLy8gcmVtb3ZlIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYmVmb3JlT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGJlZm9yZU9yZGVyW2ldO1xuICAgICAgICBpZiAoIWFmdGVySW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5pbmRleE9mKGxheWVySWQsIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQvcmVvcmRlciBsYXllcnNcbiAgICBmb3IgKGkgPSAwLCBkID0gMDsgaSA8IGFmdGVyT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gd29yayBiYWNrd2FyZHMgYXMgaW5zZXJ0IGlzIGJlZm9yZSBhbiBleGlzdGluZyBsYXllclxuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlclthZnRlck9yZGVyLmxlbmd0aCAtIDEgLSBpXTtcblxuICAgICAgICBpZiAodHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIDEgLSBpXSA9PT0gbGF5ZXJJZCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGJlZm9yZUluZGV4Lmhhc093blByb3BlcnR5KGxheWVySWQpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxheWVyIGJlZm9yZSB3ZSBpbnNlcnQgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkLCB0cmFja2VyLmxlbmd0aCAtIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbGF5ZXIgYXQgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIGldO1xuICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJJbmRleFtsYXllcklkXSwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF19KTtcbiAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sZW5ndGggLSBpLCAwLCBsYXllcklkKTtcbiAgICAgICAgY2xlYW5bbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlcltpXTtcbiAgICAgICAgYmVmb3JlTGF5ZXIgPSBiZWZvcmVJbmRleFtsYXllcklkXTtcbiAgICAgICAgYWZ0ZXJMYXllciA9IGFmdGVySW5kZXhbbGF5ZXJJZF07XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgcHJldmlvdXNseSBhZGRlZCAobmV3IG9yIG1vdmVkKVxuICAgICAgICBpZiAoY2xlYW5bbGF5ZXJJZF0gfHwgaXNFcXVhbChiZWZvcmVMYXllciwgYWZ0ZXJMYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSwgc291cmNlLWxheWVyLCBvciB0eXBlIGhhdmUgY2hhbmdlcywgdGhlbiByZW1vdmUgdGhlIGxheWVyXG4gICAgICAgIC8vIGFuZCBhZGQgaXQgYmFjayAnZnJvbSBzY3JhdGNoJy5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLnNvdXJjZSwgYWZ0ZXJMYXllci5zb3VyY2UpIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyWydzb3VyY2UtbGF5ZXInXSwgYWZ0ZXJMYXllclsnc291cmNlLWxheWVyJ10pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLnR5cGUsIGFmdGVyTGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgLy8gd2UgYWRkIHRoZSBsYXllciBiYWNrIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGl0IHdhcyBhbHJlYWR5IGluLCBzb1xuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgYHRyYWNrZXJgXG4gICAgICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxhc3RJbmRleE9mKGxheWVySWQpICsgMV07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF19KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGF5b3V0LCBwYWludCwgZmlsdGVyLCBtaW56b29tLCBtYXh6b29tXG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5sYXlvdXQsIGFmdGVyTGF5ZXIubGF5b3V0LCBjb21tYW5kcywgbGF5ZXJJZCwgbnVsbCwgb3BlcmF0aW9ucy5zZXRMYXlvdXRQcm9wZXJ0eSk7XG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5wYWludCwgYWZ0ZXJMYXllci5wYWludCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5maWx0ZXIsIGFmdGVyTGF5ZXIuZmlsdGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGaWx0ZXIsIGFyZ3M6IFtsYXllcklkLCBhZnRlckxheWVyLmZpbHRlcl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5taW56b29tKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci5tYXh6b29tLCBhZnRlckxheWVyLm1heHpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyWm9vbVJhbmdlLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5taW56b29tLCBhZnRlckxheWVyLm1heHpvb21dfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgYWxsIG90aGVyIGxheWVyIHByb3BzLCBpbmNsdWRpbmcgcGFpbnQuKlxuICAgICAgICBmb3IgKHByb3AgaW4gYmVmb3JlTGF5ZXIpIHtcbiAgICAgICAgICAgIGlmICghYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBhZnRlckxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWFmdGVyTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERpZmYgdHdvIHN0eWxlc2hlZXRcbiAqXG4gKiBDcmVhdGVzIHNlbWFudGljbHkgYXdhcmUgZGlmZnMgdGhhdCBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgYXQgcnVudGltZS5cbiAqIE9wZXJhdGlvbnMgcHJvZHVjZWQgYnkgdGhlIGRpZmYgY2xvc2VseSByZXNlbWJsZSB0aGUgbWFwYm94LWdsLWpzIEFQSS4gQW55XG4gKiBlcnJvciBjcmVhdGluZyB0aGUgZGlmZiB3aWxsIGZhbGwgYmFjayB0byB0aGUgJ3NldFN0eWxlJyBvcGVyYXRpb24uXG4gKlxuICogRXhhbXBsZSBkaWZmOlxuICogW1xuICogICAgIHsgY29tbWFuZDogJ3NldENvbnN0YW50JywgYXJnczogWydAd2F0ZXInLCAnIzAwMDBGRiddIH0sXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JsYWNrJ10gfVxuICogXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFtiZWZvcmVdIHN0eWxlc2hlZXQgdG8gY29tcGFyZSBmcm9tXG4gKiBAcGFyYW0geyp9IGFmdGVyIHN0eWxlc2hlZXQgdG8gY29tcGFyZSB0b1xuICogQHJldHVybnMgQXJyYXkgbGlzdCBvZiBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGRpZmZTdHlsZXMoYmVmb3JlLCBhZnRlcikge1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG5cbiAgICBsZXQgY29tbWFuZHMgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudmVyc2lvbiwgYWZ0ZXIudmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBbe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0U3R5bGUsIGFyZ3M6IFthZnRlcl19XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmNlbnRlciwgYWZ0ZXIuY2VudGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRDZW50ZXIsIGFyZ3M6IFthZnRlci5jZW50ZXJdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS56b29tLCBhZnRlci56b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRab29tLCBhcmdzOiBbYWZ0ZXIuem9vbV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmJlYXJpbmcsIGFmdGVyLmJlYXJpbmcpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldEJlYXJpbmcsIGFyZ3M6IFthZnRlci5iZWFyaW5nXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUucGl0Y2gsIGFmdGVyLnBpdGNoKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRQaXRjaCwgYXJnczogW2FmdGVyLnBpdGNoXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuc3ByaXRlLCBhZnRlci5zcHJpdGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFNwcml0ZSwgYXJnczogW2FmdGVyLnNwcml0ZV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmdseXBocywgYWZ0ZXIuZ2x5cGhzKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHbHlwaHMsIGFyZ3M6IFthZnRlci5nbHlwaHNdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS50cmFuc2l0aW9uLCBhZnRlci50cmFuc2l0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRUcmFuc2l0aW9uLCBhcmdzOiBbYWZ0ZXIudHJhbnNpdGlvbl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmxpZ2h0LCBhZnRlci5saWdodCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGlnaHQsIGFyZ3M6IFthZnRlci5saWdodF19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmZvZywgYWZ0ZXIuZm9nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGb2csIGFyZ3M6IFthZnRlci5mb2ddfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgc291cmNlc2BcbiAgICAgICAgLy8gSWYgYSBzb3VyY2UgaXMgdG8gYmUgcmVtb3ZlZCwgd2UgYWxzby0tYmVmb3JlIHRoZSByZW1vdmVTb3VyY2VcbiAgICAgICAgLy8gY29tbWFuZC0tbmVlZCB0byByZW1vdmUgYWxsIHRoZSBzdHlsZSBsYXllcnMgdGhhdCBkZXBlbmQgb24gaXQuXG4gICAgICAgIGNvbnN0IHNvdXJjZXNSZW1vdmVkID0ge307XG5cbiAgICAgICAgLy8gRmlyc3QgY29sbGVjdCB0aGUge2FkZCxyZW1vdmV9U291cmNlIGNvbW1hbmRzXG4gICAgICAgIGNvbnN0IHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMgPSBbXTtcbiAgICAgICAgZGlmZlNvdXJjZXMoYmVmb3JlLnNvdXJjZXMsIGFmdGVyLnNvdXJjZXMsIHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcblxuICAgICAgICAvLyBQdXNoIGEgcmVtb3ZlTGF5ZXIgY29tbWFuZCBmb3IgZWFjaCBzdHlsZSBsYXllciB0aGF0IGRlcGVuZHMgb24gYVxuICAgICAgICAvLyBzb3VyY2UgdGhhdCdzIGJlaW5nIHJlbW92ZWQuXG4gICAgICAgIC8vIEFsc28sIGV4Y2x1ZGUgYW55IHN1Y2ggbGF5ZXJzIHRoZW0gZnJvbSB0aGUgaW5wdXQgdG8gYGRpZmZMYXllcnNgXG4gICAgICAgIC8vIGJlbG93LCBzbyB0aGF0IGRpZmZMYXllcnMgcHJvZHVjZXMgdGhlIGFwcHJvcHJpYXRlIGBhZGRMYXllcnNgXG4gICAgICAgIC8vIGNvbW1hbmRcbiAgICAgICAgY29uc3QgYmVmb3JlTGF5ZXJzID0gW107XG4gICAgICAgIGlmIChiZWZvcmUubGF5ZXJzKSB7XG4gICAgICAgICAgICBiZWZvcmUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVMYXllciwgYXJnczogW2xheWVyLmlkXX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVycmFpbiBpZiB0aGUgc291cmNlIGZvciB0aGF0IHRlcnJhaW4gaXMgYmVpbmcgcmVtb3ZlZFxuICAgICAgICBsZXQgYmVmb3JlVGVycmFpbiA9IGJlZm9yZS50ZXJyYWluO1xuICAgICAgICBpZiAoYmVmb3JlVGVycmFpbikge1xuICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2JlZm9yZVRlcnJhaW4uc291cmNlXSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VGVycmFpbiwgYXJnczogW3VuZGVmaW5lZF19KTtcbiAgICAgICAgICAgICAgICBiZWZvcmVUZXJyYWluID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29tbWFuZHMgPSBjb21tYW5kcy5jb25jYXQocmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcyk7XG5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGVycmFpbiBpcyBhIHRvcC1sZXZlbCBwcm9wZXJ0eVxuICAgICAgICAvLyBJdHMgbGlrZSBhIGxheWVyIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRlcGVuZHMgb24gYSBzb3VyY2UgYmVpbmcgcHJlc2VudC5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZVRlcnJhaW4sIGFmdGVyLnRlcnJhaW4pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFRlcnJhaW4sIGFyZ3M6IFthZnRlci50ZXJyYWluXX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gYGxheWVyc2BcbiAgICAgICAgZGlmZkxheWVycyhiZWZvcmVMYXllcnMsIGFmdGVyLmxheWVycywgY29tbWFuZHMpO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gc2V0U3R5bGVcbiAgICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gY29tcHV0ZSBzdHlsZSBkaWZmOicsIGUpO1xuICAgICAgICBjb21tYW5kcyA9IFt7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXX1dO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlmZlN0eWxlcztcbmV4cG9ydCB7b3BlcmF0aW9uc307XG4iLCIvLyBAZmxvd1xuXG4vLyBOb3RlOiBEbyBub3QgaW5oZXJpdCBmcm9tIEVycm9yLiBJdCBicmVha3Mgd2hlbiB0cmFuc3BpbGluZyB0byBFUzUuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRpb25FcnJvciB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGlkZW50aWZpZXI6ID9zdHJpbmc7XG4gICAgbGluZTogP251bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGtleTogP3N0cmluZywgdmFsdWU6ID97IF9fbGluZV9fOiBudW1iZXIgfSwgbWVzc2FnZTogc3RyaW5nLCBpZGVudGlmaWVyOiA/c3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IChrZXkgPyBgJHtrZXl9OiBgIDogJycpICsgbWVzc2FnZTtcbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuX19saW5lX18pIHtcbiAgICAgICAgICAgIHRoaXMubGluZSA9IHZhbHVlLl9fbGluZV9fO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuLy8gTm90ZTogRG8gbm90IGluaGVyaXQgZnJvbSBFcnJvci4gSXQgYnJlYWtzIHdoZW4gdHJhbnNwaWxpbmcgdG8gRVM1LlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzaW5nRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBlcnJvcjogRXJyb3I7XG4gICAgbGluZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXJyb3I6IEVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBlcnJvci5tZXNzYWdlLm1hdGNoKC9saW5lIChcXGQrKS8pO1xuICAgICAgICB0aGlzLmxpbmUgPSBtYXRjaCA/IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkgOiAwO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVDb25zdGFudHMob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IGNvbnN0YW50cyA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICBpZiAoY29uc3RhbnRzKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGNvbnN0YW50cywgJ2NvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OCcpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuLy8gVHVybiBqc29ubGludC1saW5lcy1wcmltaXRpdmVzIG9iamVjdHMgaW50byBwcmltaXRpdmUgb2JqZWN0c1xuZXhwb3J0IGZ1bmN0aW9uIHVuYnVuZGxlKHZhbHVlOiBtaXhlZCkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFVuYnVuZGxlKHZhbHVlOiBtaXhlZCk6IG1peGVkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChkZWVwVW5idW5kbGUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7XG4gICAgICAgIGNvbnN0IHVuYnVuZGxlZFZhbHVlOiB7IFtrZXk6IHN0cmluZ106IG1peGVkIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHVuYnVuZGxlZFZhbHVlW2tleV0gPSBkZWVwVW5idW5kbGUodmFsdWVba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYnVuZGxlZFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB1bmJ1bmRsZSh2YWx1ZSk7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBvYmplY3QgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGVsZW1lbnRTcGVjcyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IHt9O1xuICAgIGNvbnN0IGVsZW1lbnRWYWxpZGF0b3JzID0gb3B0aW9ucy5vYmplY3RFbGVtZW50VmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgdHlwZSA9IGdldFR5cGUob2JqZWN0KTtcbiAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0LCBgb2JqZWN0IGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IGluIG9iamVjdCkge1xuICAgICAgICBjb25zdCBlbGVtZW50U3BlY0tleSA9IG9iamVjdEtleS5zcGxpdCgnLicpWzBdOyAvLyB0cmVhdCAncGFpbnQuKicgYXMgJ3BhaW50J1xuICAgICAgICBjb25zdCBlbGVtZW50U3BlYyA9IGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0gfHwgZWxlbWVudFNwZWNzWycqJ107XG5cbiAgICAgICAgbGV0IHZhbGlkYXRlRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnRWYWxpZGF0b3JzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VmFsaWRhdG9yc1snKiddKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1snKiddO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRTcGVjc1snKiddKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSB2YWxpZGF0ZVNwZWM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0W29iamVjdEtleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtvYmplY3RLZXl9XCJgKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICAgIGtleTogKGtleSA/IGAke2tleX0uYCA6IGtleSkgKyBvYmplY3RLZXksXG4gICAgICAgICAgICB2YWx1ZTogb2JqZWN0W29iamVjdEtleV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgICBvYmplY3RLZXlcbiAgICAgICAgfSwgb2JqZWN0KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50U3BlY0tleSBpbiBlbGVtZW50U3BlY3MpIHtcbiAgICAgICAgLy8gRG9uJ3QgY2hlY2sgYHJlcXVpcmVkYCB3aGVuIHRoZXJlJ3MgYSBjdXN0b20gdmFsaWRhdG9yIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldLnJlcXVpcmVkICYmIGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIG9iamVjdFtlbGVtZW50U3BlY0tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCIke2VsZW1lbnRTcGVjS2V5fVwiYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBhcnJheSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgYXJyYXlTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbGlkYXRlQXJyYXlFbGVtZW50ID0gb3B0aW9ucy5hcnJheUVsZW1lbnRWYWxpZGF0b3IgfHwgdmFsaWRhdGU7XG5cbiAgICBpZiAoZ2V0VHlwZShhcnJheSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBleHBlY3RlZCwgJHtnZXRUeXBlKGFycmF5KX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlYy5sZW5ndGggJiYgYXJyYXkubGVuZ3RoICE9PSBhcnJheVNwZWMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgbGVuZ3RoICR7YXJyYXlTcGVjLmxlbmd0aH0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlY1snbWluLWxlbmd0aCddICYmIGFycmF5Lmxlbmd0aCA8IGFycmF5U3BlY1snbWluLWxlbmd0aCddKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgbGVuZ3RoIGF0IGxlYXN0ICR7YXJyYXlTcGVjWydtaW4tbGVuZ3RoJ119IGV4cGVjdGVkLCBsZW5ndGggJHthcnJheS5sZW5ndGh9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGxldCBhcnJheUVsZW1lbnRTcGVjID0ge1xuICAgICAgICBcInR5cGVcIjogYXJyYXlTcGVjLnZhbHVlLFxuICAgICAgICBcInZhbHVlc1wiOiBhcnJheVNwZWMudmFsdWVzLFxuICAgICAgICBcIm1pbmltdW1cIjogYXJyYXlTcGVjLm1pbmltdW0sXG4gICAgICAgIFwibWF4aW11bVwiOiBhcnJheVNwZWMubWF4aW11bVxuICAgIH07XG5cbiAgICBpZiAoc3R5bGVTcGVjLiR2ZXJzaW9uIDwgNykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjLmZ1bmN0aW9uID0gYXJyYXlTcGVjLmZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGlmIChnZXRUeXBlKGFycmF5U3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFycmF5RWxlbWVudFNwZWMgPSBhcnJheVNwZWMudmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5RWxlbWVudCh7XG4gICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgIGFycmF5SW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZTogYXJyYXlbaV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGFycmF5RWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWBcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgbGV0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHR5cGUgPSAnTmFOJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5pbXVtJyBpbiB2YWx1ZVNwZWMpIHtcbiAgICAgICAgbGV0IHNwZWNNaW4gPSB2YWx1ZVNwZWMubWluaW11bTtcbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWVTcGVjLm1pbmltdW0pID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gb3B0aW9ucy5hcnJheUluZGV4O1xuICAgICAgICAgICAgc3BlY01pbiA9IHZhbHVlU3BlYy5taW5pbXVtW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IHNwZWNNaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICR7c3BlY01pbn1gKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ21heGltdW0nIGluIHZhbHVlU3BlYykge1xuICAgICAgICBsZXQgc3BlY01heCA9IHZhbHVlU3BlYy5tYXhpbXVtO1xuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZVNwZWMubWF4aW11bSkgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBvcHRpb25zLmFycmF5SW5kZXg7XG4gICAgICAgICAgICBzcGVjTWF4ID0gdmFsdWVTcGVjLm1heGltdW1baV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID4gc3BlY01heCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGAke3ZhbHVlfSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHtzcGVjTWF4fWApXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB7aXNFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IHZhbGlkYXRlRnVuY3Rpb25TdG9wXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCB2YWx1ZSwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3Aob3B0aW9ucykge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gZm91bmRgKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgb2JqZWN0IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWVbMF0pfSBmb3VuZGApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS56b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcERvbWFpblpvb20gJiYgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA+IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pICE9PSBwcmV2aW91c1N0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge3pvb206IHt9fSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7em9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZX1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVTdG9wRG9tYWluVmFsdWUoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge30sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24oZGVlcFVuYnVuZGxlKHZhbHVlWzFdKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgJ2V4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiBzdG9wcy4nKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9WzFdYCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVsxXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZnVuY3Rpb25WYWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKG9wdGlvbnMsIHN0b3ApIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGUob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0VmFsdWUgPSBvcHRpb25zLnZhbHVlICE9PSBudWxsID8gb3B0aW9ucy52YWx1ZSA6IHN0b3A7XG5cbiAgICAgICAgaWYgKCFzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgc3RvcEtleVR5cGUgPSB0eXBlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHN0b3BLZXlUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBgJHt0eXBlfSBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAke3N0b3BLZXlUeXBlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4nKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgZnVuY3Rpb25UeXBlICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgO1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKGZ1bmN0aW9uVmFsdWVTcGVjKSAmJiBmdW5jdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJ1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIG1lc3NhZ2UpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgKCFpc0Zpbml0ZSh2YWx1ZSkgfHwgTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7dmFsdWV9YCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdmFsdWUgaW4gc3RvcERvbWFpblZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgJ3N0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZScpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbiwgY3JlYXRlUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7ZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCB7aXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuLi9leHByZXNzaW9uL2lzX2NvbnN0YW50LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnM6IGFueSk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ3Byb3BlcnR5JyA/IGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbiA6IGNyZWF0ZUV4cHJlc3Npb24pKGRlZXBVbmJ1bmRsZShvcHRpb25zLnZhbHVlKSwgb3B0aW9ucy52YWx1ZVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZS5tYXAoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihgJHtvcHRpb25zLmtleX0ke2Vycm9yLmtleX1gLCBvcHRpb25zLnZhbHVlLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwcmVzc2lvbk9iaiA9IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLmV4cHJlc3Npb24gfHwgKGV4cHJlc3Npb24udmFsdWU6IGFueSkuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uO1xuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgJiYgKG9wdGlvbnMucHJvcGVydHlLZXkgPT09ICd0ZXh0LWZvbnQnKSAmJlxuICAgICAgICAhZXhwcmVzc2lvbk9iai5vdXRwdXREZWZpbmVkKCkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCBgSW52YWxpZCBkYXRhIGV4cHJlc3Npb24gZm9yIFwiJHtvcHRpb25zLnByb3BlcnR5S2V5fVwiLiBPdXRwdXQgdmFsdWVzIG11c3QgYmUgY29udGFpbmVkIGFzIGxpdGVyYWxzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbi5gKV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgJiYgb3B0aW9ucy5wcm9wZXJ0eVR5cGUgPT09ICdsYXlvdXQnICYmXG4gICAgICAgICghaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcImZlYXR1cmUtc3RhdGVcIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbGF5b3V0IHByb3BlcnRpZXMuJyldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAnZmlsdGVyJyAmJiAhaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wiZmVhdHVyZS1zdGF0ZVwiIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBmaWx0ZXJzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCAmJiBvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0LmluZGV4T2YoJ2NsdXN0ZXInKSA9PT0gMCkge1xuICAgICAgICBpZiAoIWlzR2xvYmFsUHJvcGVydHlDb25zdGFudChleHByZXNzaW9uT2JqLCBbJ3pvb20nLCAnZmVhdHVyZS1zdGF0ZSddKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJ6b29tXCIgYW5kIFwiZmVhdHVyZS1zdGF0ZVwiIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggY2x1c3RlciBwcm9wZXJ0aWVzLicpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2NsdXN0ZXItaW5pdGlhbCcgJiYgIWlzRmVhdHVyZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdGZWF0dXJlIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBpbml0aWFsIGV4cHJlc3Npb24gcGFydCBvZiBjbHVzdGVyIHByb3BlcnRpZXMuJyldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHtwYXJzZUNTU0NvbG9yfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUVudW0ob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU3BlYy52YWx1ZXMpKSB7IC8vIDw9djdcbiAgICAgICAgaWYgKHZhbHVlU3BlYy52YWx1ZXMuaW5kZXhPZih1bmJ1bmRsZSh2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZXhwZWN0ZWQgb25lIG9mIFske3ZhbHVlU3BlYy52YWx1ZXMuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA+PXY4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7T2JqZWN0LmtleXModmFsdWVTcGVjLnZhbHVlcykuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uLmpzJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHt1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb25GaWx0ZXJ9IGZyb20gJy4uL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXIob3B0aW9ucykge1xuICAgIGlmIChpc0V4cHJlc3Npb25GaWx0ZXIoZGVlcFVuYnVuZGxlKG9wdGlvbnMudmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdmaWx0ZXInLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiB7dmFsdWU6ICdib29sZWFuJ31cbiAgICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGlmIChnZXRUeXBlKHZhbHVlKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBsZXQgdHlwZTtcblxuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnQnKV07XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVudW0oe1xuICAgICAgICBrZXk6IGAke2tleX1bMF1gLFxuICAgICAgICB2YWx1ZTogdmFsdWVbMF0sXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmZpbHRlcl9vcGVyYXRvcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICB9KSk7XG5cbiAgICBzd2l0Y2ggKHVuYnVuZGxlKHZhbHVlWzBdKSkge1xuICAgIGNhc2UgJzwnOlxuICAgIGNhc2UgJzw9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB1bmJ1bmRsZSh2YWx1ZVsxXSkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYFwiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIke3ZhbHVlWzBdfVwiYCkpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlICc9PSc6XG4gICAgY2FzZSAnIT0nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJHt2YWx1ZVswXX1cIiBtdXN0IGhhdmUgMyBlbGVtZW50c2ApKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSAnaW4nOlxuICAgIGNhc2UgJyFpbic6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbMV0pO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbaV0pO1xuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzFdKSA9PT0gJyR0eXBlJykge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbnVtKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5nZW9tZXRyeV90eXBlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ251bWJlcicgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WyR7aX1dYCwgdmFsdWVbaV0sIGBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgJ2FueSc6XG4gICAgY2FzZSAnYWxsJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgJ2hhcyc6XG4gICAgY2FzZSAnIWhhcyc6XG4gICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBcIiR7dmFsdWVbMF19XCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHNgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dpdGhpbic6XG4gICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBcIiR7dmFsdWVbMF19XCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHNgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgb2JqZWN0IGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge3N1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi91dGlsL3Byb3BlcnRpZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsIHByb3BlcnR5VHlwZSkge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgcHJvcGVydHlLZXkgPSBvcHRpb25zLm9iamVjdEtleTtcbiAgICBjb25zdCBsYXllclNwZWMgPSBzdHlsZVNwZWNbYCR7cHJvcGVydHlUeXBlfV8ke29wdGlvbnMubGF5ZXJUeXBlfWBdO1xuXG4gICAgaWYgKCFsYXllclNwZWMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25NYXRjaCA9IHByb3BlcnR5S2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdwYWludCcgJiYgdHJhbnNpdGlvbk1hdGNoICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IGxheWVyU3BlY1twcm9wZXJ0eUtleV07XG4gICAgaWYgKCF2YWx1ZVNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGB1bmtub3duIHByb3BlcnR5IFwiJHtwcm9wZXJ0eUtleX1cImApXTtcbiAgICB9XG5cbiAgICBsZXQgdG9rZW5NYXRjaDtcbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdzdHJpbmcnICYmIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlU3BlYykgJiYgIXZhbHVlU3BlYy50b2tlbnMgJiYgKHRva2VuTWF0Y2ggPSAvXnsoW159XSspfSQvLmV4ZWModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBrZXksIHZhbHVlLFxuICAgICAgICAgICAgYFwiJHtwcm9wZXJ0eUtleX1cIiBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gc3ludGF4XFxuYCArXG4gICAgICAgICAgICAgICAgYFVzZSBhbiBpZGVudGl0eSBwcm9wZXJ0eSBmdW5jdGlvbiBpbnN0ZWFkOiBcXGB7IFwidHlwZVwiOiBcImlkZW50aXR5XCIsIFwicHJvcGVydHlcIjogJHtKU09OLnN0cmluZ2lmeSh0b2tlbk1hdGNoWzFdKX0gfVxcYC5gKV07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gW107XG5cbiAgICBpZiAob3B0aW9ucy5sYXllclR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleSA9PT0gJ3RleHQtZmllbGQnICYmIHN0eWxlICYmICFzdHlsZS5nbHlwaHMpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JyAmJiBpc0Z1bmN0aW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZSkpICYmIHVuYnVuZGxlKHZhbHVlLnR5cGUpID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcInRleHQtZm9udFwiIGRvZXMgbm90IHN1cHBvcnQgaWRlbnRpdHkgZnVuY3Rpb25zJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWVTcGVjLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjLFxuICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ3Byb3BlcnR5JyxcbiAgICAgICAgcHJvcGVydHlUeXBlLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgIH0pKTtcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlUHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgJ3BhaW50Jyk7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZVByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfcHJvcGVydHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCAnbGF5b3V0Jyk7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCB2YWxpZGF0ZU9iamVjdCBmcm9tICcuL3ZhbGlkYXRlX29iamVjdC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVGaWx0ZXIgZnJvbSAnLi92YWxpZGF0ZV9maWx0ZXIuanMnO1xuaW1wb3J0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5LmpzJztcbmltcG9ydCB2YWxpZGF0ZUxheW91dFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzJztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcihvcHRpb25zKSB7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICghbGF5ZXIudHlwZSAmJiAhbGF5ZXIucmVmKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ2VpdGhlciBcInR5cGVcIiBvciBcInJlZlwiIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cbiAgICBsZXQgdHlwZSA9IHVuYnVuZGxlKGxheWVyLnR5cGUpO1xuICAgIGNvbnN0IHJlZiA9IHVuYnVuZGxlKGxheWVyLnJlZik7XG5cbiAgICBpZiAobGF5ZXIuaWQpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHVuYnVuZGxlKGxheWVyLmlkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmFycmF5SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJMYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShvdGhlckxheWVyLmlkKSA9PT0gbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5pZCwgYGR1cGxpY2F0ZSBsYXllciBpZCBcIiR7bGF5ZXIuaWR9XCIsIHByZXZpb3VzbHkgdXNlZCBhdCBsaW5lICR7b3RoZXJMYXllci5pZC5fX2xpbmVfX31gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3JlZicgaW4gbGF5ZXIpIHtcbiAgICAgICAgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnZmlsdGVyJywgJ2xheW91dCddLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGlmIChwIGluIGxheWVyKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyW3BdLCBgXCIke3B9XCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVyc2ApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHBhcmVudDtcblxuICAgICAgICBzdHlsZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShsYXllci5pZCkgPT09IHJlZikgcGFyZW50ID0gbGF5ZXI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIucmVmLCBgcmVmIGxheWVyIFwiJHtyZWZ9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5yZWYpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsICdyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllcicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSB1bmJ1bmRsZShwYXJlbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEodHlwZSA9PT0gJ2JhY2tncm91bmQnIHx8IHR5cGUgPT09ICdza3knKSkge1xuICAgICAgICBpZiAoIWxheWVyLnNvdXJjZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc3R5bGUuc291cmNlcyAmJiBzdHlsZS5zb3VyY2VzW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYHNvdXJjZSBcIiR7bGF5ZXIuc291cmNlfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgdHlwZSA9PT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIHJlcXVpcmVzIGEgcmFzdGVyIHNvdXJjZWApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3Jhc3RlcicgJiYgdHlwZSAhPT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIHJlcXVpcmVzIGEgdmVjdG9yIHNvdXJjZWApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgIWxheWVyWydzb3VyY2UtbGF5ZXInXSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAncmFzdGVyLWRlbScgJiYgdHlwZSAhPT0gJ2hpbGxzaGFkZScpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCAncmFzdGVyLWRlbSBzb3VyY2UgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGxheWVyIHR5cGUgXFwnaGlsbHNoYWRlXFwnLicpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmUnICYmIGxheWVyLnBhaW50ICYmIGxheWVyLnBhaW50WydsaW5lLWdyYWRpZW50J10gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZVR5cGUgIT09ICdnZW9qc29uJyB8fCAhc291cmNlLmxpbmVNZXRyaWNzKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBzcGVjaWZpZXMgYSBsaW5lLWdyYWRpZW50LCB3aGljaCByZXF1aXJlcyBhIEdlb0pTT04gc291cmNlIHdpdGggXFxgbGluZU1ldHJpY3NcXGAgZW5hYmxlZC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogbGF5ZXIsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICcqJygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBlbmZvcmNlIHRoZSBzcGVjJ3MgYFwicmVxdWlyZXNcIjogdHJ1ZWAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCByZWZzO1xuICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZXF1aXJlbWVudCBpcyB2YWxpZGF0ZWQgYWJvdmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTc3Mi5cbiAgICAgICAgICAgIHR5cGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RLZXk6ICd0eXBlJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcjogdmFsaWRhdGVGaWx0ZXIsXG4gICAgICAgICAgICBsYXlvdXQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFpbnQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhaW50UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6IHR5cGV9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHt1bmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0uanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuXG5jb25zdCBvYmplY3RFbGVtZW50VmFsaWRhdG9ycyA9IHtcbiAgICBwcm9tb3RlSWQ6IHZhbGlkYXRlUHJvbW90ZUlkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVNvdXJjZShvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGlmICghdmFsdWUudHlwZSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1widHlwZVwiIGlzIHJlcXVpcmVkJyldO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB1bmJ1bmRsZSh2YWx1ZS50eXBlKTtcbiAgICBsZXQgZXJyb3JzO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAndmVjdG9yJzpcbiAgICBjYXNlICdyYXN0ZXInOlxuICAgIGNhc2UgJ3Jhc3Rlci1kZW0nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjW2Bzb3VyY2VfJHt0eXBlLnJlcGxhY2UoJy0nLCAnXycpfWBdLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlLmNsdXN0ZXIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZS5jbHVzdGVyUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcl0gPSB2YWx1ZS5jbHVzdGVyUHJvcGVydGllc1twcm9wXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VFeHByID0gdHlwZW9mIG9wZXJhdG9yID09PSAnc3RyaW5nJyA/IFtvcGVyYXRvciwgWydhY2N1bXVsYXRlZCddLCBbJ2dldCcsIHByb3BdXSA6IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9LiR7cHJvcH0ubWFwYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hcEV4cHIsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnY2x1c3Rlci1tYXAnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS4ke3Byb3B9LnJlZHVjZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZWR1Y2VFeHByLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2NsdXN0ZXItcmVkdWNlJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfdmlkZW8sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2ltYWdlLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdjYW52YXMnOlxuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBudWxsLCBgUGxlYXNlIHVzZSBydW50aW1lIEFQSXMgdG8gYWRkIGNhbnZhcyBzb3VyY2VzLCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlbSBpbiBzdHlsZXNoZWV0cy5gLCAnc291cmNlLmNhbnZhcycpXTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9LnR5cGVgLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHt2YWx1ZXM6IFsndmVjdG9yJywgJ3Jhc3RlcicsICdyYXN0ZXItZGVtJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnXX0sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvbW90ZUlkKHtrZXksIHZhbHVlfSkge1xuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHtrZXksIHZhbHVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmcoe2tleTogYCR7a2V5fS4ke3Byb3B9YCwgdmFsdWU6IHZhbHVlW3Byb3BdfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogbGlnaHRTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGlnaHRba2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVUZXJyYWluKG9wdGlvbnMpIHtcbiAgICBjb25zdCB0ZXJyYWluID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgdGVycmFpblNwZWMgPSBzdHlsZVNwZWMudGVycmFpbjtcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCByb290VHlwZSA9IGdldFR5cGUodGVycmFpbik7XG4gICAgaWYgKHRlcnJhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ3RlcnJhaW4nLCB0ZXJyYWluLCBgb2JqZWN0IGV4cGVjdGVkLCAke3Jvb3RUeXBlfSBmb3VuZGApXSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGVycmFpbikge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiB0ZXJyYWluU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIHRlcnJhaW5TcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXJyYWluW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZXJyYWluU3BlY1trZXldKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRlcnJhaW5ba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHRlcnJhaW5TcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdGVycmFpbltrZXldLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7a2V5fVwiYCldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGVycmFpbi5zb3VyY2UpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4sIGB0ZXJyYWluIGlzIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcImApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzICYmIHN0eWxlLnNvdXJjZXNbdGVycmFpbi5zb3VyY2VdO1xuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB0ZXJyYWluLnNvdXJjZSwgYHNvdXJjZSBcIiR7dGVycmFpbi5zb3VyY2V9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgIT09ICdyYXN0ZXItZGVtJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4uc291cmNlLCBgdGVycmFpbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgc291cmNlIG9mIHR5cGUgJHtzb3VyY2VUeXBlfSwgaXQgb25seSBiZSB1c2VkIHdpdGggYSBcInJhc3Rlci1kZW1cIiBzb3VyY2UgdHlwZWApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGb2cob3B0aW9ucykge1xuICAgIGNvbnN0IGZvZyA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IGZvZ1NwZWMgPSBzdHlsZVNwZWMuZm9nO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHJvb3RUeXBlID0gZ2V0VHlwZShmb2cpO1xuICAgIGlmIChmb2cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2ZvZycsIGZvZywgYG9iamVjdCBleHBlY3RlZCwgJHtyb290VHlwZX0gZm91bmRgKV0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZvZykge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBmb2dTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgZm9nU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZm9nW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2dTcGVjW2tleV0pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZm9nW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBmb2dTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgZm9nW2tleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdHRlZChvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodmFsaWRhdGVTdHJpbmcob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uLmpzJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZyBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2Uob3B0aW9uczogYW55KSB7XG4gICAgaWYgKHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zKTtcbn1cbiIsIlxuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZC5qcyc7XG5pbXBvcnQge3VuYnVuZGxlLCBkZWVwVW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHtpc0Z1bmN0aW9ufSBmcm9tICcuLi9mdW5jdGlvbi9pbmRleC5qcyc7XG5cbmltcG9ydCB2YWxpZGF0ZUZ1bmN0aW9uIGZyb20gJy4vdmFsaWRhdGVfZnVuY3Rpb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlQm9vbGVhbiBmcm9tICcuL3ZhbGlkYXRlX2Jvb2xlYW4uanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZUNvbG9yIGZyb20gJy4vdmFsaWRhdGVfY29sb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlQ29uc3RhbnRzIGZyb20gJy4vdmFsaWRhdGVfY29uc3RhbnRzLmpzJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlX2xheWVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlX2xpZ2h0LmpzJztcbmltcG9ydCB2YWxpZGF0ZVRlcnJhaW4gZnJvbSAnLi92YWxpZGF0ZV90ZXJyYWluLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuaW1wb3J0IHZhbGlkYXRlRm9ybWF0dGVkIGZyb20gJy4vdmFsaWRhdGVfZm9ybWF0dGVkLmpzJztcbmltcG9ydCB2YWxpZGF0ZUltYWdlIGZyb20gJy4vdmFsaWRhdGVfaW1hZ2UuanMnO1xuXG5jb25zdCBWQUxJREFUT1JTID0ge1xuICAgICcqJygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgJ2FycmF5JzogdmFsaWRhdGVBcnJheSxcbiAgICAnYm9vbGVhbic6IHZhbGlkYXRlQm9vbGVhbixcbiAgICAnbnVtYmVyJzogdmFsaWRhdGVOdW1iZXIsXG4gICAgJ2NvbG9yJzogdmFsaWRhdGVDb2xvcixcbiAgICAnY29uc3RhbnRzJzogdmFsaWRhdGVDb25zdGFudHMsXG4gICAgJ2VudW0nOiB2YWxpZGF0ZUVudW0sXG4gICAgJ2ZpbHRlcic6IHZhbGlkYXRlRmlsdGVyLFxuICAgICdmdW5jdGlvbic6IHZhbGlkYXRlRnVuY3Rpb24sXG4gICAgJ2xheWVyJzogdmFsaWRhdGVMYXllcixcbiAgICAnb2JqZWN0JzogdmFsaWRhdGVPYmplY3QsXG4gICAgJ3NvdXJjZSc6IHZhbGlkYXRlU291cmNlLFxuICAgICdsaWdodCc6IHZhbGlkYXRlTGlnaHQsXG4gICAgJ3RlcnJhaW4nOiB2YWxpZGF0ZVRlcnJhaW4sXG4gICAgJ2ZvZyc6IHZhbGlkYXRlRm9nLFxuICAgICdzdHJpbmcnOiB2YWxpZGF0ZVN0cmluZyxcbiAgICAnZm9ybWF0dGVkJzogdmFsaWRhdGVGb3JtYXR0ZWQsXG4gICAgJ3Jlc29sdmVkSW1hZ2UnOiB2YWxpZGF0ZUltYWdlXG59O1xuXG4vLyBNYWluIHJlY3Vyc2l2ZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUcmFja3M6XG4vL1xuLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbi8vICAgZm9yIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgcmVwb3J0aW5nLlxuLy8gLSB2YWx1ZTogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuLy8gICBoaWdoIGxldmVsIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGRlc2NlbmRlZCBpbnRvIGRlZXBlciBvciBhIHNpbXBsZVxuLy8gICBzY2FsYXIgdmFsdWUuXG4vLyAtIHZhbHVlU3BlYzogY3VycmVudCBzcGVjIGJlaW5nIGV2YWx1YXRlZC4gVHJhY2tzIHZhbHVlLlxuLy8gLSBzdHlsZVNwZWM6IGN1cnJlbnQgZnVsbCBzcGVjIGJlaW5nIGV2YWx1YXRlZC5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGUob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICh2YWx1ZVNwZWMuZXhwcmVzc2lvbiAmJiBpc0Z1bmN0aW9uKHVuYnVuZGxlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2UgaWYgKHZhbHVlU3BlYy5leHByZXNzaW9uICYmIGlzRXhwcmVzc2lvbihkZWVwVW5idW5kbGUodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMudHlwZSAmJiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXSkge1xuICAgICAgICByZXR1cm4gVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgdmFsdWVTcGVjOiB2YWx1ZVNwZWMudHlwZSA/IHN0eWxlU3BlY1t2YWx1ZVNwZWMudHlwZV0gOiB2YWx1ZVNwZWNcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ3tmb250c3RhY2t9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie2ZvbnRzdGFja31cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne3JhbmdlfScpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntyYW5nZX1cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGUuanMnO1xuaW1wb3J0IGxhdGVzdFN0eWxlU3BlYyBmcm9tICcuL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlR2x5cGhzVVJMIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcyc7XG5cbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzJztcbmltcG9ydCB2YWxpZGF0ZVRlcnJhaW4gZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV90ZXJyYWluLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVQYWludFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMnO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgVGhlIHN0eWxlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBsYXRlc3Qgc3R5bGUgc3BlYyBpcyB1c2VkLlxuICogQHJldHVybnMge0FycmF5PFZhbGlkYXRpb25FcnJvcj59XG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG4gKiAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShzdHlsZSk7XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVNaW4oc3R5bGUsIHN0eWxlU3BlYyA9IGxhdGVzdFN0eWxlU3BlYykge1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIHZhbHVlOiBzdHlsZSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICBnbHlwaHM6IHZhbGlkYXRlR2x5cGhzVVJMLFxuICAgICAgICAgICAgJyonKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIGlmIChzdHlsZS5jb25zdGFudHMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUNvbnN0YW50cyh7XG4gICAgICAgICAgICBrZXk6ICdjb25zdGFudHMnLFxuICAgICAgICAgICAgdmFsdWU6IHN0eWxlLmNvbnN0YW50cyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydEVycm9ycyhlcnJvcnMpO1xufVxuXG52YWxpZGF0ZVN0eWxlTWluLnNvdXJjZSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVNvdXJjZSk7XG52YWxpZGF0ZVN0eWxlTWluLmxpZ2h0ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGlnaHQpO1xudmFsaWRhdGVTdHlsZU1pbi50ZXJyYWluID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlVGVycmFpbik7XG52YWxpZGF0ZVN0eWxlTWluLmZvZyA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUZvZyk7XG52YWxpZGF0ZVN0eWxlTWluLmxheWVyID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGF5ZXIpO1xudmFsaWRhdGVTdHlsZU1pbi5maWx0ZXIgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVGaWx0ZXIpO1xudmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSk7XG52YWxpZGF0ZVN0eWxlTWluLmxheW91dFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGF5b3V0UHJvcGVydHkpO1xuXG5mdW5jdGlvbiBzb3J0RXJyb3JzKGVycm9ycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoZXJyb3JzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBhLmxpbmUgLSBiLmxpbmU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDbGVhbkVycm9ycyhpbm5lcikge1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBzb3J0RXJyb3JzKGlubmVyLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZVN0eWxlTWluO1xuIiwiLyogcGFyc2VyIGdlbmVyYXRlZCBieSBqaXNvbiAwLjQuMTUgKi9cbi8qXG4gIFJldHVybnMgYSBQYXJzZXIgb2JqZWN0IG9mIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuXG4gIFBhcnNlcjoge1xuICAgIHl5OiB7fVxuICB9XG5cbiAgUGFyc2VyLnByb3RvdHlwZToge1xuICAgIHl5OiB7fSxcbiAgICB0cmFjZTogZnVuY3Rpb24oKSxcbiAgICBzeW1ib2xzXzoge2Fzc29jaWF0aXZlIGxpc3Q6IG5hbWUgPT0+IG51bWJlcn0sXG4gICAgdGVybWluYWxzXzoge2Fzc29jaWF0aXZlIGxpc3Q6IG51bWJlciA9PT4gbmFtZX0sXG4gICAgcHJvZHVjdGlvbnNfOiBbLi4uXSxcbiAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kKSxcbiAgICB0YWJsZTogWy4uLl0sXG4gICAgZGVmYXVsdEFjdGlvbnM6IHsuLi59LFxuICAgIHBhcnNlRXJyb3I6IGZ1bmN0aW9uKHN0ciwgaGFzaCksXG4gICAgcGFyc2U6IGZ1bmN0aW9uKGlucHV0KSxcblxuICAgIGxleGVyOiB7XG4gICAgICAgIEVPRjogMSxcbiAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24oc3RyLCBoYXNoKSxcbiAgICAgICAgc2V0SW5wdXQ6IGZ1bmN0aW9uKGlucHV0KSxcbiAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uKCksXG4gICAgICAgIHVucHV0OiBmdW5jdGlvbihzdHIpLFxuICAgICAgICBtb3JlOiBmdW5jdGlvbigpLFxuICAgICAgICBsZXNzOiBmdW5jdGlvbihuKSxcbiAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbigpLFxuICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbigpLFxuICAgICAgICBzaG93UG9zaXRpb246IGZ1bmN0aW9uKCksXG4gICAgICAgIHRlc3RfbWF0Y2g6IGZ1bmN0aW9uKHJlZ2V4X21hdGNoX2FycmF5LCBydWxlX2luZGV4KSxcbiAgICAgICAgbmV4dDogZnVuY3Rpb24oKSxcbiAgICAgICAgbGV4OiBmdW5jdGlvbigpLFxuICAgICAgICBiZWdpbjogZnVuY3Rpb24oY29uZGl0aW9uKSxcbiAgICAgICAgcG9wU3RhdGU6IGZ1bmN0aW9uKCksXG4gICAgICAgIF9jdXJyZW50UnVsZXM6IGZ1bmN0aW9uKCksXG4gICAgICAgIHRvcFN0YXRlOiBmdW5jdGlvbigpLFxuICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uKGNvbmRpdGlvbiksXG5cbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcmFuZ2VzOiBib29sZWFuICAgICAgICAgICAob3B0aW9uYWw6IHRydWUgPT0+IHRva2VuIGxvY2F0aW9uIGluZm8gd2lsbCBpbmNsdWRlIGEgLnJhbmdlW10gbWVtYmVyKVxuICAgICAgICAgICAgZmxleDogYm9vbGVhbiAgICAgICAgICAgICAob3B0aW9uYWw6IHRydWUgPT0+IGZsZXgtbGlrZSBsZXhpbmcgYmVoYXZpb3VyIHdoZXJlIHRoZSBydWxlcyBhcmUgdGVzdGVkIGV4aGF1c3RpdmVseSB0byBmaW5kIHRoZSBsb25nZXN0IG1hdGNoKVxuICAgICAgICAgICAgYmFja3RyYWNrX2xleGVyOiBib29sZWFuICAob3B0aW9uYWw6IHRydWUgPT0+IGxleGVyIHJlZ2V4ZXMgYXJlIHRlc3RlZCBpbiBvcmRlciBhbmQgZm9yIGVhY2ggbWF0Y2hpbmcgcmVnZXggdGhlIGFjdGlvbiBjb2RlIGlzIGludm9rZWQ7IHRoZSBsZXhlciB0ZXJtaW5hdGVzIHRoZSBzY2FuIHdoZW4gYSB0b2tlbiBpcyByZXR1cm5lZCBieSB0aGUgYWN0aW9uIGNvZGUpXG4gICAgICAgIH0sXG5cbiAgICAgICAgcGVyZm9ybUFjdGlvbjogZnVuY3Rpb24oeXksIHl5XywgJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucywgWVlfU1RBUlQpLFxuICAgICAgICBydWxlczogWy4uLl0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHthc3NvY2lhdGl2ZSBsaXN0OiBuYW1lID09PiBzZXR9LFxuICAgIH1cbiAgfVxuXG5cbiAgdG9rZW4gbG9jYXRpb24gaW5mbyAoQCQsIF8kLCBldGMuKToge1xuICAgIGZpcnN0X2xpbmU6IG4sXG4gICAgbGFzdF9saW5lOiBuLFxuICAgIGZpcnN0X2NvbHVtbjogbixcbiAgICBsYXN0X2NvbHVtbjogbixcbiAgICByYW5nZTogW3N0YXJ0X251bWJlciwgZW5kX251bWJlcl0gICAgICAgKHdoZXJlIHRoZSBudW1iZXJzIGFyZSBpbmRleGVzIGludG8gdGhlIGlucHV0IHN0cmluZywgcmVndWxhciB6ZXJvLWJhc2VkKVxuICB9XG5cblxuICB0aGUgcGFyc2VFcnJvciBmdW5jdGlvbiByZWNlaXZlcyBhICdoYXNoJyBvYmplY3Qgd2l0aCB0aGVzZSBtZW1iZXJzIGZvciBsZXhlciBhbmQgcGFyc2VyIGVycm9yczoge1xuICAgIHRleHQ6ICAgICAgICAobWF0Y2hlZCB0ZXh0KVxuICAgIHRva2VuOiAgICAgICAodGhlIHByb2R1Y2VkIHRlcm1pbmFsIHRva2VuLCBpZiBhbnkpXG4gICAgbGluZTogICAgICAgICh5eWxpbmVubylcbiAgfVxuICB3aGlsZSBwYXJzZXIgKGdyYW1tYXIpIGVycm9ycyB3aWxsIGFsc28gcHJvdmlkZSB0aGVzZSBtZW1iZXJzLCBpLmUuIHBhcnNlciBlcnJvcnMgZGVsaXZlciBhIHN1cGVyc2V0IG9mIGF0dHJpYnV0ZXM6IHtcbiAgICBsb2M6ICAgICAgICAgKHl5bGxvYylcbiAgICBleHBlY3RlZDogICAgKHN0cmluZyBkZXNjcmliaW5nIHRoZSBzZXQgb2YgZXhwZWN0ZWQgdG9rZW5zKVxuICAgIHJlY292ZXJhYmxlOiAoYm9vbGVhbjogVFJVRSB3aGVuIHRoZSBwYXJzZXIgaGFzIGEgZXJyb3IgcmVjb3ZlcnkgcnVsZSBhdmFpbGFibGUgZm9yIHRoaXMgcGFydGljdWxhciBlcnJvcilcbiAgfVxuKi9cbnZhciBwYXJzZXIgPSAoZnVuY3Rpb24oKXtcbnZhciBvPWZ1bmN0aW9uKGssdixvLGwpe2ZvcihvPW98fHt9LGw9ay5sZW5ndGg7bC0tO29ba1tsXV09dik7cmV0dXJuIG99LCRWMD1bMSwxMl0sJFYxPVsxLDEzXSwkVjI9WzEsOV0sJFYzPVsxLDEwXSwkVjQ9WzEsMTFdLCRWNT1bMSwxNF0sJFY2PVsxLDE1XSwkVjc9WzE0LDE4LDIyLDI0XSwkVjg9WzE4LDIyXSwkVjk9WzIyLDI0XTtcbnZhciBwYXJzZXIgPSB7dHJhY2U6IGZ1bmN0aW9uIHRyYWNlKCkgeyB9LFxueXk6IHt9LFxuc3ltYm9sc186IHtcImVycm9yXCI6MixcIkpTT05TdHJpbmdcIjozLFwiU1RSSU5HXCI6NCxcIkpTT05OdW1iZXJcIjo1LFwiTlVNQkVSXCI6NixcIkpTT05OdWxsTGl0ZXJhbFwiOjcsXCJOVUxMXCI6OCxcIkpTT05Cb29sZWFuTGl0ZXJhbFwiOjksXCJUUlVFXCI6MTAsXCJGQUxTRVwiOjExLFwiSlNPTlRleHRcIjoxMixcIkpTT05WYWx1ZVwiOjEzLFwiRU9GXCI6MTQsXCJKU09OT2JqZWN0XCI6MTUsXCJKU09OQXJyYXlcIjoxNixcIntcIjoxNyxcIn1cIjoxOCxcIkpTT05NZW1iZXJMaXN0XCI6MTksXCJKU09OTWVtYmVyXCI6MjAsXCI6XCI6MjEsXCIsXCI6MjIsXCJbXCI6MjMsXCJdXCI6MjQsXCJKU09ORWxlbWVudExpc3RcIjoyNSxcIiRhY2NlcHRcIjowLFwiJGVuZFwiOjF9LFxudGVybWluYWxzXzogezI6XCJlcnJvclwiLDQ6XCJTVFJJTkdcIiw2OlwiTlVNQkVSXCIsODpcIk5VTExcIiwxMDpcIlRSVUVcIiwxMTpcIkZBTFNFXCIsMTQ6XCJFT0ZcIiwxNzpcIntcIiwxODpcIn1cIiwyMTpcIjpcIiwyMjpcIixcIiwyMzpcIltcIiwyNDpcIl1cIn0sXG5wcm9kdWN0aW9uc186IFswLFszLDFdLFs1LDFdLFs3LDFdLFs5LDFdLFs5LDFdLFsxMiwyXSxbMTMsMV0sWzEzLDFdLFsxMywxXSxbMTMsMV0sWzEzLDFdLFsxMywxXSxbMTUsMl0sWzE1LDNdLFsyMCwzXSxbMTksMV0sWzE5LDNdLFsxNiwyXSxbMTYsM10sWzI1LDFdLFsyNSwzXV0sXG5wZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSAvKiBhY3Rpb25bMV0gKi8sICQkIC8qIHZzdGFjayAqLywgXyQgLyogbHN0YWNrICovKSB7XG4vKiB0aGlzID09IHl5dmFsICovXG5cbnZhciAkMCA9ICQkLmxlbmd0aCAtIDE7XG5zd2l0Y2ggKHl5c3RhdGUpIHtcbmNhc2UgMTpcbiAvLyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycyB3aXRoIGFjdHVhbCBjaGFyYWN0ZXJcbiAgICAgICAgICB0aGlzLiQgPSBuZXcgU3RyaW5nKHl5dGV4dC5yZXBsYWNlKC9cXFxcKFxcXFx8XCIpL2csIFwiJFwiK1wiMVwiKVxuICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxuL2csJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHIvZywnXFxyJylcbiAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcdC9nLCdcXHQnKVxuICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx2L2csJ1xcdicpXG4gICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXGYvZywnXFxmJylcbiAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcYi9nLCdcXGInKSk7XG4gICAgICAgICAgdGhpcy4kLl9fbGluZV9fID0gIHRoaXMuXyQuZmlyc3RfbGluZTtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgMjpcblxuICAgICAgICAgICAgdGhpcy4kID0gbmV3IE51bWJlcih5eXRleHQpO1xuICAgICAgICAgICAgdGhpcy4kLl9fbGluZV9fID0gIHRoaXMuXyQuZmlyc3RfbGluZTtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgMzpcblxuICAgICAgICAgICAgdGhpcy4kID0gbnVsbDtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgNDpcblxuICAgICAgICAgICAgdGhpcy4kID0gbmV3IEJvb2xlYW4odHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLiQuX19saW5lX18gPSB0aGlzLl8kLmZpcnN0X2xpbmU7XG4gICAgICAgIFxuYnJlYWs7XG5jYXNlIDU6XG5cbiAgICAgICAgICAgIHRoaXMuJCA9IG5ldyBCb29sZWFuKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuJC5fX2xpbmVfXyA9IHRoaXMuXyQuZmlyc3RfbGluZTtcbiAgICAgICAgXG5icmVhaztcbmNhc2UgNjpcbnJldHVybiB0aGlzLiQgPSAkJFskMC0xXTtcbmJyZWFrO1xuY2FzZSAxMzpcbnRoaXMuJCA9IHt9OyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy4kLCAnX19saW5lX18nLCB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fJC5maXJzdF9saW5lLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgfSlcbmJyZWFrO1xuY2FzZSAxNDogY2FzZSAxOTpcbnRoaXMuJCA9ICQkWyQwLTFdOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy4kLCAnX19saW5lX18nLCB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fJC5maXJzdF9saW5lLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgfSlcbmJyZWFrO1xuY2FzZSAxNTpcbnRoaXMuJCA9IFskJFskMC0yXSwgJCRbJDBdXTtcbmJyZWFrO1xuY2FzZSAxNjpcbnRoaXMuJCA9IHt9OyB0aGlzLiRbJCRbJDBdWzBdXSA9ICQkWyQwXVsxXTtcbmJyZWFrO1xuY2FzZSAxNzpcbnRoaXMuJCA9ICQkWyQwLTJdOyAkJFskMC0yXVskJFskMF1bMF1dID0gJCRbJDBdWzFdO1xuYnJlYWs7XG5jYXNlIDE4OlxudGhpcy4kID0gW107IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLiQsICdfX2xpbmVfXycsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl8kLmZpcnN0X2xpbmUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KVxuYnJlYWs7XG5jYXNlIDIwOlxudGhpcy4kID0gWyQkWyQwXV07XG5icmVhaztcbmNhc2UgMjE6XG50aGlzLiQgPSAkJFskMC0yXTsgJCRbJDAtMl0ucHVzaCgkJFskMF0pO1xuYnJlYWs7XG59XG59LFxudGFibGU6IFt7Mzo1LDQ6JFYwLDU6Niw2OiRWMSw3OjMsODokVjIsOTo0LDEwOiRWMywxMTokVjQsMTI6MSwxMzoyLDE1OjcsMTY6OCwxNzokVjUsMjM6JFY2fSx7MTpbM119LHsxNDpbMSwxNl19LG8oJFY3LFsyLDddKSxvKCRWNyxbMiw4XSksbygkVjcsWzIsOV0pLG8oJFY3LFsyLDEwXSksbygkVjcsWzIsMTFdKSxvKCRWNyxbMiwxMl0pLG8oJFY3LFsyLDNdKSxvKCRWNyxbMiw0XSksbygkVjcsWzIsNV0pLG8oWzE0LDE4LDIxLDIyLDI0XSxbMiwxXSksbygkVjcsWzIsMl0pLHszOjIwLDQ6JFYwLDE4OlsxLDE3XSwxOToxOCwyMDoxOX0sezM6NSw0OiRWMCw1OjYsNjokVjEsNzozLDg6JFYyLDk6NCwxMDokVjMsMTE6JFY0LDEzOjIzLDE1OjcsMTY6OCwxNzokVjUsMjM6JFY2LDI0OlsxLDIxXSwyNToyMn0sezE6WzIsNl19LG8oJFY3LFsyLDEzXSksezE4OlsxLDI0XSwyMjpbMSwyNV19LG8oJFY4LFsyLDE2XSksezIxOlsxLDI2XX0sbygkVjcsWzIsMThdKSx7MjI6WzEsMjhdLDI0OlsxLDI3XX0sbygkVjksWzIsMjBdKSxvKCRWNyxbMiwxNF0pLHszOjIwLDQ6JFYwLDIwOjI5fSx7Mzo1LDQ6JFYwLDU6Niw2OiRWMSw3OjMsODokVjIsOTo0LDEwOiRWMywxMTokVjQsMTM6MzAsMTU6NywxNjo4LDE3OiRWNSwyMzokVjZ9LG8oJFY3LFsyLDE5XSksezM6NSw0OiRWMCw1OjYsNjokVjEsNzozLDg6JFYyLDk6NCwxMDokVjMsMTE6JFY0LDEzOjMxLDE1OjcsMTY6OCwxNzokVjUsMjM6JFY2fSxvKCRWOCxbMiwxN10pLG8oJFY4LFsyLDE1XSksbygkVjksWzIsMjFdKV0sXG5kZWZhdWx0QWN0aW9uczogezE2OlsyLDZdfSxcbnBhcnNlRXJyb3I6IGZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7XG4gICAgaWYgKGhhc2gucmVjb3ZlcmFibGUpIHtcbiAgICAgICAgdGhpcy50cmFjZShzdHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpO1xuICAgIH1cbn0sXG5wYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsIHN0YWNrID0gWzBdLCB0c3RhY2sgPSBbXSwgdnN0YWNrID0gW251bGxdLCBsc3RhY2sgPSBbXSwgdGFibGUgPSB0aGlzLnRhYmxlLCB5eXRleHQgPSAnJywgeXlsaW5lbm8gPSAwLCB5eWxlbmcgPSAwLCByZWNvdmVyaW5nID0gMCwgVEVSUk9SID0gMiwgRU9GID0gMTtcbiAgICB2YXIgYXJncyA9IGxzdGFjay5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGxleGVyID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmxleGVyKTtcbiAgICB2YXIgc2hhcmVkU3RhdGUgPSB7IHl5OiB7fSB9O1xuICAgIGZvciAodmFyIGsgaW4gdGhpcy55eSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMueXksIGspKSB7XG4gICAgICAgICAgICBzaGFyZWRTdGF0ZS55eVtrXSA9IHRoaXMueXlba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV4ZXIuc2V0SW5wdXQoaW5wdXQsIHNoYXJlZFN0YXRlLnl5KTtcbiAgICBzaGFyZWRTdGF0ZS55eS5sZXhlciA9IGxleGVyO1xuICAgIHNoYXJlZFN0YXRlLnl5LnBhcnNlciA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiBsZXhlci55eWxsb2MgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbGV4ZXIueXlsbG9jID0ge307XG4gICAgfVxuICAgIHZhciB5eWxvYyA9IGxleGVyLnl5bGxvYztcbiAgICBsc3RhY2sucHVzaCh5eWxvYyk7XG4gICAgdmFyIHJhbmdlcyA9IGxleGVyLm9wdGlvbnMgJiYgbGV4ZXIub3B0aW9ucy5yYW5nZXM7XG4gICAgaWYgKHR5cGVvZiBzaGFyZWRTdGF0ZS55eS5wYXJzZUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHNoYXJlZFN0YXRlLnl5LnBhcnNlRXJyb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLnBhcnNlRXJyb3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcFN0YWNrKG4pIHtcbiAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47XG4gICAgICAgIHZzdGFjay5sZW5ndGggPSB2c3RhY2subGVuZ3RoIC0gbjtcbiAgICAgICAgbHN0YWNrLmxlbmd0aCA9IGxzdGFjay5sZW5ndGggLSBuO1xuICAgIH1cbiAgICBfdG9rZW5fc3RhY2s6XG4gICAgICAgIGZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgICAgIHZhciB0b2tlbjtcbiAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubGV4KCkgfHwgRU9GO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuc3ltYm9sc19bdG9rZW5dIHx8IHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsID0ge30sIHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkge1xuICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTtcbiAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkge1xuICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSAnJztcbiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVybWluYWxzX1twXSAmJiBwID4gVEVSUk9SKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCdcXCcnICsgdGhpcy50ZXJtaW5hbHNfW3BdICsgJ1xcJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZXhlci5zaG93UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJyArICh5eWxpbmVubyArIDEpICsgJzpcXG4nICsgbGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAnXFxuRXhwZWN0aW5nICcgKyBleHBlY3RlZC5qb2luKCcsICcpICsgJywgZ290IFxcJycgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICdcXCcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcgKyAoeXlsaW5lbm8gKyAxKSArICc6IFVuZXhwZWN0ZWQgJyArIChzeW1ib2wgPT0gRU9GID8gJ2VuZCBvZiBpbnB1dCcgOiAnXFwnJyArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgJ1xcJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGxleGVyLm1hdGNoLFxuICAgICAgICAgICAgICAgICAgICB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiBsZXhlci55eWxpbmVubyxcbiAgICAgICAgICAgICAgICAgICAgbG9jOiB5eWxvYyxcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogJyArIHN0YXRlICsgJywgdG9rZW46ICcgKyBzeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgIHZzdGFjay5wdXNoKGxleGVyLnl5dGV4dCk7XG4gICAgICAgICAgICBsc3RhY2sucHVzaChsZXhlci55eWxsb2MpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhY3Rpb25bMV0pO1xuICAgICAgICAgICAgc3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICB5eWxlbmcgPSBsZXhlci55eWxlbmc7XG4gICAgICAgICAgICAgICAgeXl0ZXh0ID0gbGV4ZXIueXl0ZXh0O1xuICAgICAgICAgICAgICAgIHl5bGluZW5vID0gbGV4ZXIueXlsaW5lbm87XG4gICAgICAgICAgICAgICAgeXlsb2MgPSBsZXhlci55eWxsb2M7XG4gICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY292ZXJpbmctLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sO1xuICAgICAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBsZW4gPSB0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzFdO1xuICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVuXTtcbiAgICAgICAgICAgIHl5dmFsLl8kID0ge1xuICAgICAgICAgICAgICAgIGZpcnN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfbGluZSxcbiAgICAgICAgICAgICAgICBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLFxuICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9jb2x1bW4sXG4gICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9jb2x1bW5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgeXl2YWwuXyQucmFuZ2UgPSBbXG4gICAgICAgICAgICAgICAgICAgIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sXG4gICAgICAgICAgICAgICAgICAgIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5hcHBseSh5eXZhbCwgW1xuICAgICAgICAgICAgICAgIHl5dGV4dCxcbiAgICAgICAgICAgICAgICB5eWxlbmcsXG4gICAgICAgICAgICAgICAgeXlsaW5lbm8sXG4gICAgICAgICAgICAgICAgc2hhcmVkU3RhdGUueXksXG4gICAgICAgICAgICAgICAgYWN0aW9uWzFdLFxuICAgICAgICAgICAgICAgIHZzdGFjayxcbiAgICAgICAgICAgICAgICBsc3RhY2tcbiAgICAgICAgICAgIF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsIC0xICogbGVuICogMik7XG4gICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTtcbiAgICAgICAgICAgICAgICBsc3RhY2sgPSBsc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTtcbiAgICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpO1xuICAgICAgICAgICAgbHN0YWNrLnB1c2goeXl2YWwuXyQpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59fTtcbi8qIGdlbmVyYXRlZCBieSBqaXNvbi1sZXggMC4zLjQgKi9cbnZhciBsZXhlciA9IChmdW5jdGlvbigpe1xudmFyIGxleGVyID0gKHtcblxuRU9GOjEsXG5cbnBhcnNlRXJyb3I6ZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICAgICAgaWYgKHRoaXMueXkucGFyc2VyKSB7XG4gICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vIHJlc2V0cyB0aGUgbGV4ZXIsIHNldHMgbmV3IGlucHV0XG5zZXRJbnB1dDpmdW5jdGlvbiAoaW5wdXQsIHl5KSB7XG4gICAgICAgIHRoaXMueXkgPSB5eSB8fCB0aGlzLnl5IHx8IHt9O1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9tb3JlID0gdGhpcy5fYmFja3RyYWNrID0gdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7XG4gICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnO1xuICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrID0gWydJTklUSUFMJ107XG4gICAgICAgIHRoaXMueXlsbG9jID0ge1xuICAgICAgICAgICAgZmlyc3RfbGluZTogMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogMCxcbiAgICAgICAgICAgIGxhc3RfbGluZTogMSxcbiAgICAgICAgICAgIGxhc3RfY29sdW1uOiAwXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFswLDBdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuLy8gY29uc3VtZXMgYW5kIHJldHVybnMgb25lIGNoYXIgZnJvbSB0aGUgaW5wdXRcbmlucHV0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07XG4gICAgICAgIHRoaXMueXl0ZXh0ICs9IGNoO1xuICAgICAgICB0aGlzLnl5bGVuZysrO1xuICAgICAgICB0aGlzLm9mZnNldCsrO1xuICAgICAgICB0aGlzLm1hdGNoICs9IGNoO1xuICAgICAgICB0aGlzLm1hdGNoZWQgKz0gY2g7XG4gICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcXHJcXG4/fFxcbikuKi9nKTtcbiAgICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgICAgICB0aGlzLnl5bGluZW5vKys7XG4gICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfY29sdW1uKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlWzFdKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKDEpO1xuICAgICAgICByZXR1cm4gY2g7XG4gICAgfSxcblxuLy8gdW5zaGlmdHMgb25lIGNoYXIgKG9yIGEgc3RyaW5nKSBpbnRvIHRoZSBpbnB1dFxudW5wdXQ6ZnVuY3Rpb24gKGNoKSB7XG4gICAgICAgIHZhciBsZW4gPSBjaC5sZW5ndGg7XG4gICAgICAgIHZhciBsaW5lcyA9IGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0O1xuICAgICAgICB0aGlzLnl5dGV4dCA9IHRoaXMueXl0ZXh0LnN1YnN0cigwLCB0aGlzLnl5dGV4dC5sZW5ndGggLSBsZW4pO1xuICAgICAgICAvL3RoaXMueXlsZW5nIC09IGxlbjtcbiAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuO1xuICAgICAgICB2YXIgb2xkTGluZXMgPSB0aGlzLm1hdGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG4gICAgICAgIHRoaXMubWF0Y2ggPSB0aGlzLm1hdGNoLnN1YnN0cigwLCB0aGlzLm1hdGNoLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAobGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy55eWxpbmVubyAtPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7XG5cbiAgICAgICAgdGhpcy55eWxsb2MgPSB7XG4gICAgICAgICAgICBmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5maXJzdF9saW5lLFxuICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID9cbiAgICAgICAgICAgICAgICAobGluZXMubGVuZ3RoID09PSBvbGRMaW5lcy5sZW5ndGggPyB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gOiAwKVxuICAgICAgICAgICAgICAgICArIG9sZExpbmVzW29sZExpbmVzLmxlbmd0aCAtIGxpbmVzLmxlbmd0aF0ubGVuZ3RoIC0gbGluZXNbMF0ubGVuZ3RoIDpcbiAgICAgICAgICAgICAgdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIC0gbGVuXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3JbMF0sIHJbMF0gKyB0aGlzLnl5bGVuZyAtIGxlbl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy55eWxlbmcgPSB0aGlzLnl5dGV4dC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbi8vIFdoZW4gY2FsbGVkIGZyb20gYWN0aW9uLCBjYWNoZXMgbWF0Y2hlZCB0ZXh0IGFuZCBhcHBlbmRzIGl0IG9uIG5leHQgYWN0aW9uXG5tb3JlOmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbW9yZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbi8vIFdoZW4gY2FsbGVkIGZyb20gYWN0aW9uLCBzaWduYWxzIHRoZSBsZXhlciB0aGF0IHRoaXMgcnVsZSBmYWlscyB0byBtYXRjaCB0aGUgaW5wdXQsIHNvIHRoZSBuZXh0IG1hdGNoaW5nIHJ1bGUgKHJlZ2V4KSBzaG91bGQgYmUgdGVzdGVkIGluc3RlYWQuXG5yZWplY3Q6ZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgdGhpcy5fYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnICsgKHRoaXMueXlsaW5lbm8gKyAxKSArICcuIFlvdSBjYW4gb25seSBpbnZva2UgcmVqZWN0KCkgaW4gdGhlIGxleGVyIHdoZW4gdGhlIGxleGVyIGlzIG9mIHRoZSBiYWNrdHJhY2tpbmcgcGVyc3Vhc2lvbiAob3B0aW9ucy5iYWNrdHJhY2tfbGV4ZXIgPSB0cnVlKS5cXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdG9rZW46IG51bGwsXG4gICAgICAgICAgICAgICAgbGluZTogdGhpcy55eWxpbmVub1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4vLyByZXRhaW4gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBtYXRjaFxubGVzczpmdW5jdGlvbiAobikge1xuICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0Y2guc2xpY2UobikpO1xuICAgIH0sXG5cbi8vIGRpc3BsYXlzIGFscmVhZHkgbWF0Y2hlZCBpbnB1dCwgaS5lLiBmb3IgZXJyb3IgbWVzc2FnZXNcbnBhc3RJbnB1dDpmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gKHBhc3QubGVuZ3RoID4gMjAgPyAnLi4uJzonJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuXG4vLyBkaXNwbGF5cyB1cGNvbWluZyBpbnB1dCwgaS5lLiBmb3IgZXJyb3IgbWVzc2FnZXNcbnVwY29taW5nSW5wdXQ6ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMubWF0Y2g7XG4gICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7XG4gICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMC1uZXh0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLDIwKSArIChuZXh0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykpLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuXG4vLyBkaXNwbGF5cyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIHdoZXJlIHRoZSBsZXhpbmcgZXJyb3Igb2NjdXJyZWQsIGkuZS4gZm9yIGVycm9yIG1lc3NhZ2VzXG5zaG93UG9zaXRpb246ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTtcbiAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oXCItXCIpO1xuICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyBcIlxcblwiICsgYyArIFwiXlwiO1xuICAgIH0sXG5cbi8vIHRlc3QgdGhlIGxleGVkIHRva2VuOiByZXR1cm4gRkFMU0Ugd2hlbiBub3QgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0b2tlblxudGVzdF9tYXRjaDpmdW5jdGlvbiAobWF0Y2gsIGluZGV4ZWRfcnVsZSkge1xuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIGJhY2t1cDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgLy8gc2F2ZSBjb250ZXh0XG4gICAgICAgICAgICBiYWNrdXAgPSB7XG4gICAgICAgICAgICAgICAgeXlsaW5lbm86IHRoaXMueXlsaW5lbm8sXG4gICAgICAgICAgICAgICAgeXlsbG9jOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2xpbmU6IHRoaXMueXlsbG9jLmZpcnN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy5sYXN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHl5dGV4dDogdGhpcy55eXRleHQsXG4gICAgICAgICAgICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICAgICAgICAgICAgbWF0Y2hlczogdGhpcy5tYXRjaGVzLFxuICAgICAgICAgICAgICAgIG1hdGNoZWQ6IHRoaXMubWF0Y2hlZCxcbiAgICAgICAgICAgICAgICB5eWxlbmc6IHRoaXMueXlsZW5nLFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgX21vcmU6IHRoaXMuX21vcmUsXG4gICAgICAgICAgICAgICAgX2lucHV0OiB0aGlzLl9pbnB1dCxcbiAgICAgICAgICAgICAgICB5eTogdGhpcy55eSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25TdGFjazogdGhpcy5jb25kaXRpb25TdGFjay5zbGljZSgwKSxcbiAgICAgICAgICAgICAgICBkb25lOiB0aGlzLmRvbmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykge1xuICAgICAgICAgICAgICAgIGJhY2t1cC55eWxsb2MucmFuZ2UgPSB0aGlzLnl5bGxvYy5yYW5nZS5zbGljZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueXlsbG9jID0ge1xuICAgICAgICAgICAgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLFxuICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sXG4gICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCAtIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLm1hdGNoKC9cXHI/XFxuPy8pWzBdLmxlbmd0aCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07XG4gICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07XG4gICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoO1xuICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9iYWNrdHJhY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZShtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICB0aGlzLm1hdGNoZWQgKz0gbWF0Y2hbMF07XG4gICAgICAgIHRva2VuID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwodGhpcywgdGhpcy55eSwgdGhpcywgaW5kZXhlZF9ydWxlLCB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMV0pO1xuICAgICAgICBpZiAodGhpcy5kb25lICYmIHRoaXMuX2lucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9iYWNrdHJhY2spIHtcbiAgICAgICAgICAgIC8vIHJlY292ZXIgY29udGV4dFxuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBiYWNrdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tdID0gYmFja3VwW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBydWxlIGFjdGlvbiBjYWxsZWQgcmVqZWN0KCkgaW1wbHlpbmcgdGhlIG5leHQgcnVsZSBzaG91bGQgYmUgdGVzdGVkIGluc3RlYWQuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbi8vIHJldHVybiBuZXh0IG1hdGNoIGluIGlucHV0XG5uZXh0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIHRlbXBNYXRjaCxcbiAgICAgICAgICAgIGluZGV4O1xuICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHtcbiAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5fY3VycmVudFJ1bGVzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTtcbiAgICAgICAgICAgIGlmICh0ZW1wTWF0Y2ggJiYgKCFtYXRjaCB8fCB0ZW1wTWF0Y2hbMF0ubGVuZ3RoID4gbWF0Y2hbMF0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMudGVzdF9tYXRjaCh0ZW1wTWF0Y2gsIHJ1bGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JhY2t0cmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBydWxlIGFjdGlvbiBjYWxsZWQgcmVqZWN0KCkgaW1wbHlpbmcgYSBydWxlIE1JU21hdGNoLlxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZTogdGhpcyBpcyBhIGxleGVyIHJ1bGUgd2hpY2ggY29uc3VtZXMgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYSB0b2tlbiAoZS5nLiB3aGl0ZXNwYWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25zLmZsZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnRlc3RfbWF0Y2gobWF0Y2gsIHJ1bGVzW2luZGV4XSk7XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZTogdGhpcyBpcyBhIGxleGVyIHJ1bGUgd2hpY2ggY29uc3VtZXMgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYSB0b2tlbiAoZS5nLiB3aGl0ZXNwYWNlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXFxuJyArIHRoaXMuc2hvd1Bvc2l0aW9uKCksIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgICAgICAgIHRva2VuOiBudWxsLFxuICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMueXlsaW5lbm9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuLy8gcmV0dXJuIG5leHQgbWF0Y2ggdGhhdCBoYXMgYSB0b2tlblxubGV4OmZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm5leHQoKTtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV4KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyBhY3RpdmF0ZXMgYSBuZXcgbGV4ZXIgY29uZGl0aW9uIHN0YXRlIChwdXNoZXMgdGhlIG5ldyBsZXhlciBjb25kaXRpb24gc3RhdGUgb250byB0aGUgY29uZGl0aW9uIHN0YWNrKVxuYmVnaW46ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pO1xuICAgIH0sXG5cbi8vIHBvcCB0aGUgcHJldmlvdXNseSBhY3RpdmUgbGV4ZXIgY29uZGl0aW9uIHN0YXRlIG9mZiB0aGUgY29uZGl0aW9uIHN0YWNrXG5wb3BTdGF0ZTpmdW5jdGlvbiBwb3BTdGF0ZSgpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFja1swXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vIHByb2R1Y2UgdGhlIGxleGVyIHJ1bGUgc2V0IHdoaWNoIGlzIGFjdGl2ZSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgbGV4ZXIgY29uZGl0aW9uIHN0YXRlXG5fY3VycmVudFJ1bGVzOmZ1bmN0aW9uIF9jdXJyZW50UnVsZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAmJiB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbXCJJTklUSUFMXCJdLnJ1bGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuLy8gcmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIGxleGVyIGNvbmRpdGlvbiBzdGF0ZTsgd2hlbiBhbiBpbmRleCBhcmd1bWVudCBpcyBwcm92aWRlZCBpdCBwcm9kdWNlcyB0aGUgTi10aCBwcmV2aW91cyBjb25kaXRpb24gc3RhdGUsIGlmIGF2YWlsYWJsZVxudG9wU3RhdGU6ZnVuY3Rpb24gdG9wU3RhdGUobikge1xuICAgICAgICBuID0gdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxIC0gTWF0aC5hYnMobiB8fCAwKTtcbiAgICAgICAgaWYgKG4gPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbbl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJTklUSUFMXCI7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyBhbGlhcyBmb3IgYmVnaW4oY29uZGl0aW9uKVxucHVzaFN0YXRlOmZ1bmN0aW9uIHB1c2hTdGF0ZShjb25kaXRpb24pIHtcbiAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24pO1xuICAgIH0sXG5cbi8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHN0YXRlcyBjdXJyZW50bHkgb24gdGhlIHN0YWNrXG5zdGF0ZVN0YWNrU2l6ZTpmdW5jdGlvbiBzdGF0ZVN0YWNrU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoO1xuICAgIH0sXG5vcHRpb25zOiB7fSxcbnBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eSx5eV8sJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucyxZWV9TVEFSVCkge1xudmFyIFlZU1RBVEU9WVlfU1RBUlQ7XG5zd2l0Y2goJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykge1xuY2FzZSAwOi8qIHNraXAgd2hpdGVzcGFjZSAqL1xuYnJlYWs7XG5jYXNlIDE6cmV0dXJuIDZcbmJyZWFrO1xuY2FzZSAyOnl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cigxLHl5Xy55eWxlbmctMik7IHJldHVybiA0XG5icmVhaztcbmNhc2UgMzpyZXR1cm4gMTdcbmJyZWFrO1xuY2FzZSA0OnJldHVybiAxOFxuYnJlYWs7XG5jYXNlIDU6cmV0dXJuIDIzXG5icmVhaztcbmNhc2UgNjpyZXR1cm4gMjRcbmJyZWFrO1xuY2FzZSA3OnJldHVybiAyMlxuYnJlYWs7XG5jYXNlIDg6cmV0dXJuIDIxXG5icmVhaztcbmNhc2UgOTpyZXR1cm4gMTBcbmJyZWFrO1xuY2FzZSAxMDpyZXR1cm4gMTFcbmJyZWFrO1xuY2FzZSAxMTpyZXR1cm4gOFxuYnJlYWs7XG5jYXNlIDEyOnJldHVybiAxNFxuYnJlYWs7XG5jYXNlIDEzOnJldHVybiAnSU5WQUxJRCdcbmJyZWFrO1xufVxufSxcbnJ1bGVzOiBbL14oPzpcXHMrKS8sL14oPzooLT8oWzAtOV18WzEtOV1bMC05XSspKShcXC5bMC05XSspPyhbZUVdWy0rXT9bMC05XSspP1xcYikvLC9eKD86XCIoPzpcXFxcW1xcXFxcImJmbnJ0L118XFxcXHVbYS1mQS1GMC05XXs0fXxbXlxcXFxcXDAtXFx4MDlcXHgwYS1cXHgxZlwiXSkqXCIpLywvXig/OlxceykvLC9eKD86XFx9KS8sL14oPzpcXFspLywvXig/OlxcXSkvLC9eKD86LCkvLC9eKD86OikvLC9eKD86dHJ1ZVxcYikvLC9eKD86ZmFsc2VcXGIpLywvXig/Om51bGxcXGIpLywvXig/OiQpLywvXig/Oi4pL10sXG5jb25kaXRpb25zOiB7XCJJTklUSUFMXCI6e1wicnVsZXNcIjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM10sXCJpbmNsdXNpdmVcIjp0cnVlfX1cbn0pO1xucmV0dXJuIGxleGVyO1xufSkoKTtcbnBhcnNlci5sZXhlciA9IGxleGVyO1xuZnVuY3Rpb24gUGFyc2VyICgpIHtcbiAgdGhpcy55eSA9IHt9O1xufVxuUGFyc2VyLnByb3RvdHlwZSA9IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFyc2VyO1xucmV0dXJuIG5ldyBQYXJzZXI7XG59KSgpO1xuXG5cbmlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG5leHBvcnRzLnBhcnNlciA9IHBhcnNlcjtcbmV4cG9ydHMuUGFyc2VyID0gcGFyc2VyLlBhcnNlcjtcbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXJzZXIucGFyc2UuYXBwbHkocGFyc2VyLCBhcmd1bWVudHMpOyB9O1xufVxuIiwiaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL2Vycm9yL3BhcnNpbmdfZXJyb3IuanMnO1xuaW1wb3J0IGpzb25saW50IGZyb20gJ0BtYXBib3gvanNvbmxpbnQtbGluZXMtcHJpbWl0aXZlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlYWRTdHlsZShzdHlsZSkge1xuICAgIGlmIChzdHlsZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnIHx8IHN0eWxlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4ganNvbmxpbnQucGFyc2Uoc3R5bGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzaW5nRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZVN0eWxlTWluIGZyb20gJy4vdmFsaWRhdGVfc3R5bGUubWluLmpzJztcbmltcG9ydCB7djh9IGZyb20gJy4vc3R5bGUtc3BlYy5qcyc7XG5pbXBvcnQgcmVhZFN0eWxlIGZyb20gJy4vcmVhZF9zdHlsZS5qcyc7XG5cbi8qKlxuICogVmFsaWRhdGUgYSBNYXBib3ggR0wgc3R5bGUgYWdhaW5zdCB0aGUgc3R5bGUgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGFsaWFzIHZhbGlkYXRlXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8QnVmZmVyfSBzdHlsZSBUaGUgc3R5bGUgdG8gYmUgdmFsaWRhdGVkLiBJZiBhIGBTdHJpbmdgXG4gKiAgICAgb3IgYEJ1ZmZlcmAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBlcnJvcnMgd2lsbCBjb250YWluIGxpbmUgbnVtYmVycy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBzcGVjIHZlcnNpb24gaXMgaW5mZXJyZWQgZnJvbSB0aGUgc3R5bGVzaGVldC5cbiAqIEByZXR1cm5zIHtBcnJheTxWYWxpZGF0aW9uRXJyb3J8UGFyc2luZ0Vycm9yPn1cbiAqIEBleGFtcGxlXG4gKiAgIHZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjJykudmFsaWRhdGU7XG4gKiAgIHZhciBzdHlsZSA9IGZzLnJlYWRGaWxlU3luYygnLi9zdHlsZS5qc29uJywgJ3V0ZjgnKTtcbiAqICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKHN0eWxlKTtcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlKHN0eWxlLCBzdHlsZVNwZWMgPSB2OCkge1xuICAgIGxldCBzID0gc3R5bGU7XG5cbiAgICB0cnkge1xuICAgICAgICBzID0gcmVhZFN0eWxlKHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIFtlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVTdHlsZU1pbihzLCBzdHlsZVNwZWMpO1xufVxuXG5leHBvcnQgY29uc3Qgc291cmNlID0gdmFsaWRhdGVTdHlsZU1pbi5zb3VyY2U7XG5leHBvcnQgY29uc3QgbGlnaHQgPSB2YWxpZGF0ZVN0eWxlTWluLmxpZ2h0O1xuZXhwb3J0IGNvbnN0IGxheWVyID0gdmFsaWRhdGVTdHlsZU1pbi5sYXllcjtcbmV4cG9ydCBjb25zdCBmaWx0ZXIgPSB2YWxpZGF0ZVN0eWxlTWluLmZpbHRlcjtcbmV4cG9ydCBjb25zdCBwYWludFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5O1xuZXhwb3J0IGNvbnN0IGxheW91dFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZU1pbi5sYXlvdXRQcm9wZXJ0eTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB2YWxpZGF0ZVN0eWxlIGZyb20gJy4vdmFsaWRhdGVfc3R5bGUubWluLmpzJztcbmltcG9ydCB7djh9IGZyb20gJy4vc3R5bGUtc3BlYy5qcyc7XG5pbXBvcnQgcmVhZFN0eWxlIGZyb20gJy4vcmVhZF9zdHlsZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuL3V0aWwvZ2V0X3R5cGUuanMnO1xuXG5jb25zdCBTVVBQT1JURURfU1BFQ19WRVJTSU9OID0gODtcbmNvbnN0IE1BWF9TT1VSQ0VTX0lOX1NUWUxFID0gMTU7XG5cbmZ1bmN0aW9uIGlzVmFsaWQodmFsdWU6ID9zdHJpbmcsIHJlZ2V4OiBSZWdFeHApOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlIHx8IGdldFR5cGUodmFsdWUpICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdmFsdWUubWF0Y2gocmVnZXgpO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb3VudChzb3VyY2U6IE9iamVjdCk6IG51bWJlciB7XG4gICAgaWYgKHNvdXJjZS51cmwpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS51cmwuc3BsaXQoJywnKS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxvd2VkS2V5RXJyb3JzKG9iajogT2JqZWN0LCBrZXlzOiBBcnJheTwqPiwgcGF0aDogP3N0cmluZyk6IEFycmF5PD9WYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChrZXlzKTtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmICghYWxsb3dlZC5oYXMoaykpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwYXRoID8gYCR7cGF0aH0uJHtrfWAgOiBudWxsO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihwcm9wLCBvYmpba10sIGBVbnN1cHBvcnRlZCBwcm9wZXJ0eSBcIiR7a31cImApKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlcnJvcnM7XG59XG5cbmNvbnN0IGFjY2VwdGVkU291cmNlVHlwZXMgPSBuZXcgU2V0KFtcInZlY3RvclwiLCBcInJhc3RlclwiLCBcInJhc3Rlci1kZW1cIl0pO1xuZnVuY3Rpb24gZ2V0U291cmNlRXJyb3JzKHNvdXJjZTogT2JqZWN0LCBpOiBudW1iZXIpOiBBcnJheTw/VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG5cbiAgICAvKlxuICAgICAqIElubGluZWQgc291cmNlcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgTWFwYm94IFN0eWxlcyBBUEksIHNvIG9ubHlcbiAgICAgKiBcInR5cGVcIiwgXCJ1cmxcIiwgYW5kIFwidGlsZVNpemVcIiBwcm9wZXJ0aWVzIGFyZSB2YWxpZFxuICAgICAqL1xuICAgIGNvbnN0IHNvdXJjZUtleXMgPSBbJ3R5cGUnLCAndXJsJywgJ3RpbGVTaXplJ107XG4gICAgZXJyb3JzLnB1c2goLi4uZ2V0QWxsb3dlZEtleUVycm9ycyhzb3VyY2UsIHNvdXJjZUtleXMsICdzb3VyY2UnKSk7XG5cbiAgICAvKlxuICAgICAqIFwidHlwZVwiIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9uZSBvZiBcInZlY3RvclwiLCBcInJhc3RlclwiLCBcInJhc3Rlci1kZW1cIlxuICAgICAqL1xuICAgIGlmICghYWNjZXB0ZWRTb3VyY2VUeXBlcy5oYXMoU3RyaW5nKHNvdXJjZS50eXBlKSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlc1ske2l9XS50eXBlYCwgc291cmNlLnR5cGUsIGBFeHBlY3RlZCBvbmUgb2YgWyR7QXJyYXkuZnJvbShhY2NlcHRlZFNvdXJjZVR5cGVzKS5qb2luKFwiLCBcIil9XWApKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFwic291cmNlXCIgaXMgcmVxdWlyZWQuIFZhbGlkIGV4YW1wbGVzOlxuICAgICAqIG1hcGJveDovL21hcGJveC5hYmNkMTIzNFxuICAgICAqIG1hcGJveDovL3Blbm55LmFiY2QxMjM0XG4gICAgICogbWFwYm94Oi8vbWFwYm94LmFiY2QxMjM0LHBlbm55LmFiY2QxMjM0XG4gICAgICovXG4gICAgY29uc3Qgc291cmNlVXJsUGF0dGVybiA9IC9ebWFwYm94OlxcL1xcLyhbXi9dKikkLztcbiAgICBpZiAoIXNvdXJjZS51cmwgfHwgIWlzVmFsaWQoc291cmNlLnVybCwgc291cmNlVXJsUGF0dGVybikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlc1ske2l9XS51cmxgLCBzb3VyY2UudXJsLCAnRXhwZWN0ZWQgYSB2YWxpZCBNYXBib3ggdGlsZXNldCB1cmwnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlc0Vycm9ycyhzb3VyY2VzOiBPYmplY3QpOiBBcnJheTw/VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIE9iamVjdC5rZXlzKHNvdXJjZXMpLmZvckVhY2goKHM6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUVycm9ycyA9IGdldFNvdXJjZUVycm9ycyhzb3VyY2VzW3NdLCBpKTtcblxuICAgICAgICAvLyBJZiBzb3VyY2UgaGFzIGVycm9ycywgc2tpcCBjb3VudGluZ1xuICAgICAgICBpZiAoIXNvdXJjZUVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyBnZXRTb3VyY2VDb3VudChzb3VyY2VzW3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnNvdXJjZUVycm9ycyk7XG4gICAgfSk7XG5cbiAgICBpZiAoY291bnQgPiBNQVhfU09VUkNFU19JTl9TVFlMRSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKCdzb3VyY2VzJywgbnVsbCwgYFN0eWxlcyBtdXN0IGNvbnRhaW4gJHtNQVhfU09VUkNFU19JTl9TVFlMRX0gb3IgZmV3ZXIgc291cmNlc2ApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RXJyb3JzKHN0eWxlOiBPYmplY3QsIHNwZWNLZXlzOiBBcnJheTxhbnk+KTogQXJyYXk8P1ZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgLypcbiAgICAgKiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIG9wdGlvbmFsIGJ1dCBmdWxseSBtYW5hZ2VkIGJ5IHRoZSBNYXBib3ggU3R5bGVzXG4gICAgICogQVBJLiBWYWx1ZXMgb24gc3R5bGVzaGVldCBvbiBQT1NUIG9yIFBBVENIIHdpbGwgYmUgaWdub3JlZDogXCJvd25lclwiLFxuICAgICAqIFwiaWRcIiwgXCJjYWNoZUNvbnRyb2xcIiwgXCJkcmFmdFwiLCBcImNyZWF0ZWRcIiwgXCJtb2RpZmllZFwiXG4gICAgICpcbiAgICAgKiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIG9wdGlvbmFsLiBUaGUgTWFwYm94IFN0eWxlcyBBUEkgcmVzcGVjdHMgdmFsdWUgb25cbiAgICAgKiBzdHlsZXNoZWV0IG9uIFBBVENILCBidXQgaWdub3JlcyB0aGUgdmFsdWUgb24gUE9TVDogXCJ2aXNpYmlsaXR5XCJcbiAgICAgKi9cbiAgICBjb25zdCBvcHRpb25hbFJvb3RQcm9wZXJ0aWVzID0gW1xuICAgICAgICAnb3duZXInLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnY2FjaGVDb250cm9sJyxcbiAgICAgICAgJ2RyYWZ0JyxcbiAgICAgICAgJ2NyZWF0ZWQnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAndmlzaWJpbGl0eSdcbiAgICBdO1xuXG4gICAgY29uc3QgYWxsb3dlZEtleUVycm9ycyA9IGdldEFsbG93ZWRLZXlFcnJvcnMoc3R5bGUsIFsuLi5zcGVjS2V5cywgLi4ub3B0aW9uYWxSb290UHJvcGVydGllc10pO1xuICAgIGVycm9ycy5wdXNoKC4uLmFsbG93ZWRLZXlFcnJvcnMpO1xuXG4gICAgaWYgKHN0eWxlLnZlcnNpb24gPiBTVVBQT1JURURfU1BFQ19WRVJTSU9OIHx8IHN0eWxlLnZlcnNpb24gPCBTVVBQT1JURURfU1BFQ19WRVJTSU9OKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoJ3ZlcnNpb24nLCBzdHlsZS52ZXJzaW9uLCBgU3R5bGUgdmVyc2lvbiBtdXN0IGJlICR7U1VQUE9SVEVEX1NQRUNfVkVSU0lPTn1gKSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBcImdseXBoc1wiIGlzIG9wdGlvbmFsLiBJZiBwcmVzZW50LCB2YWxpZCBleGFtcGxlczpcbiAgICAgKiBtYXBib3g6Ly9mb250cy9wZW5ueS97Zm9udHN0YWNrfS97cmFuZ2V9LnBiZlxuICAgICAqIG1hcGJveDovL2ZvbnRzL21hcGJveC97Zm9udHN0YWNrfS97cmFuZ2V9LnBiZlxuICAgICAqL1xuICAgIGNvbnN0IGdseXBoVXJsUGF0dGVybiA9IC9ebWFwYm94OlxcL1xcL2ZvbnRzXFwvKFteL10qKVxcL3tmb250c3RhY2t9XFwve3JhbmdlfS5wYmYkLztcbiAgICBpZiAoIWlzVmFsaWQoc3R5bGUuZ2x5cGhzLCBnbHlwaFVybFBhdHRlcm4pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoJ2dseXBocycsIHN0eWxlLmdseXBocywgJ1N0eWxlcyBtdXN0IHJlZmVyZW5jZSBnbHlwaHMgaG9zdGVkIGJ5IE1hcGJveCcpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFwic3ByaXRlXCIgaXMgb3B0aW9uYWwuIElmIHByZXNlbnQsIHZhbGlkIGV4YW1wbGVzOlxuICAgICAqIG1hcGJveDovL3Nwcml0ZXMvcGVubnkvYWJjZDEyMzRcbiAgICAgKiBtYXBib3g6Ly9zcHJpdGVzL21hcGJveC9hYmNkMTIzNC9kcmFmdFxuICAgICAqIG1hcGJveDovL3Nwcml0ZXMvY3lydXMvYWJjZDEyMzQvYWJjZDEyMzRcbiAgICAgKi9cbiAgICBjb25zdCBzcHJpdGVVcmxQYXR0ZXJuID0gL15tYXBib3g6XFwvXFwvc3ByaXRlc1xcLyhbXi9dKilcXC8oW14vXSopXFwvPyhbXi9dKik/JC87XG4gICAgaWYgKCFpc1ZhbGlkKHN0eWxlLnNwcml0ZSwgc3ByaXRlVXJsUGF0dGVybikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcignc3ByaXRlJywgc3R5bGUuc3ByaXRlLCAnU3R5bGVzIG11c3QgcmVmZXJlbmNlIHNwcml0ZXMgaG9zdGVkIGJ5IE1hcGJveCcpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFwidmlzaWJpbGl0eVwiIGlzIG9wdGlvbmFsLiBJZiBwcmVzZW50LCB2YWxpZCBleGFtcGxlczpcbiAgICAgKiBcInByaXZhdGVcIlxuICAgICAqIFwicHVibGljXCJcbiAgICAgKi9cbiAgICBjb25zdCB2aXNpYmlsaXR5UGF0dGVybiA9IC9eKHB1YmxpY3xwcml2YXRlKSQvO1xuICAgIGlmICghaXNWYWxpZChzdHlsZS52aXNpYmlsaXR5LCB2aXNpYmlsaXR5UGF0dGVybikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcigndmlzaWJpbGl0eScsIHN0eWxlLnZpc2liaWxpdHksICdTdHlsZSB2aXNpYmlsaXR5IG11c3QgYmUgcHVibGljIG9yIHByaXZhdGUnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIE1hcGJveCBHTCBzdHlsZSBhZ2FpbnN0IHRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uIGFuZCBjaGVjayBmb3JcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTWFwYm94IFN0eWxlcyBBUEkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlIFRoZSBzdHlsZSB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyB7QXJyYXk8VmFsaWRhdGlvbkVycm9yPn1cbiAqIEBleGFtcGxlXG4gKiAgIHZhciB2YWxpZGF0ZU1hcGJveEFwaVN1cHBvcnRlZCA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZV9zdHlsZV9tYXBib3hfYXBpX3N1cHBvcnRlZC5qcycpO1xuICogICB2YXIgZXJyb3JzID0gdmFsaWRhdGVNYXBib3hBcGlTdXBwb3J0ZWQoc3R5bGUpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU1hcGJveEFwaVN1cHBvcnRlZChzdHlsZTogT2JqZWN0KTogQXJyYXk8P1ZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGxldCBzID0gc3R5bGU7XG4gICAgdHJ5IHtcbiAgICAgICAgcyA9IHJlYWRTdHlsZShzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBbZV07XG4gICAgfVxuXG4gICAgbGV0IGVycm9ycyA9IHZhbGlkYXRlU3R5bGUocywgdjgpXG4gICAgICAgIC5jb25jYXQoZ2V0Um9vdEVycm9ycyhzLCBPYmplY3Qua2V5cyh2OC4kcm9vdCkpKTtcblxuICAgIGlmIChzLnNvdXJjZXMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChnZXRTb3VyY2VzRXJyb3JzKHMuc291cmNlcykpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG50eXBlIEV4cHJlc3Npb25UeXBlID0gJ2RhdGEtZHJpdmVuJyB8ICdjcm9zcy1mYWRlZCcgfCAnY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW4nIHwgJ2NvbG9yLXJhbXAnIHwgJ2RhdGEtY29uc3RhbnQnIHwgJ2NvbnN0YW50JztcbnR5cGUgRXhwcmVzc2lvblBhcmFtZXRlcnMgPSBBcnJheTwnem9vbScgfCAnZmVhdHVyZScgfCAnZmVhdHVyZS1zdGF0ZScgfCAnaGVhdG1hcC1kZW5zaXR5JyB8ICdsaW5lLXByb2dyZXNzJyB8ICdza3ktcmFkaWFsLXByb2dyZXNzJz47XG5cbnR5cGUgRXhwcmVzc2lvblNwZWNpZmljYXRpb24gPSB7XG4gICAgaW50ZXJwb2xhdGVkOiBib29sZWFuLFxuICAgIHBhcmFtZXRlcnM6IEV4cHJlc3Npb25QYXJhbWV0ZXJzXG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uID0ge1xuICAgIHR5cGU6ICdudW1iZXInLFxuICAgICdwcm9wZXJ0eS10eXBlJzogRXhwcmVzc2lvblR5cGUsXG4gICAgZXhwcmVzc2lvbj86IEV4cHJlc3Npb25TcGVjaWZpY2F0aW9uLFxuICAgIHRyYW5zaXRpb246IGJvb2xlYW4sXG4gICAgZGVmYXVsdD86IG51bWJlclxufSB8IHtcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAncHJvcGVydHktdHlwZSc6IEV4cHJlc3Npb25UeXBlLFxuICAgIGV4cHJlc3Npb24/OiBFeHByZXNzaW9uU3BlY2lmaWNhdGlvbixcbiAgICB0cmFuc2l0aW9uOiBib29sZWFuLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmcsXG4gICAgdG9rZW5zPzogYm9vbGVhblxufSB8IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgdHJhbnNpdGlvbjogYm9vbGVhbixcbiAgICBkZWZhdWx0PzogYm9vbGVhblxufSB8IHtcbiAgICB0eXBlOiAnZW51bScsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgdmFsdWVzOiB7W186IHN0cmluZ106IHt9fSxcbiAgICB0cmFuc2l0aW9uOiBib29sZWFuLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmdcbn0gfCB7XG4gICAgdHlwZTogJ2NvbG9yJyxcbiAgICAncHJvcGVydHktdHlwZSc6IEV4cHJlc3Npb25UeXBlLFxuICAgIGV4cHJlc3Npb24/OiBFeHByZXNzaW9uU3BlY2lmaWNhdGlvbixcbiAgICB0cmFuc2l0aW9uOiBib29sZWFuLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmcsXG4gICAgb3ZlcnJpZGFibGU6IGJvb2xlYW5cbn0gfCB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICB2YWx1ZTogJ251bWJlcicsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIHRyYW5zaXRpb246IGJvb2xlYW4sXG4gICAgZGVmYXVsdD86IEFycmF5PG51bWJlcj5cbn0gfCB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICB2YWx1ZTogJ3N0cmluZycsXG4gICAgJ3Byb3BlcnR5LXR5cGUnOiBFeHByZXNzaW9uVHlwZSxcbiAgICBleHByZXNzaW9uPzogRXhwcmVzc2lvblNwZWNpZmljYXRpb24sXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIHRyYW5zaXRpb246IGJvb2xlYW4sXG4gICAgZGVmYXVsdD86IEFycmF5PHN0cmluZz5cbn07XG5cbmltcG9ydCB2OCBmcm9tICcuL3JlZmVyZW5jZS92OC5qc29uJztcbmltcG9ydCBsYXRlc3QgZnJvbSAnLi9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCBmb3JtYXQgZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IG1pZ3JhdGUgZnJvbSAnLi9taWdyYXRlLmpzJztcbmltcG9ydCBjb21wb3NpdGUgZnJvbSAnLi9jb21wb3NpdGUuanMnO1xuaW1wb3J0IGRlcmVmTGF5ZXJzIGZyb20gJy4vZGVyZWYuanMnO1xuaW1wb3J0IGRpZmYgZnJvbSAnLi9kaWZmLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9lcnJvci9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCB7U3R5bGVFeHByZXNzaW9uLCBpc0V4cHJlc3Npb24sIGNyZWF0ZUV4cHJlc3Npb24sIGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbiwgbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uLCBab29tQ29uc3RhbnRFeHByZXNzaW9uLCBab29tRGVwZW5kZW50RXhwcmVzc2lvbiwgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9ufSBmcm9tICcuL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IGZlYXR1cmVGaWx0ZXIsIHtpc0V4cHJlc3Npb25GaWx0ZXJ9IGZyb20gJy4vZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuXG5pbXBvcnQgY29udmVydEZpbHRlciBmcm9tICcuL2ZlYXR1cmVfZmlsdGVyL2NvbnZlcnQuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4vdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQge2NyZWF0ZUZ1bmN0aW9uLCBpc0Z1bmN0aW9ufSBmcm9tICcuL2Z1bmN0aW9uL2luZGV4LmpzJztcbmltcG9ydCBjb252ZXJ0RnVuY3Rpb24gZnJvbSAnLi9mdW5jdGlvbi9jb252ZXJ0LmpzJztcbmltcG9ydCB7ZWFjaFNvdXJjZSwgZWFjaExheWVyLCBlYWNoUHJvcGVydHl9IGZyb20gJy4vdmlzaXQuanMnO1xuXG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZV9zdHlsZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVNYXBib3hBcGlTdXBwb3J0ZWQgZnJvbSAnLi92YWxpZGF0ZV9tYXBib3hfYXBpX3N1cHBvcnRlZC5qcyc7XG5cbmNvbnN0IGV4cHJlc3Npb24gPSB7XG4gICAgU3R5bGVFeHByZXNzaW9uLFxuICAgIGlzRXhwcmVzc2lvbixcbiAgICBpc0V4cHJlc3Npb25GaWx0ZXIsXG4gICAgY3JlYXRlRXhwcmVzc2lvbixcbiAgICBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24sXG4gICAgbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIFpvb21Db25zdGFudEV4cHJlc3Npb24sXG4gICAgWm9vbURlcGVuZGVudEV4cHJlc3Npb24sXG4gICAgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uXG59O1xuXG5jb25zdCBzdHlsZUZ1bmN0aW9uID0ge1xuICAgIGNvbnZlcnRGdW5jdGlvbixcbiAgICBjcmVhdGVGdW5jdGlvbixcbiAgICBpc0Z1bmN0aW9uXG59O1xuXG5jb25zdCB2aXNpdCA9IHtlYWNoU291cmNlLCBlYWNoTGF5ZXIsIGVhY2hQcm9wZXJ0eX07XG5cbmV4cG9ydCB7XG4gICAgdjgsXG4gICAgbGF0ZXN0LFxuICAgIGZvcm1hdCxcbiAgICBtaWdyYXRlLFxuICAgIGNvbXBvc2l0ZSxcbiAgICBkZXJlZkxheWVycyxcbiAgICBkaWZmLFxuICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICBQYXJzaW5nRXJyb3IsXG4gICAgZXhwcmVzc2lvbixcbiAgICBmZWF0dXJlRmlsdGVyLFxuICAgIGNvbnZlcnRGaWx0ZXIsXG4gICAgQ29sb3IsXG4gICAgc3R5bGVGdW5jdGlvbiBhcyBmdW5jdGlvbixcbiAgICB2YWxpZGF0ZSxcbiAgICB2YWxpZGF0ZU1hcGJveEFwaVN1cHBvcnRlZCxcbiAgICB2aXNpdFxufTtcblxudmFsaWRhdGUucGFyc2VkID0gdmFsaWRhdGU7XG52YWxpZGF0ZS5sYXRlc3QgPSB2YWxpZGF0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@mapbox/mapbox-gl-style-spec/dist/index.es.js\n"); /***/ }), @@ -1482,7 +1482,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*! exports provided: name, description, version, date, leafletExtName, leafletExtVersion, olExtName, olExtVersion, itownsExtName, itownsExtVersion, main, types, module, directories, scripts, repository, author, keywords, license, bugs, homepage, dependencies, devDependencies, default */ /***/ (function(module) { -eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"geoportal-extensions\\\",\\\"description\\\":\\\"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries\\\",\\\"version\\\":\\\"3.0.3\\\",\\\"date\\\":\\\"14/05/2024\\\",\\\"leafletExtName\\\":\\\"French Geoportal Extension for Leaflet\\\",\\\"leafletExtVersion\\\":\\\"2.4.0\\\",\\\"olExtName\\\":\\\"French Geoportal Extension for OpenLayers\\\",\\\"olExtVersion\\\":\\\"3.4.3\\\",\\\"itownsExtName\\\":\\\"French Geoportal Extension for Itowns\\\",\\\"itownsExtVersion\\\":\\\"2.5.0\\\",\\\"main\\\":\\\"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js\\\",\\\"types\\\":\\\"dist/leaflet/index.d.ts, dist/openlayers/index.d.ts, dist/itowns/index.d.ts\\\",\\\"module\\\":\\\"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js\\\",\\\"directories\\\":{},\\\"scripts\\\":{\\\"setup\\\":\\\"npm install\\\",\\\"clean\\\":\\\"echo \\\\\\\"Warning: target not yet implemented!\\\\\\\" && exit 0\\\",\\\"eslint\\\":\\\"eslint src/\\\",\\\"test\\\":\\\"npm run test:serve\\\",\\\"test:serve\\\":\\\"cd test && webpack-dev-server --hot --config webpack.test.serve.js\\\",\\\"sample\\\":\\\"npm run sample:serve\\\",\\\"sample:serve\\\":\\\"npm run sample:ol:serve\\\",\\\"sample:itowns:serve\\\":\\\"webpack-dev-server --config build/webpack/webpack.config.itowns --mode=development --https --open-page samples/index-itowns-map.html --content-base . --output-public-path '/dist/itowns/' --port 9001 --open\\\",\\\"sample:leaflet:serve\\\":\\\"webpack-dev-server --config build/webpack/webpack.config.leaflet --mode=development --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path '/dist/leaflet/' --port 9001 --open\\\",\\\"sample:ol:serve\\\":\\\"webpack-dev-server --config build/webpack/webpack.config.openlayers --mode=development --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path '/dist/openlayers/' --port 9001 --open\\\",\\\"generate-types:ol\\\":\\\"npx tsc -p build/types/tsconfig-openlayers.json\\\",\\\"generate-types:leaflet\\\":\\\"npx tsc -p build/types/tsconfig-leaflet.json\\\",\\\"generate-types:itowns\\\":\\\"npx tsc -p build/types/tsconfig-itowns.json\\\",\\\"generate-jsdoc:ol\\\":\\\"jsdoc -c build/jsdoc/jsdoc-openlayers.json\\\",\\\"generate-jsdoc:leaflet\\\":\\\"jsdoc -c build/jsdoc/jsdoc-leaflet.json\\\",\\\"generate-jsdoc:itowns\\\":\\\"jsdoc -c build/jsdoc/jsdoc-itowns.json\\\",\\\"doc\\\":\\\"npm run doc:serve\\\",\\\"doc:serve\\\":\\\"npm run doc:ol:serve\\\",\\\"doc:itowns:serve\\\":\\\"webpack-dev-server --hot --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open\\\",\\\"doc:leaflet:serve\\\":\\\"webpack-dev-server --hot --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open\\\",\\\"doc:ol:serve\\\":\\\"webpack-dev-server --hot --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open\\\",\\\"build:dev\\\":\\\"npm-run-all --print-label --print-name build:*:dev\\\",\\\"build:prod\\\":\\\"npm-run-all --print-label --print-name build:*:prod\\\",\\\"build:src\\\":\\\"npm-run-all --print-label --print-name build:*:src\\\",\\\"build\\\":\\\"npm-run-all --print-label --print-name build:*:*\\\",\\\"build:itowns\\\":\\\"npm-run-all --print-label --print-name build:itowns:*\\\",\\\"build:itowns:dev\\\":\\\"webpack --config build/webpack/webpack.config.itowns --mode=development\\\",\\\"build:itowns:prod\\\":\\\"webpack --config build/webpack/webpack.config.itowns --mode=production\\\",\\\"build:itowns:src\\\":\\\"webpack --config build/webpack/webpack.config.itowns --mode=none\\\",\\\"build:ol\\\":\\\"npm-run-all --print-label --print-name build:ol:*\\\",\\\"build:ol:dev\\\":\\\"webpack --config build/webpack/webpack.config.openlayers --mode=development\\\",\\\"build:ol:prod\\\":\\\"webpack --config build/webpack/webpack.config.openlayers --mode=production\\\",\\\"build:ol:src\\\":\\\"webpack --config build/webpack/webpack.config.openlayers --mode=none\\\",\\\"build:leaflet\\\":\\\"npm-run-all --print-label --print-name build:leaflet:*\\\",\\\"build:leaflet:dev\\\":\\\"webpack --config build/webpack/webpack.config.leaflet --mode=development\\\",\\\"build:leaflet:prod\\\":\\\"webpack --config build/webpack/webpack.config.leaflet --mode=production\\\",\\\"build:leaflet:src\\\":\\\"webpack --config build/webpack/webpack.config.leaflet --mode=none\\\"},\\\"repository\\\":{\\\"type\\\":\\\"git\\\",\\\"url\\\":\\\"https://github.com/IGNF/geoportal-extensions.git\\\"},\\\"author\\\":\\\"IGNF\\\",\\\"keywords\\\":[\\\"geoportail\\\",\\\"geoplateforme\\\",\\\"javascript\\\",\\\"OpenLayers\\\",\\\"Leaflet\\\",\\\"Itowns\\\",\\\"3D\\\"],\\\"license\\\":\\\"CECILL-B\\\",\\\"bugs\\\":{\\\"url\\\":\\\"https://github.com/IGNF/geoportal-extensions/issues\\\"},\\\"homepage\\\":\\\"https://github.com/IGNF/geoportal-extensions#readme\\\",\\\"dependencies\\\":{\\\"@mapbox/mapbox-gl-style-spec\\\":\\\"13.20.1\\\",\\\"eventbusjs\\\":\\\"0.2.0\\\",\\\"geoportal-access-lib\\\":\\\"3.4.2\\\",\\\"itowns\\\":\\\"2.38.2\\\",\\\"leaflet\\\":\\\"1.7.1\\\",\\\"leaflet-draw\\\":\\\"1.0.4\\\",\\\"loglevel\\\":\\\"^1.6.7\\\",\\\"markdown-toc\\\":\\\"^1.2.0\\\",\\\"ol\\\":\\\"6.9.0\\\",\\\"ol-mapbox-style\\\":\\\"6.7.0\\\",\\\"proj4\\\":\\\"2.7.5\\\",\\\"proj4leaflet\\\":\\\"1.0.2\\\",\\\"sortablejs\\\":\\\"1.14.0\\\",\\\"three\\\":\\\"0.137.5\\\",\\\"typescript\\\":\\\"^4.5.5\\\",\\\"whatwg-fetch\\\":\\\"3.0.0\\\"},\\\"devDependencies\\\":{\\\"@babel/core\\\":\\\"^7.4.4\\\",\\\"@babel/plugin-transform-template-literals\\\":\\\"^7.7.4\\\",\\\"@babel/preset-env\\\":\\\"^7.4.4\\\",\\\"babel-loader\\\":\\\"^8.0.5\\\",\\\"chai\\\":\\\"^4.2.0\\\",\\\"chalk\\\":\\\"^4.0.0\\\",\\\"clean-webpack-plugin\\\":\\\"^3.0.0\\\",\\\"copy-webpack-plugin\\\":\\\"^5.0.3\\\",\\\"core-js\\\":\\\"^3.6.4\\\",\\\"css-loader\\\":\\\"^3.4.2\\\",\\\"eslint\\\":\\\"^6.8.0\\\",\\\"eslint-config-standard\\\":\\\"^14.1.1\\\",\\\"eslint-loader\\\":\\\"^4.0.0\\\",\\\"eslint-plugin-import\\\":\\\"^2.17.2\\\",\\\"eslint-plugin-node\\\":\\\"^11.1.0\\\",\\\"eslint-plugin-promise\\\":\\\"^4.1.1\\\",\\\"eslint-plugin-standard\\\":\\\"^4.0.0\\\",\\\"exports-loader\\\":\\\"^0.7.0\\\",\\\"expose-loader\\\":\\\"^0.7.5\\\",\\\"fs-extra\\\":\\\"^9.0.0\\\",\\\"handlebars\\\":\\\"^4.7.5\\\",\\\"handlebars-layouts\\\":\\\"^3.1.4\\\",\\\"html-webpack-plugin\\\":\\\"^4.0.4\\\",\\\"jsdoc-webpack-plugin\\\":\\\"^0.3.0\\\",\\\"mini-css-extract-plugin\\\":\\\"^0.9.0\\\",\\\"mocha\\\":\\\"^7.1.1\\\",\\\"mocha-loader\\\":\\\"^5.0.0\\\",\\\"npm-run-all\\\":\\\"^4.1.5\\\",\\\"optimize-css-assets-webpack-plugin\\\":\\\"^5.0.1\\\",\\\"path\\\":\\\"^0.12.7\\\",\\\"replace-bundle-webpack-plugin\\\":\\\"^1.0.0\\\",\\\"requirejs\\\":\\\"^2.3.6\\\",\\\"responsive-loader\\\":\\\"^1.2.0\\\",\\\"speed-measure-webpack-plugin\\\":\\\"^1.3.0\\\",\\\"string-template\\\":\\\"^1.0.0\\\",\\\"style-loader\\\":\\\"^1.1.3\\\",\\\"terser-webpack-plugin\\\":\\\"^2.0.0\\\",\\\"url-loader\\\":\\\"^4.0.0\\\",\\\"webpack\\\":\\\"^4.30.0\\\",\\\"webpack-cli\\\":\\\"^3.3.1\\\",\\\"webpack-dev-server\\\":\\\"^3.3.1\\\",\\\"webpack-node-externals\\\":\\\"^1.7.2\\\"}}\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIuL3BhY2thZ2UuanNvbi5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./package.json\n"); +eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"geoportal-extensions\\\",\\\"description\\\":\\\"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries\\\",\\\"version\\\":\\\"3.0.4\\\",\\\"date\\\":\\\"05/06/2024\\\",\\\"leafletExtName\\\":\\\"French Geoportal Extension for Leaflet\\\",\\\"leafletExtVersion\\\":\\\"2.4.0\\\",\\\"olExtName\\\":\\\"French Geoportal Extension for OpenLayers\\\",\\\"olExtVersion\\\":\\\"3.4.4\\\",\\\"itownsExtName\\\":\\\"French Geoportal Extension for Itowns\\\",\\\"itownsExtVersion\\\":\\\"2.5.1\\\",\\\"main\\\":\\\"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js\\\",\\\"types\\\":\\\"dist/leaflet/index.d.ts, dist/openlayers/index.d.ts, dist/itowns/index.d.ts\\\",\\\"module\\\":\\\"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js\\\",\\\"directories\\\":{},\\\"scripts\\\":{\\\"setup\\\":\\\"npm install\\\",\\\"clean\\\":\\\"echo \\\\\\\"Warning: target not yet implemented!\\\\\\\" && exit 0\\\",\\\"eslint\\\":\\\"eslint src/\\\",\\\"test\\\":\\\"npm run test:serve\\\",\\\"test:serve\\\":\\\"cd test && webpack-dev-server --hot --config webpack.test.serve.js\\\",\\\"sample\\\":\\\"npm run sample:serve\\\",\\\"sample:serve\\\":\\\"npm run sample:ol:serve\\\",\\\"sample:itowns:serve\\\":\\\"webpack-dev-server --config build/webpack/webpack.config.itowns --mode=development --https --open-page samples/index-itowns-map.html --content-base . --output-public-path '/dist/itowns/' --port 9001 --open\\\",\\\"sample:leaflet:serve\\\":\\\"webpack-dev-server --config build/webpack/webpack.config.leaflet --mode=development --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path '/dist/leaflet/' --port 9001 --open\\\",\\\"sample:ol:serve\\\":\\\"webpack-dev-server --config build/webpack/webpack.config.openlayers --mode=development --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path '/dist/openlayers/' --port 9001 --open\\\",\\\"generate-types:ol\\\":\\\"npx tsc -p build/types/tsconfig-openlayers.json\\\",\\\"generate-types:leaflet\\\":\\\"npx tsc -p build/types/tsconfig-leaflet.json\\\",\\\"generate-types:itowns\\\":\\\"npx tsc -p build/types/tsconfig-itowns.json\\\",\\\"generate-jsdoc:ol\\\":\\\"jsdoc -c build/jsdoc/jsdoc-openlayers.json\\\",\\\"generate-jsdoc:leaflet\\\":\\\"jsdoc -c build/jsdoc/jsdoc-leaflet.json\\\",\\\"generate-jsdoc:itowns\\\":\\\"jsdoc -c build/jsdoc/jsdoc-itowns.json\\\",\\\"doc\\\":\\\"npm run doc:serve\\\",\\\"doc:serve\\\":\\\"npm run doc:ol:serve\\\",\\\"doc:itowns:serve\\\":\\\"webpack-dev-server --hot --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open\\\",\\\"doc:leaflet:serve\\\":\\\"webpack-dev-server --hot --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open\\\",\\\"doc:ol:serve\\\":\\\"webpack-dev-server --hot --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open\\\",\\\"build:dev\\\":\\\"npm-run-all --print-label --print-name build:*:dev\\\",\\\"build:prod\\\":\\\"npm-run-all --print-label --print-name build:*:prod\\\",\\\"build:src\\\":\\\"npm-run-all --print-label --print-name build:*:src\\\",\\\"build\\\":\\\"npm-run-all --print-label --print-name build:*:*\\\",\\\"build:itowns\\\":\\\"npm-run-all --print-label --print-name build:itowns:*\\\",\\\"build:itowns:dev\\\":\\\"webpack --config build/webpack/webpack.config.itowns --mode=development\\\",\\\"build:itowns:prod\\\":\\\"webpack --config build/webpack/webpack.config.itowns --mode=production\\\",\\\"build:itowns:src\\\":\\\"webpack --config build/webpack/webpack.config.itowns --mode=none\\\",\\\"build:ol\\\":\\\"npm-run-all --print-label --print-name build:ol:*\\\",\\\"build:ol:dev\\\":\\\"webpack --config build/webpack/webpack.config.openlayers --mode=development\\\",\\\"build:ol:prod\\\":\\\"webpack --config build/webpack/webpack.config.openlayers --mode=production\\\",\\\"build:ol:src\\\":\\\"webpack --config build/webpack/webpack.config.openlayers --mode=none\\\",\\\"build:leaflet\\\":\\\"npm-run-all --print-label --print-name build:leaflet:*\\\",\\\"build:leaflet:dev\\\":\\\"webpack --config build/webpack/webpack.config.leaflet --mode=development\\\",\\\"build:leaflet:prod\\\":\\\"webpack --config build/webpack/webpack.config.leaflet --mode=production\\\",\\\"build:leaflet:src\\\":\\\"webpack --config build/webpack/webpack.config.leaflet --mode=none\\\"},\\\"repository\\\":{\\\"type\\\":\\\"git\\\",\\\"url\\\":\\\"https://github.com/IGNF/geoportal-extensions.git\\\"},\\\"author\\\":\\\"IGNF\\\",\\\"keywords\\\":[\\\"geoportail\\\",\\\"geoplateforme\\\",\\\"javascript\\\",\\\"OpenLayers\\\",\\\"Leaflet\\\",\\\"Itowns\\\",\\\"3D\\\"],\\\"license\\\":\\\"CECILL-B\\\",\\\"bugs\\\":{\\\"url\\\":\\\"https://github.com/IGNF/geoportal-extensions/issues\\\"},\\\"homepage\\\":\\\"https://github.com/IGNF/geoportal-extensions#readme\\\",\\\"dependencies\\\":{\\\"@mapbox/mapbox-gl-style-spec\\\":\\\"13.20.1\\\",\\\"eventbusjs\\\":\\\"0.2.0\\\",\\\"geoportal-access-lib\\\":\\\"3.4.2\\\",\\\"itowns\\\":\\\"2.38.2\\\",\\\"leaflet\\\":\\\"1.7.1\\\",\\\"leaflet-draw\\\":\\\"1.0.4\\\",\\\"loglevel\\\":\\\"^1.6.7\\\",\\\"markdown-toc\\\":\\\"^1.2.0\\\",\\\"ol\\\":\\\"6.9.0\\\",\\\"ol-mapbox-style\\\":\\\"6.7.0\\\",\\\"proj4\\\":\\\"2.7.5\\\",\\\"proj4leaflet\\\":\\\"1.0.2\\\",\\\"sortablejs\\\":\\\"1.14.0\\\",\\\"three\\\":\\\"0.137.5\\\",\\\"typescript\\\":\\\"^4.5.5\\\",\\\"whatwg-fetch\\\":\\\"3.0.0\\\"},\\\"devDependencies\\\":{\\\"@babel/core\\\":\\\"^7.4.4\\\",\\\"@babel/plugin-transform-template-literals\\\":\\\"^7.7.4\\\",\\\"@babel/preset-env\\\":\\\"^7.4.4\\\",\\\"babel-loader\\\":\\\"^8.0.5\\\",\\\"chai\\\":\\\"^4.2.0\\\",\\\"chalk\\\":\\\"^4.0.0\\\",\\\"clean-webpack-plugin\\\":\\\"^3.0.0\\\",\\\"copy-webpack-plugin\\\":\\\"^5.0.3\\\",\\\"core-js\\\":\\\"^3.6.4\\\",\\\"css-loader\\\":\\\"^3.4.2\\\",\\\"eslint\\\":\\\"^6.8.0\\\",\\\"eslint-config-standard\\\":\\\"^14.1.1\\\",\\\"eslint-loader\\\":\\\"^4.0.0\\\",\\\"eslint-plugin-import\\\":\\\"^2.17.2\\\",\\\"eslint-plugin-node\\\":\\\"^11.1.0\\\",\\\"eslint-plugin-promise\\\":\\\"^4.1.1\\\",\\\"eslint-plugin-standard\\\":\\\"^4.0.0\\\",\\\"exports-loader\\\":\\\"^0.7.0\\\",\\\"expose-loader\\\":\\\"^0.7.5\\\",\\\"fs-extra\\\":\\\"^9.0.0\\\",\\\"handlebars\\\":\\\"^4.7.5\\\",\\\"handlebars-layouts\\\":\\\"^3.1.4\\\",\\\"html-webpack-plugin\\\":\\\"^4.0.4\\\",\\\"jsdoc-webpack-plugin\\\":\\\"^0.3.0\\\",\\\"mini-css-extract-plugin\\\":\\\"^0.9.0\\\",\\\"mocha\\\":\\\"^7.1.1\\\",\\\"mocha-loader\\\":\\\"^5.0.0\\\",\\\"npm-run-all\\\":\\\"^4.1.5\\\",\\\"optimize-css-assets-webpack-plugin\\\":\\\"^5.0.1\\\",\\\"path\\\":\\\"^0.12.7\\\",\\\"replace-bundle-webpack-plugin\\\":\\\"^1.0.0\\\",\\\"requirejs\\\":\\\"^2.3.6\\\",\\\"responsive-loader\\\":\\\"^1.2.0\\\",\\\"speed-measure-webpack-plugin\\\":\\\"^1.3.0\\\",\\\"string-template\\\":\\\"^1.0.0\\\",\\\"style-loader\\\":\\\"^1.1.3\\\",\\\"terser-webpack-plugin\\\":\\\"^2.0.0\\\",\\\"url-loader\\\":\\\"^4.0.0\\\",\\\"webpack\\\":\\\"^4.30.0\\\",\\\"webpack-cli\\\":\\\"^3.3.1\\\",\\\"webpack-dev-server\\\":\\\"^3.3.1\\\",\\\"webpack-node-externals\\\":\\\"^1.7.2\\\"}}\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIuL3BhY2thZ2UuanNvbi5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./package.json\n"); /***/ }), @@ -1920,7 +1920,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/**\n* @module Utils\n* @alias Gp.olUtils\n* @description\n* ...\n*\n* @example\n* detectSupport();\n* assign();\n* mergeParams();\n*/\nvar Utils = {\n /**\n * this method is called by the constructor.\n * this information is useful to switch to touch mode.\n * Detection : test for desktop or tactile\n *\n * @function detectSupport\n * @returns {Boolean} isDesktop - true for desktop userAgent, false for mobile\n */\n detectSupport: function detectSupport() {\n var isDesktop = true;\n var userAgent = window.navigator.userAgent.toLowerCase();\n if (userAgent.indexOf(\"iphone\") !== -1 || userAgent.indexOf(\"ipod\") !== -1 || userAgent.indexOf(\"ipad\") !== -1 || userAgent.indexOf(\"android\") !== -1 || userAgent.indexOf(\"mobile\") !== -1 || userAgent.indexOf(\"blackberry\") !== -1 || userAgent.indexOf(\"tablet\") !== -1 || userAgent.indexOf(\"phone\") !== -1 || userAgent.indexOf(\"touch\") !== -1) {\n isDesktop = false;\n }\n if (userAgent.indexOf(\"msie\") !== -1 || userAgent.indexOf(\"trident\") !== -1) {\n isDesktop = true;\n }\n return isDesktop;\n },\n /**\n * Copies all source object members to dest\n *\n * @function assign\n * @param {Object} dest - destination object where properties and method will be copied\n * @param {Object} source - source object from which properties and method will be copied\n * @returns {Object} dest\n */\n assign: function assign(dest, source) {\n dest = dest || {};\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n dest[prop] = source[prop];\n }\n }\n return dest;\n },\n /**\n * Merge two objects parameters (deeper than assign)\n *\n * @function mergeParams\n * @param {Object} dest - destination object where properties and method will be merge\n * @param {Object} source - source object from which properties and method will be merge\n * @param {Boolean} replace - replace destination value by source if exists or not (true by default)\n */\n mergeParams: function mergeParams(dest, source, replace) {\n if (!dest || !source) {\n return;\n }\n if (typeof replace === \"undefined\") {\n replace = true;\n }\n for (var param in source) {\n if (source.hasOwnProperty(param)) {\n if (_typeof(source[param]) === \"object\") {\n if (dest.hasOwnProperty(param)) {\n this.mergeParams(dest[param], source[param], replace);\n } else {\n dest[param] = source[param];\n }\n } else {\n if (dest.hasOwnProperty(param)) {\n if (replace) {\n dest[param] = source[param];\n }\n } else {\n dest[param] = source[param];\n }\n }\n }\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Utils);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Db21tb24vVXRpbHMuanM/MTM1ZSJdLCJuYW1lcyI6WyJVdGlscyIsImRldGVjdFN1cHBvcnQiLCJpc0Rlc2t0b3AiLCJ1c2VyQWdlbnQiLCJ3aW5kb3ciLCJuYXZpZ2F0b3IiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJhc3NpZ24iLCJkZXN0Iiwic291cmNlIiwicHJvcCIsImhhc093blByb3BlcnR5IiwibWVyZ2VQYXJhbXMiLCJyZXBsYWNlIiwicGFyYW0iLCJfdHlwZW9mIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxLQUFLLEdBQUc7RUFFUjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLGFBQWEsRUFBRyxTQUFBQSxjQUFBLEVBQVk7SUFDeEIsSUFBSUMsU0FBUyxHQUFHLElBQUk7SUFDcEIsSUFBSUMsU0FBUyxHQUFHQyxNQUFNLENBQUNDLFNBQVMsQ0FBQ0YsU0FBUyxDQUFDRyxXQUFXLENBQUMsQ0FBQztJQUV4RCxJQUFJSCxTQUFTLENBQUNJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDbENKLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUNoQ0osU0FBUyxDQUFDSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ2hDSixTQUFTLENBQUNJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDbkNKLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUNsQ0osU0FBUyxDQUFDSSxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ3RDSixTQUFTLENBQUNJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDbENKLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUNqQ0osU0FBUyxDQUFDSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDbkNMLFNBQVMsR0FBRyxLQUFLO0lBQ3JCO0lBRUEsSUFBSUMsU0FBUyxDQUFDSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ2hDSixTQUFTLENBQUNJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtNQUNyQ0wsU0FBUyxHQUFHLElBQUk7SUFDcEI7SUFFQSxPQUFPQSxTQUFTO0VBQ3BCLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lNLE1BQU0sRUFBRyxTQUFBQSxPQUFVQyxJQUFJLEVBQUVDLE1BQU0sRUFBRTtJQUM3QkQsSUFBSSxHQUFHQSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSUUsSUFBSSxJQUFJRCxNQUFNLEVBQUU7TUFDckIsSUFBSUEsTUFBTSxDQUFDRSxjQUFjLENBQUNELElBQUksQ0FBQyxFQUFFO1FBQzdCRixJQUFJLENBQUNFLElBQUksQ0FBQyxHQUFHRCxNQUFNLENBQUNDLElBQUksQ0FBQztNQUM3QjtJQUNKO0lBQ0EsT0FBT0YsSUFBSTtFQUNmLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lJLFdBQVcsRUFBRyxTQUFBQSxZQUFVSixJQUFJLEVBQUVDLE1BQU0sRUFBRUksT0FBTyxFQUFFO0lBQzNDLElBQUksQ0FBQ0wsSUFBSSxJQUFJLENBQUNDLE1BQU0sRUFBRTtNQUNsQjtJQUNKO0lBQ0EsSUFBSSxPQUFPSSxPQUFPLEtBQUssV0FBVyxFQUFFO01BQ2hDQSxPQUFPLEdBQUcsSUFBSTtJQUNsQjtJQUNBLEtBQUssSUFBSUMsS0FBSyxJQUFJTCxNQUFNLEVBQUU7TUFDdEIsSUFBSUEsTUFBTSxDQUFDRSxjQUFjLENBQUNHLEtBQUssQ0FBQyxFQUFFO1FBQzlCLElBQUlDLE9BQUEsQ0FBT04sTUFBTSxDQUFDSyxLQUFLLENBQUMsTUFBSyxRQUFRLEVBQUU7VUFDbkMsSUFBSU4sSUFBSSxDQUFDRyxjQUFjLENBQUNHLEtBQUssQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQ0YsV0FBVyxDQUFDSixJQUFJLENBQUNNLEtBQUssQ0FBQyxFQUFFTCxNQUFNLENBQUNLLEtBQUssQ0FBQyxFQUFFRCxPQUFPLENBQUM7VUFDekQsQ0FBQyxNQUFNO1lBQ0hMLElBQUksQ0FBQ00sS0FBSyxDQUFDLEdBQUdMLE1BQU0sQ0FBQ0ssS0FBSyxDQUFDO1VBQy9CO1FBQ0osQ0FBQyxNQUFNO1VBQ0gsSUFBSU4sSUFBSSxDQUFDRyxjQUFjLENBQUNHLEtBQUssQ0FBQyxFQUFFO1lBQzVCLElBQUlELE9BQU8sRUFBRTtjQUNUTCxJQUFJLENBQUNNLEtBQUssQ0FBQyxHQUFHTCxNQUFNLENBQUNLLEtBQUssQ0FBQztZQUMvQjtVQUNKLENBQUMsTUFBTTtZQUNITixJQUFJLENBQUNNLEtBQUssQ0FBQyxHQUFHTCxNQUFNLENBQUNLLEtBQUssQ0FBQztVQUMvQjtRQUNKO01BQ0o7SUFDSjtFQUNKO0FBQ0osQ0FBQztBQUVjZixvRUFBSyIsImZpbGUiOiIuL3NyYy9Db21tb24vVXRpbHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiogQG1vZHVsZSBVdGlsc1xuKiBAYWxpYXMgR3Aub2xVdGlsc1xuKiBAZGVzY3JpcHRpb25cbiogLi4uXG4qXG4qIEBleGFtcGxlXG4qIGRldGVjdFN1cHBvcnQoKTtcbiogYXNzaWduKCk7XG4qIG1lcmdlUGFyYW1zKCk7XG4qL1xudmFyIFV0aWxzID0ge1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiB0aGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCB0byBzd2l0Y2ggdG8gdG91Y2ggbW9kZS5cbiAgICAgKiBEZXRlY3Rpb24gOiB0ZXN0IGZvciBkZXNrdG9wIG9yIHRhY3RpbGVcbiAgICAgKlxuICAgICAqIEBmdW5jdGlvbiBkZXRlY3RTdXBwb3J0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IGlzRGVza3RvcCAtIHRydWUgZm9yIGRlc2t0b3AgdXNlckFnZW50LCBmYWxzZSBmb3IgbW9iaWxlXG4gICAgICovXG4gICAgZGV0ZWN0U3VwcG9ydCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzRGVza3RvcCA9IHRydWU7XG4gICAgICAgIHZhciB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICh1c2VyQWdlbnQuaW5kZXhPZihcImlwaG9uZVwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHVzZXJBZ2VudC5pbmRleE9mKFwiaXBvZFwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHVzZXJBZ2VudC5pbmRleE9mKFwiaXBhZFwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHVzZXJBZ2VudC5pbmRleE9mKFwiYW5kcm9pZFwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHVzZXJBZ2VudC5pbmRleE9mKFwibW9iaWxlXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJibGFja2JlcnJ5XCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJ0YWJsZXRcIikgIT09IC0xIHx8XG4gICAgICAgICAgICB1c2VyQWdlbnQuaW5kZXhPZihcInBob25lXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJ0b3VjaFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlzRGVza3RvcCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKFwibXNpZVwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHVzZXJBZ2VudC5pbmRleE9mKFwidHJpZGVudFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlzRGVza3RvcCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNEZXNrdG9wO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiAgQ29waWVzIGFsbCBzb3VyY2Ugb2JqZWN0IG1lbWJlcnMgdG8gZGVzdFxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uIGFzc2lnblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IC0gZGVzdGluYXRpb24gb2JqZWN0IHdoZXJlIHByb3BlcnRpZXMgYW5kIG1ldGhvZCB3aWxsIGJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgLSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggcHJvcGVydGllcyBhbmQgbWV0aG9kIHdpbGwgYmUgY29waWVkXG4gICAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgICAqL1xuICAgIGFzc2lnbiA6IGZ1bmN0aW9uIChkZXN0LCBzb3VyY2UpIHtcbiAgICAgICAgZGVzdCA9IGRlc3QgfHwge307XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgZGVzdFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgdHdvIG9iamVjdHMgcGFyYW1ldGVycyAoZGVlcGVyIHRoYW4gYXNzaWduKVxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uIG1lcmdlUGFyYW1zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlc3QgICAgIC0gZGVzdGluYXRpb24gb2JqZWN0IHdoZXJlIHByb3BlcnRpZXMgYW5kIG1ldGhvZCB3aWxsIGJlIG1lcmdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSAgIC0gc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHByb3BlcnRpZXMgYW5kIG1ldGhvZCB3aWxsIGJlIG1lcmdlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByZXBsYWNlIC0gcmVwbGFjZSBkZXN0aW5hdGlvbiB2YWx1ZSBieSBzb3VyY2UgaWYgZXhpc3RzIG9yIG5vdCAodHJ1ZSBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIG1lcmdlUGFyYW1zIDogZnVuY3Rpb24gKGRlc3QsIHNvdXJjZSwgcmVwbGFjZSkge1xuICAgICAgICBpZiAoIWRlc3QgfHwgIXNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmVwbGFjZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgcGFyYW0gaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHBhcmFtKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlW3BhcmFtXSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdC5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VQYXJhbXMoZGVzdFtwYXJhbV0sIHNvdXJjZVtwYXJhbV0sIHJlcGxhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtwYXJhbV0gPSBzb3VyY2VbcGFyYW1dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QuaGFzT3duUHJvcGVydHkocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbcGFyYW1dID0gc291cmNlW3BhcmFtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbcGFyYW1dID0gc291cmNlW3BhcmFtXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFV0aWxzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Common/Utils.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/**\n* @module Utils\n* @alias Gp.olUtils\n* @description\n* ...\n*\n* @example\n* detectSupport();\n* assign();\n* mergeParams();\n*/\nvar Utils = {\n /**\n * this method is called by the constructor.\n * this information is useful to switch to touch mode.\n * Detection : test for desktop or tactile\n *\n * @function detectSupport\n * @returns {Boolean} isDesktop - true for desktop userAgent, false for mobile\n */\n detectSupport: function detectSupport() {\n var isDesktop = true;\n var userAgent = window.navigator.userAgent.toLowerCase();\n if (userAgent.indexOf(\"iphone\") !== -1 || userAgent.indexOf(\"ipod\") !== -1 || userAgent.indexOf(\"ipad\") !== -1 || userAgent.indexOf(\"android\") !== -1 || userAgent.indexOf(\"mobile\") !== -1 || userAgent.indexOf(\"blackberry\") !== -1 || userAgent.indexOf(\"tablet\") !== -1 || userAgent.indexOf(\"phone\") !== -1 || userAgent.indexOf(\"touch\") !== -1) {\n isDesktop = false;\n }\n if (userAgent.indexOf(\"msie\") !== -1 || userAgent.indexOf(\"trident\") !== -1) {\n isDesktop = true;\n }\n return isDesktop;\n },\n /**\n * Copies all source object members to dest\n *\n * @function assign\n * @param {Object} dest - destination object where properties and method will be copied\n * @param {Object} source - source object from which properties and method will be copied\n * @returns {Object} dest\n */\n assign: function assign(dest, source) {\n dest = dest || {};\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n dest[prop] = source[prop];\n }\n }\n return dest;\n },\n /**\n * Merge two objects parameters (deeper than assign)\n *\n * @function mergeParams\n * @param {Object} dest - destination object where properties and method will be merge\n * @param {Object} source - source object from which properties and method will be merge\n * @param {Boolean} replace - replace destination value by source if exists or not (true by default)\n */\n mergeParams: function mergeParams(dest, source, replace) {\n if (typeof dest === \"undefined\" || typeof source === \"undefined\") {\n return;\n }\n if (typeof replace === \"undefined\") {\n replace = true;\n }\n for (var param in source) {\n if (source.hasOwnProperty(param)) {\n if (_typeof(source[param]) === \"object\") {\n if (dest.hasOwnProperty(param)) {\n this.mergeParams(dest[param], source[param], replace);\n } else {\n dest[param] = source[param];\n }\n } else {\n if (dest.hasOwnProperty(param)) {\n if (replace) {\n dest[param] = source[param];\n }\n } else {\n dest[param] = source[param];\n }\n }\n }\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Utils);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Db21tb24vVXRpbHMuanM/MTM1ZSJdLCJuYW1lcyI6WyJVdGlscyIsImRldGVjdFN1cHBvcnQiLCJpc0Rlc2t0b3AiLCJ1c2VyQWdlbnQiLCJ3aW5kb3ciLCJuYXZpZ2F0b3IiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJhc3NpZ24iLCJkZXN0Iiwic291cmNlIiwicHJvcCIsImhhc093blByb3BlcnR5IiwibWVyZ2VQYXJhbXMiLCJyZXBsYWNlIiwicGFyYW0iLCJfdHlwZW9mIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxLQUFLLEdBQUc7RUFFUjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLGFBQWEsRUFBRyxTQUFBQSxjQUFBLEVBQVk7SUFDeEIsSUFBSUMsU0FBUyxHQUFHLElBQUk7SUFDcEIsSUFBSUMsU0FBUyxHQUFHQyxNQUFNLENBQUNDLFNBQVMsQ0FBQ0YsU0FBUyxDQUFDRyxXQUFXLENBQUMsQ0FBQztJQUV4RCxJQUFJSCxTQUFTLENBQUNJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDbENKLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUNoQ0osU0FBUyxDQUFDSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ2hDSixTQUFTLENBQUNJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDbkNKLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUNsQ0osU0FBUyxDQUFDSSxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ3RDSixTQUFTLENBQUNJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDbENKLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUNqQ0osU0FBUyxDQUFDSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDbkNMLFNBQVMsR0FBRyxLQUFLO0lBQ3JCO0lBRUEsSUFBSUMsU0FBUyxDQUFDSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ2hDSixTQUFTLENBQUNJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtNQUNyQ0wsU0FBUyxHQUFHLElBQUk7SUFDcEI7SUFFQSxPQUFPQSxTQUFTO0VBQ3BCLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lNLE1BQU0sRUFBRyxTQUFBQSxPQUFVQyxJQUFJLEVBQUVDLE1BQU0sRUFBRTtJQUM3QkQsSUFBSSxHQUFHQSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSUUsSUFBSSxJQUFJRCxNQUFNLEVBQUU7TUFDckIsSUFBSUEsTUFBTSxDQUFDRSxjQUFjLENBQUNELElBQUksQ0FBQyxFQUFFO1FBQzdCRixJQUFJLENBQUNFLElBQUksQ0FBQyxHQUFHRCxNQUFNLENBQUNDLElBQUksQ0FBQztNQUM3QjtJQUNKO0lBQ0EsT0FBT0YsSUFBSTtFQUNmLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lJLFdBQVcsRUFBRyxTQUFBQSxZQUFVSixJQUFJLEVBQUVDLE1BQU0sRUFBRUksT0FBTyxFQUFFO0lBQzNDLElBQUksT0FBT0wsSUFBSSxLQUFLLFdBQVcsSUFBSSxPQUFPQyxNQUFNLEtBQUssV0FBVyxFQUFFO01BQzlEO0lBQ0o7SUFDQSxJQUFJLE9BQU9JLE9BQU8sS0FBSyxXQUFXLEVBQUU7TUFDaENBLE9BQU8sR0FBRyxJQUFJO0lBQ2xCO0lBQ0EsS0FBSyxJQUFJQyxLQUFLLElBQUlMLE1BQU0sRUFBRTtNQUN0QixJQUFJQSxNQUFNLENBQUNFLGNBQWMsQ0FBQ0csS0FBSyxDQUFDLEVBQUU7UUFDOUIsSUFBSUMsT0FBQSxDQUFPTixNQUFNLENBQUNLLEtBQUssQ0FBQyxNQUFLLFFBQVEsRUFBRTtVQUNuQyxJQUFJTixJQUFJLENBQUNHLGNBQWMsQ0FBQ0csS0FBSyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDRixXQUFXLENBQUNKLElBQUksQ0FBQ00sS0FBSyxDQUFDLEVBQUVMLE1BQU0sQ0FBQ0ssS0FBSyxDQUFDLEVBQUVELE9BQU8sQ0FBQztVQUN6RCxDQUFDLE1BQU07WUFDSEwsSUFBSSxDQUFDTSxLQUFLLENBQUMsR0FBR0wsTUFBTSxDQUFDSyxLQUFLLENBQUM7VUFDL0I7UUFDSixDQUFDLE1BQU07VUFDSCxJQUFJTixJQUFJLENBQUNHLGNBQWMsQ0FBQ0csS0FBSyxDQUFDLEVBQUU7WUFDNUIsSUFBSUQsT0FBTyxFQUFFO2NBQ1RMLElBQUksQ0FBQ00sS0FBSyxDQUFDLEdBQUdMLE1BQU0sQ0FBQ0ssS0FBSyxDQUFDO1lBQy9CO1VBQ0osQ0FBQyxNQUFNO1lBQ0hOLElBQUksQ0FBQ00sS0FBSyxDQUFDLEdBQUdMLE1BQU0sQ0FBQ0ssS0FBSyxDQUFDO1VBQy9CO1FBQ0o7TUFDSjtJQUNKO0VBQ0o7QUFDSixDQUFDO0FBRWNmLG9FQUFLIiwiZmlsZSI6Ii4vc3JjL0NvbW1vbi9VdGlscy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuKiBAbW9kdWxlIFV0aWxzXG4qIEBhbGlhcyBHcC5vbFV0aWxzXG4qIEBkZXNjcmlwdGlvblxuKiAuLi5cbipcbiogQGV4YW1wbGVcbiogZGV0ZWN0U3VwcG9ydCgpO1xuKiBhc3NpZ24oKTtcbiogbWVyZ2VQYXJhbXMoKTtcbiovXG52YXIgVXRpbHMgPSB7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIHRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIHRvIHN3aXRjaCB0byB0b3VjaCBtb2RlLlxuICAgICAqIERldGVjdGlvbiA6IHRlc3QgZm9yIGRlc2t0b3Agb3IgdGFjdGlsZVxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uIGRldGVjdFN1cHBvcnRcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXNEZXNrdG9wIC0gdHJ1ZSBmb3IgZGVza3RvcCB1c2VyQWdlbnQsIGZhbHNlIGZvciBtb2JpbGVcbiAgICAgKi9cbiAgICBkZXRlY3RTdXBwb3J0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNEZXNrdG9wID0gdHJ1ZTtcbiAgICAgICAgdmFyIHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKFwiaXBob25lXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJpcG9kXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJpcGFkXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJhbmRyb2lkXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJtb2JpbGVcIikgIT09IC0xIHx8XG4gICAgICAgICAgICB1c2VyQWdlbnQuaW5kZXhPZihcImJsYWNrYmVycnlcIikgIT09IC0xIHx8XG4gICAgICAgICAgICB1c2VyQWdlbnQuaW5kZXhPZihcInRhYmxldFwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHVzZXJBZ2VudC5pbmRleE9mKFwicGhvbmVcIikgIT09IC0xIHx8XG4gICAgICAgICAgICB1c2VyQWdlbnQuaW5kZXhPZihcInRvdWNoXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgaXNEZXNrdG9wID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlckFnZW50LmluZGV4T2YoXCJtc2llXCIpICE9PSAtMSB8fFxuICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoXCJ0cmlkZW50XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgaXNEZXNrdG9wID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0Rlc2t0b3A7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqICBDb3BpZXMgYWxsIHNvdXJjZSBvYmplY3QgbWVtYmVycyB0byBkZXN0XG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb24gYXNzaWduXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlc3QgLSBkZXN0aW5hdGlvbiBvYmplY3Qgd2hlcmUgcHJvcGVydGllcyBhbmQgbWV0aG9kIHdpbGwgYmUgY29waWVkXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSAtIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCBwcm9wZXJ0aWVzIGFuZCBtZXRob2Qgd2lsbCBiZSBjb3BpZWRcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gICAgICovXG4gICAgYXNzaWduIDogZnVuY3Rpb24gKGRlc3QsIHNvdXJjZSkge1xuICAgICAgICBkZXN0ID0gZGVzdCB8fCB7fTtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBkZXN0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXN0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSB0d28gb2JqZWN0cyBwYXJhbWV0ZXJzIChkZWVwZXIgdGhhbiBhc3NpZ24pXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb24gbWVyZ2VQYXJhbXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVzdCAgICAgLSBkZXN0aW5hdGlvbiBvYmplY3Qgd2hlcmUgcHJvcGVydGllcyBhbmQgbWV0aG9kIHdpbGwgYmUgbWVyZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlICAgLSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggcHJvcGVydGllcyBhbmQgbWV0aG9kIHdpbGwgYmUgbWVyZ2VcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlcGxhY2UgLSByZXBsYWNlIGRlc3RpbmF0aW9uIHZhbHVlIGJ5IHNvdXJjZSBpZiBleGlzdHMgb3Igbm90ICh0cnVlIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgbWVyZ2VQYXJhbXMgOiBmdW5jdGlvbiAoZGVzdCwgc291cmNlLCByZXBsYWNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygc291cmNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBwYXJhbSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VbcGFyYW1dID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0Lmhhc093blByb3BlcnR5KHBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZVBhcmFtcyhkZXN0W3BhcmFtXSwgc291cmNlW3BhcmFtXSwgcmVwbGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W3BhcmFtXSA9IHNvdXJjZVtwYXJhbV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdC5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtwYXJhbV0gPSBzb3VyY2VbcGFyYW1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtwYXJhbV0gPSBzb3VyY2VbcGFyYW1dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVXRpbHM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Common/Utils.js\n"); /***/ }), @@ -2064,7 +2064,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/**\n * @module Register\n * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * @module SearchEngineUtils\n * @alias [private] SearchEngineUtils\n * @description\n * ...\n *\n * @example\n * advancedSearchFiltersByDefault();\n * zoomToResultsByDefault();\n */\nvar SearchEngineUtils = {\n /**\n * Advanced Search Filters by default\n * @function advancedSearchFiltersByDefault\n */\n advancedSearchFiltersByDefault: {\n PositionOfInterest: [{\n name: \"category\",\n title: \"Type\",\n value: [\"cimetière\", \"aérodrome\", \"réservoir\", \"administratif\", \"construction linéaire\", \"construction ponctuelle\", \"construction surfacique\", \"cours d'eau\", \"détail hydrographique\", \"détail orographique\", \"équipement de transport\", \"plan d'eau\", \"poste de transformation\", \"terrain de sport\", \"transport par câble\", \"zone d'activité ou d'intérêt\", \"zone d'habitation\", \"lieu-dit non habité\"]\n }, {\n name: \"postcode\",\n title: \"Code postal\"\n }, {\n name: \"citycode\",\n title: \"Code INSEE\"\n }],\n StreetAddress: [{\n name: \"city\",\n title: \"Ville\"\n }, {\n name: \"postcode\",\n title: \"Code postal\"\n }, {\n name: \"citycode\",\n title: \"Code INSEE\"\n }],\n CadastralParcel: [{\n name: \"departmentcode\",\n title: \"Code département (INSEE)\",\n description: \"Code INSEE du département (ex: 01, 94)\"\n }, {\n name: \"municipalitycode\",\n title: \"Code commune (INSEE)\",\n description: \"Code INSEE de la commune : 3 chiffres (ex: 067)\"\n }, {\n name: \"city\",\n title: \"Nom commune\",\n description: \"Nom de la commune\"\n }, {\n name: \"oldmunicipalitycode\",\n title: \"Commune absorbée\",\n description: \"Commune absorbée : 3 chiffres (ex: 000, 001)\"\n }, {\n name: \"districtcode\",\n title: \"Arrondissement\",\n description: \"Arrondissement : 3 chiffres (ex: 004, 012)\"\n }, {\n name: \"section\",\n title: \"Section\",\n description: \"Section Cadastrale : 2 caractères (chiffre et/ou lettre)\"\n }, {\n name: \"number\",\n title: \"Numéro\",\n description: \"Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)\"\n }, {\n name: \"sheet\",\n title: \"Feuille\",\n description: \"Numéro de la feuille cadastrale\"\n }]\n },\n /**\n * Provides default zoom based on results.\n *\n * @function zoomToResultsByDefault\n * @param {Object} info - location information\n * @returns {Integer} zoom level\n */\n zoomToResultsByDefault: function zoomToResultsByDefault(info) {\n // FIXME\n // la classification du geocodage est differente de l'importance de l'autocompletion !\n\n var zoom = 15;\n var service = info.service;\n var fields = info.fields;\n var type = info.type;\n var importance = {\n 1: 11,\n 2: 12,\n 3: 13,\n 4: 14,\n 5: 15,\n 6: 16,\n 7: 17,\n 8: 17\n };\n\n // AutoCompletion POI\n if (service === \"SuggestedLocation\") {\n if (type === \"PositionOfInterest\") {\n zoom = importance[fields.classification];\n }\n }\n\n // Geocodage POI\n if (service === \"GeocodedLocation\") {\n if (type === \"PositionOfInterest\") {\n zoom = importance[fields.importance] || 14; // au cas où la recherche est en freeform !\n }\n }\n if (type === \"StreetAddress\") {\n zoom = 17;\n }\n if (type === \"CadastralParcel\") {\n zoom = 17;\n }\n return zoom;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SearchEngineUtils);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Db21tb24vVXRpbHMvU2VhcmNoRW5naW5lVXRpbHMuanM/ZDcwZiJdLCJuYW1lcyI6WyJTZWFyY2hFbmdpbmVVdGlscyIsImFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdCIsIlBvc2l0aW9uT2ZJbnRlcmVzdCIsIm5hbWUiLCJ0aXRsZSIsInZhbHVlIiwiU3RyZWV0QWRkcmVzcyIsIkNhZGFzdHJhbFBhcmNlbCIsImRlc2NyaXB0aW9uIiwiem9vbVRvUmVzdWx0c0J5RGVmYXVsdCIsImluZm8iLCJ6b29tIiwic2VydmljZSIsImZpZWxkcyIsInR5cGUiLCJpbXBvcnRhbmNlIiwiY2xhc3NpZmljYXRpb24iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxpQkFBaUIsR0FBRztFQUNwQjtBQUNKO0FBQ0E7QUFDQTtFQUNJQyw4QkFBOEIsRUFBRztJQUM3QkMsa0JBQWtCLEVBQUcsQ0FDakI7TUFDSUMsSUFBSSxFQUFHLFVBQVU7TUFDakJDLEtBQUssRUFBRyxNQUFNO01BQ2RDLEtBQUssRUFBRyxDQUNKLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLDhCQUE4QixFQUM5QixtQkFBbUIsRUFDbkIscUJBQXFCO0lBRTdCLENBQUMsRUFBRTtNQUNDRixJQUFJLEVBQUcsVUFBVTtNQUNqQkMsS0FBSyxFQUFHO0lBQ1osQ0FBQyxFQUFFO01BQ0NELElBQUksRUFBRyxVQUFVO01BQ2pCQyxLQUFLLEVBQUc7SUFDWixDQUFDLENBQ0o7SUFDREUsYUFBYSxFQUFHLENBQ1o7TUFDSUgsSUFBSSxFQUFHLE1BQU07TUFDYkMsS0FBSyxFQUFHO0lBQ1osQ0FBQyxFQUFFO01BQ0NELElBQUksRUFBRyxVQUFVO01BQ2pCQyxLQUFLLEVBQUc7SUFDWixDQUFDLEVBQUU7TUFDQ0QsSUFBSSxFQUFHLFVBQVU7TUFDakJDLEtBQUssRUFBRztJQUNaLENBQUMsQ0FDSjtJQUNERyxlQUFlLEVBQUcsQ0FDZDtNQUNJSixJQUFJLEVBQUcsZ0JBQWdCO01BQ3ZCQyxLQUFLLEVBQUcsMEJBQTBCO01BQ2xDSSxXQUFXLEVBQUc7SUFDbEIsQ0FBQyxFQUFFO01BQ0NMLElBQUksRUFBRyxrQkFBa0I7TUFDekJDLEtBQUssRUFBRyxzQkFBc0I7TUFDOUJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLE1BQU07TUFDYkMsS0FBSyxFQUFHLGFBQWE7TUFDckJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLHFCQUFxQjtNQUM1QkMsS0FBSyxFQUFHLGtCQUFrQjtNQUMxQkksV0FBVyxFQUFHO0lBQ2xCLENBQUMsRUFBRTtNQUNDTCxJQUFJLEVBQUcsY0FBYztNQUNyQkMsS0FBSyxFQUFHLGdCQUFnQjtNQUN4QkksV0FBVyxFQUFHO0lBQ2xCLENBQUMsRUFBRTtNQUNDTCxJQUFJLEVBQUcsU0FBUztNQUNoQkMsS0FBSyxFQUFHLFNBQVM7TUFDakJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLFFBQVE7TUFDZkMsS0FBSyxFQUFHLFFBQVE7TUFDaEJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLE9BQU87TUFDZEMsS0FBSyxFQUFHLFNBQVM7TUFDakJJLFdBQVcsRUFBRztJQUNsQixDQUFDO0VBRVQsQ0FBQztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLHNCQUFzQixFQUFHLFNBQUFBLHVCQUFVQyxJQUFJLEVBQUU7SUFDckM7SUFDQTs7SUFFQSxJQUFJQyxJQUFJLEdBQUcsRUFBRTtJQUViLElBQUlDLE9BQU8sR0FBR0YsSUFBSSxDQUFDRSxPQUFPO0lBQzFCLElBQUlDLE1BQU0sR0FBR0gsSUFBSSxDQUFDRyxNQUFNO0lBQ3hCLElBQUlDLElBQUksR0FBR0osSUFBSSxDQUFDSSxJQUFJO0lBRXBCLElBQUlDLFVBQVUsR0FBRztNQUNiLENBQUMsRUFBRyxFQUFFO01BQ04sQ0FBQyxFQUFHLEVBQUU7TUFDTixDQUFDLEVBQUcsRUFBRTtNQUNOLENBQUMsRUFBRyxFQUFFO01BQ04sQ0FBQyxFQUFHLEVBQUU7TUFDTixDQUFDLEVBQUcsRUFBRTtNQUNOLENBQUMsRUFBRyxFQUFFO01BQ04sQ0FBQyxFQUFHO0lBQ1IsQ0FBQzs7SUFFRDtJQUNBLElBQUlILE9BQU8sS0FBSyxtQkFBbUIsRUFBRTtNQUNqQyxJQUFJRSxJQUFJLEtBQUssb0JBQW9CLEVBQUU7UUFDL0JILElBQUksR0FBR0ksVUFBVSxDQUFDRixNQUFNLENBQUNHLGNBQWMsQ0FBQztNQUM1QztJQUNKOztJQUVBO0lBQ0EsSUFBSUosT0FBTyxLQUFLLGtCQUFrQixFQUFFO01BQ2hDLElBQUlFLElBQUksS0FBSyxvQkFBb0IsRUFBRTtRQUMvQkgsSUFBSSxHQUFHSSxVQUFVLENBQUNGLE1BQU0sQ0FBQ0UsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7TUFDaEQ7SUFDSjtJQUVBLElBQUlELElBQUksS0FBSyxlQUFlLEVBQUU7TUFDMUJILElBQUksR0FBRyxFQUFFO0lBQ2I7SUFFQSxJQUFJRyxJQUFJLEtBQUssaUJBQWlCLEVBQUU7TUFDNUJILElBQUksR0FBRyxFQUFFO0lBQ2I7SUFFQSxPQUFPQSxJQUFJO0VBQ2Y7QUFDSixDQUFDO0FBRWNYLGdGQUFpQiIsImZpbGUiOiIuL3NyYy9Db21tb24vVXRpbHMvU2VhcmNoRW5naW5lVXRpbHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgU2VhcmNoRW5naW5lVXRpbHNcbiAqIEBhbGlhcyBbcHJpdmF0ZV0gU2VhcmNoRW5naW5lVXRpbHNcbiAqIEBkZXNjcmlwdGlvblxuICogLi4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdCgpO1xuICogem9vbVRvUmVzdWx0c0J5RGVmYXVsdCgpO1xuICovXG52YXIgU2VhcmNoRW5naW5lVXRpbHMgPSB7XG4gICAgLyoqXG4gICAgICogQWR2YW5jZWQgU2VhcmNoIEZpbHRlcnMgYnkgZGVmYXVsdFxuICAgICAqIEBmdW5jdGlvbiBhZHZhbmNlZFNlYXJjaEZpbHRlcnNCeURlZmF1bHRcbiAgICAgKi9cbiAgICBhZHZhbmNlZFNlYXJjaEZpbHRlcnNCeURlZmF1bHQgOiB7XG4gICAgICAgIFBvc2l0aW9uT2ZJbnRlcmVzdCA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJjYXRlZ29yeVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWUgOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiY2ltZXRpw6hyZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImHDqXJvZHJvbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyw6lzZXJ2b2lyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYWRtaW5pc3RyYXRpZlwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnN0cnVjdGlvbiBsaW7DqWFpcmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb25zdHJ1Y3Rpb24gcG9uY3R1ZWxsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnN0cnVjdGlvbiBzdXJmYWNpcXVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY291cnMgZCdlYXVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkw6l0YWlsIGh5ZHJvZ3JhcGhpcXVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZMOpdGFpbCBvcm9ncmFwaGlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCLDqXF1aXBlbWVudCBkZSB0cmFuc3BvcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwbGFuIGQnZWF1XCIsXG4gICAgICAgICAgICAgICAgICAgIFwicG9zdGUgZGUgdHJhbnNmb3JtYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0ZXJyYWluIGRlIHNwb3J0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHJhbnNwb3J0IHBhciBjw6JibGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ6b25lIGQnYWN0aXZpdMOpIG91IGQnaW50w6lyw6p0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiem9uZSBkJ2hhYml0YXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJsaWV1LWRpdCBub24gaGFiaXTDqVwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcInBvc3Rjb2RlXCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkNvZGUgcG9zdGFsXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJjaXR5Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIElOU0VFXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgU3RyZWV0QWRkcmVzcyA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJjaXR5XCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIlZpbGxlXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJwb3N0Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIHBvc3RhbFwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwiY2l0eWNvZGVcIixcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiQ29kZSBJTlNFRVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIENhZGFzdHJhbFBhcmNlbCA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJkZXBhcnRtZW50Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIGTDqXBhcnRlbWVudCAoSU5TRUUpXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBcIkNvZGUgSU5TRUUgZHUgZMOpcGFydGVtZW50IChleDogMDEsIDk0KVwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwibXVuaWNpcGFsaXR5Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIGNvbW11bmUgKElOU0VFKVwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJDb2RlIElOU0VFIGRlIGxhIGNvbW11bmUgOiAzIGNoaWZmcmVzIChleDogMDY3KVwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwiY2l0eVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJOb20gY29tbXVuZVwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJOb20gZGUgbGEgY29tbXVuZVwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwib2xkbXVuaWNpcGFsaXR5Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb21tdW5lIGFic29yYsOpZVwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJDb21tdW5lIGFic29yYsOpZSA6IDMgY2hpZmZyZXMgKGV4OiAwMDAsIDAwMSlcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcImRpc3RyaWN0Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJBcnJvbmRpc3NlbWVudFwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJBcnJvbmRpc3NlbWVudCA6IDMgY2hpZmZyZXMgKGV4OiAwMDQsIDAxMilcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcInNlY3Rpb25cIixcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiU2VjdGlvblwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJTZWN0aW9uIENhZGFzdHJhbGUgOiAyIGNhcmFjdMOocmVzIChjaGlmZnJlIGV0L291IGxldHRyZSlcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJOdW3DqXJvXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBcIk51bcOpcm8gZGUgbGEgcGFyY2VsbGUgOiA0IGNoaWZmcmVzIChleDogMDA0MSwgMDI1MClcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcInNoZWV0XCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkZldWlsbGVcIixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA6IFwiTnVtw6lybyBkZSBsYSBmZXVpbGxlIGNhZGFzdHJhbGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGRlZmF1bHQgem9vbSBiYXNlZCBvbiByZXN1bHRzLlxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uIHpvb21Ub1Jlc3VsdHNCeURlZmF1bHRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5mbyAtIGxvY2F0aW9uIGluZm9ybWF0aW9uXG4gICAgICogQHJldHVybnMge0ludGVnZXJ9IHpvb20gbGV2ZWxcbiAgICAgKi9cbiAgICB6b29tVG9SZXN1bHRzQnlEZWZhdWx0IDogZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgLy8gRklYTUVcbiAgICAgICAgLy8gbGEgY2xhc3NpZmljYXRpb24gZHUgZ2VvY29kYWdlIGVzdCBkaWZmZXJlbnRlIGRlIGwnaW1wb3J0YW5jZSBkZSBsJ2F1dG9jb21wbGV0aW9uICFcblxuICAgICAgICB2YXIgem9vbSA9IDE1O1xuXG4gICAgICAgIHZhciBzZXJ2aWNlID0gaW5mby5zZXJ2aWNlO1xuICAgICAgICB2YXIgZmllbGRzID0gaW5mby5maWVsZHM7XG4gICAgICAgIHZhciB0eXBlID0gaW5mby50eXBlO1xuXG4gICAgICAgIHZhciBpbXBvcnRhbmNlID0ge1xuICAgICAgICAgICAgMSA6IDExLFxuICAgICAgICAgICAgMiA6IDEyLFxuICAgICAgICAgICAgMyA6IDEzLFxuICAgICAgICAgICAgNCA6IDE0LFxuICAgICAgICAgICAgNSA6IDE1LFxuICAgICAgICAgICAgNiA6IDE2LFxuICAgICAgICAgICAgNyA6IDE3LFxuICAgICAgICAgICAgOCA6IDE3XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQXV0b0NvbXBsZXRpb24gUE9JXG4gICAgICAgIGlmIChzZXJ2aWNlID09PSBcIlN1Z2dlc3RlZExvY2F0aW9uXCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgem9vbSA9IGltcG9ydGFuY2VbZmllbGRzLmNsYXNzaWZpY2F0aW9uXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlb2NvZGFnZSBQT0lcbiAgICAgICAgaWYgKHNlcnZpY2UgPT09IFwiR2VvY29kZWRMb2NhdGlvblwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJQb3NpdGlvbk9mSW50ZXJlc3RcIikge1xuICAgICAgICAgICAgICAgIHpvb20gPSBpbXBvcnRhbmNlW2ZpZWxkcy5pbXBvcnRhbmNlXSB8fCAxNDsgLy8gYXUgY2FzIG/DuSBsYSByZWNoZXJjaGUgZXN0IGVuIGZyZWVmb3JtICFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSBcIlN0cmVldEFkZHJlc3NcIikge1xuICAgICAgICAgICAgem9vbSA9IDE3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IFwiQ2FkYXN0cmFsUGFyY2VsXCIpIHtcbiAgICAgICAgICAgIHpvb20gPSAxNztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB6b29tO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNlYXJjaEVuZ2luZVV0aWxzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Common/Utils/SearchEngineUtils.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * @module SearchEngineUtils\n * @alias [private] SearchEngineUtils\n * @description\n * ...\n *\n * @example\n * advancedSearchFiltersByDefault();\n * zoomToResultsByDefault();\n */\nvar SearchEngineUtils = {\n /**\n * Advanced Search Filters by default\n * @function advancedSearchFiltersByDefault\n */\n advancedSearchFiltersByDefault: {\n PositionOfInterest: [{\n name: \"category\",\n title: \"Type\",\n value: [\"cimetière\", \"aérodrome\", \"réservoir\", \"administratif\", \"construction linéaire\", \"construction ponctuelle\", \"construction surfacique\", \"cours d'eau\", \"détail hydrographique\", \"détail orographique\", \"équipement de transport\", \"plan d'eau\", \"poste de transformation\", \"terrain de sport\", \"transport par câble\", \"zone d'activité ou d'intérêt\", \"zone d'habitation\", \"lieu-dit non habité\"]\n }, {\n name: \"postcode\",\n title: \"Code postal\"\n }, {\n name: \"citycode\",\n title: \"Code INSEE\"\n }],\n StreetAddress: [{\n name: \"city\",\n title: \"Ville\"\n }, {\n name: \"postcode\",\n title: \"Code postal\"\n }, {\n name: \"citycode\",\n title: \"Code INSEE\"\n }],\n CadastralParcel: [{\n name: \"departmentcode\",\n title: \"Code département (INSEE)\",\n description: \"Code INSEE du département (ex: 01, 94)\"\n }, {\n name: \"municipalitycode\",\n title: \"Code commune (INSEE)\",\n description: \"Code INSEE de la commune : 3 chiffres (ex: 067)\"\n }, {\n name: \"oldmunicipalitycode\",\n title: \"Commune absorbée\",\n description: \"Commune absorbée : 3 chiffres (ex: 000, 001)\"\n }, {\n name: \"districtcode\",\n title: \"Arrondissement\",\n description: \"Arrondissement : 3 chiffres (ex: 004, 012)\"\n }, {\n name: \"section\",\n title: \"Section\",\n description: \"Section Cadastrale : 2 caractères (chiffre et/ou lettre)\"\n }, {\n name: \"number\",\n title: \"Numéro\",\n description: \"Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)\"\n }, {\n name: \"sheet\",\n title: \"Feuille\",\n description: \"Numéro de la feuille cadastrale\"\n }]\n },\n /**\n * Provides default zoom based on results.\n *\n * @function zoomToResultsByDefault\n * @param {Object} info - location information\n * @returns {Integer} zoom level\n */\n zoomToResultsByDefault: function zoomToResultsByDefault(info) {\n // FIXME\n // la classification du geocodage est differente de l'importance de l'autocompletion !\n\n var zoom = 15;\n var service = info.service;\n var fields = info.fields;\n var type = info.type;\n var importance = {\n 1: 11,\n 2: 12,\n 3: 13,\n 4: 14,\n 5: 15,\n 6: 16,\n 7: 17,\n 8: 17\n };\n\n // AutoCompletion POI\n if (service === \"SuggestedLocation\") {\n if (type === \"PositionOfInterest\") {\n zoom = importance[fields.classification];\n }\n }\n\n // Geocodage POI\n if (service === \"GeocodedLocation\") {\n if (type === \"PositionOfInterest\") {\n zoom = importance[fields.importance] || 14; // au cas où la recherche est en freeform !\n }\n }\n if (type === \"StreetAddress\") {\n zoom = 17;\n }\n if (type === \"CadastralParcel\") {\n zoom = 17;\n }\n return zoom;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SearchEngineUtils);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Db21tb24vVXRpbHMvU2VhcmNoRW5naW5lVXRpbHMuanM/ZDcwZiJdLCJuYW1lcyI6WyJTZWFyY2hFbmdpbmVVdGlscyIsImFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdCIsIlBvc2l0aW9uT2ZJbnRlcmVzdCIsIm5hbWUiLCJ0aXRsZSIsInZhbHVlIiwiU3RyZWV0QWRkcmVzcyIsIkNhZGFzdHJhbFBhcmNlbCIsImRlc2NyaXB0aW9uIiwiem9vbVRvUmVzdWx0c0J5RGVmYXVsdCIsImluZm8iLCJ6b29tIiwic2VydmljZSIsImZpZWxkcyIsInR5cGUiLCJpbXBvcnRhbmNlIiwiY2xhc3NpZmljYXRpb24iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxpQkFBaUIsR0FBRztFQUNwQjtBQUNKO0FBQ0E7QUFDQTtFQUNJQyw4QkFBOEIsRUFBRztJQUM3QkMsa0JBQWtCLEVBQUcsQ0FDakI7TUFDSUMsSUFBSSxFQUFHLFVBQVU7TUFDakJDLEtBQUssRUFBRyxNQUFNO01BQ2RDLEtBQUssRUFBRyxDQUNKLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLDhCQUE4QixFQUM5QixtQkFBbUIsRUFDbkIscUJBQXFCO0lBRTdCLENBQUMsRUFBRTtNQUNDRixJQUFJLEVBQUcsVUFBVTtNQUNqQkMsS0FBSyxFQUFHO0lBQ1osQ0FBQyxFQUFFO01BQ0NELElBQUksRUFBRyxVQUFVO01BQ2pCQyxLQUFLLEVBQUc7SUFDWixDQUFDLENBQ0o7SUFDREUsYUFBYSxFQUFHLENBQ1o7TUFDSUgsSUFBSSxFQUFHLE1BQU07TUFDYkMsS0FBSyxFQUFHO0lBQ1osQ0FBQyxFQUFFO01BQ0NELElBQUksRUFBRyxVQUFVO01BQ2pCQyxLQUFLLEVBQUc7SUFDWixDQUFDLEVBQUU7TUFDQ0QsSUFBSSxFQUFHLFVBQVU7TUFDakJDLEtBQUssRUFBRztJQUNaLENBQUMsQ0FDSjtJQUNERyxlQUFlLEVBQUcsQ0FDZDtNQUNJSixJQUFJLEVBQUcsZ0JBQWdCO01BQ3ZCQyxLQUFLLEVBQUcsMEJBQTBCO01BQ2xDSSxXQUFXLEVBQUc7SUFDbEIsQ0FBQyxFQUFFO01BQ0NMLElBQUksRUFBRyxrQkFBa0I7TUFDekJDLEtBQUssRUFBRyxzQkFBc0I7TUFDOUJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLHFCQUFxQjtNQUM1QkMsS0FBSyxFQUFHLGtCQUFrQjtNQUMxQkksV0FBVyxFQUFHO0lBQ2xCLENBQUMsRUFBRTtNQUNDTCxJQUFJLEVBQUcsY0FBYztNQUNyQkMsS0FBSyxFQUFHLGdCQUFnQjtNQUN4QkksV0FBVyxFQUFHO0lBQ2xCLENBQUMsRUFBRTtNQUNDTCxJQUFJLEVBQUcsU0FBUztNQUNoQkMsS0FBSyxFQUFHLFNBQVM7TUFDakJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLFFBQVE7TUFDZkMsS0FBSyxFQUFHLFFBQVE7TUFDaEJJLFdBQVcsRUFBRztJQUNsQixDQUFDLEVBQUU7TUFDQ0wsSUFBSSxFQUFHLE9BQU87TUFDZEMsS0FBSyxFQUFHLFNBQVM7TUFDakJJLFdBQVcsRUFBRztJQUNsQixDQUFDO0VBRVQsQ0FBQztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLHNCQUFzQixFQUFHLFNBQUFBLHVCQUFVQyxJQUFJLEVBQUU7SUFDckM7SUFDQTs7SUFFQSxJQUFJQyxJQUFJLEdBQUcsRUFBRTtJQUViLElBQUlDLE9BQU8sR0FBR0YsSUFBSSxDQUFDRSxPQUFPO0lBQzFCLElBQUlDLE1BQU0sR0FBR0gsSUFBSSxDQUFDRyxNQUFNO0lBQ3hCLElBQUlDLElBQUksR0FBR0osSUFBSSxDQUFDSSxJQUFJO0lBRXBCLElBQUlDLFVBQVUsR0FBRztNQUNiLENBQUMsRUFBRyxFQUFFO01BQ04sQ0FBQyxFQUFHLEVBQUU7TUFDTixDQUFDLEVBQUcsRUFBRTtNQUNOLENBQUMsRUFBRyxFQUFFO01BQ04sQ0FBQyxFQUFHLEVBQUU7TUFDTixDQUFDLEVBQUcsRUFBRTtNQUNOLENBQUMsRUFBRyxFQUFFO01BQ04sQ0FBQyxFQUFHO0lBQ1IsQ0FBQzs7SUFFRDtJQUNBLElBQUlILE9BQU8sS0FBSyxtQkFBbUIsRUFBRTtNQUNqQyxJQUFJRSxJQUFJLEtBQUssb0JBQW9CLEVBQUU7UUFDL0JILElBQUksR0FBR0ksVUFBVSxDQUFDRixNQUFNLENBQUNHLGNBQWMsQ0FBQztNQUM1QztJQUNKOztJQUVBO0lBQ0EsSUFBSUosT0FBTyxLQUFLLGtCQUFrQixFQUFFO01BQ2hDLElBQUlFLElBQUksS0FBSyxvQkFBb0IsRUFBRTtRQUMvQkgsSUFBSSxHQUFHSSxVQUFVLENBQUNGLE1BQU0sQ0FBQ0UsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7TUFDaEQ7SUFDSjtJQUVBLElBQUlELElBQUksS0FBSyxlQUFlLEVBQUU7TUFDMUJILElBQUksR0FBRyxFQUFFO0lBQ2I7SUFFQSxJQUFJRyxJQUFJLEtBQUssaUJBQWlCLEVBQUU7TUFDNUJILElBQUksR0FBRyxFQUFFO0lBQ2I7SUFFQSxPQUFPQSxJQUFJO0VBQ2Y7QUFDSixDQUFDO0FBRWNYLGdGQUFpQiIsImZpbGUiOiIuL3NyYy9Db21tb24vVXRpbHMvU2VhcmNoRW5naW5lVXRpbHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgU2VhcmNoRW5naW5lVXRpbHNcbiAqIEBhbGlhcyBbcHJpdmF0ZV0gU2VhcmNoRW5naW5lVXRpbHNcbiAqIEBkZXNjcmlwdGlvblxuICogLi4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdCgpO1xuICogem9vbVRvUmVzdWx0c0J5RGVmYXVsdCgpO1xuICovXG52YXIgU2VhcmNoRW5naW5lVXRpbHMgPSB7XG4gICAgLyoqXG4gICAgICogQWR2YW5jZWQgU2VhcmNoIEZpbHRlcnMgYnkgZGVmYXVsdFxuICAgICAqIEBmdW5jdGlvbiBhZHZhbmNlZFNlYXJjaEZpbHRlcnNCeURlZmF1bHRcbiAgICAgKi9cbiAgICBhZHZhbmNlZFNlYXJjaEZpbHRlcnNCeURlZmF1bHQgOiB7XG4gICAgICAgIFBvc2l0aW9uT2ZJbnRlcmVzdCA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJjYXRlZ29yeVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWUgOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiY2ltZXRpw6hyZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImHDqXJvZHJvbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyw6lzZXJ2b2lyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYWRtaW5pc3RyYXRpZlwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnN0cnVjdGlvbiBsaW7DqWFpcmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb25zdHJ1Y3Rpb24gcG9uY3R1ZWxsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnN0cnVjdGlvbiBzdXJmYWNpcXVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY291cnMgZCdlYXVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkw6l0YWlsIGh5ZHJvZ3JhcGhpcXVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZMOpdGFpbCBvcm9ncmFwaGlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCLDqXF1aXBlbWVudCBkZSB0cmFuc3BvcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwbGFuIGQnZWF1XCIsXG4gICAgICAgICAgICAgICAgICAgIFwicG9zdGUgZGUgdHJhbnNmb3JtYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0ZXJyYWluIGRlIHNwb3J0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHJhbnNwb3J0IHBhciBjw6JibGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ6b25lIGQnYWN0aXZpdMOpIG91IGQnaW50w6lyw6p0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiem9uZSBkJ2hhYml0YXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJsaWV1LWRpdCBub24gaGFiaXTDqVwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcInBvc3Rjb2RlXCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkNvZGUgcG9zdGFsXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJjaXR5Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIElOU0VFXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgU3RyZWV0QWRkcmVzcyA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJjaXR5XCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIlZpbGxlXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJwb3N0Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIHBvc3RhbFwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwiY2l0eWNvZGVcIixcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiQ29kZSBJTlNFRVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIENhZGFzdHJhbFBhcmNlbCA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lIDogXCJkZXBhcnRtZW50Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIGTDqXBhcnRlbWVudCAoSU5TRUUpXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBcIkNvZGUgSU5TRUUgZHUgZMOpcGFydGVtZW50IChleDogMDEsIDk0KVwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwibXVuaWNpcGFsaXR5Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb2RlIGNvbW11bmUgKElOU0VFKVwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJDb2RlIElOU0VFIGRlIGxhIGNvbW11bmUgOiAzIGNoaWZmcmVzIChleDogMDY3KVwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IFwib2xkbXVuaWNpcGFsaXR5Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDb21tdW5lIGFic29yYsOpZVwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJDb21tdW5lIGFic29yYsOpZSA6IDMgY2hpZmZyZXMgKGV4OiAwMDAsIDAwMSlcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcImRpc3RyaWN0Y29kZVwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJBcnJvbmRpc3NlbWVudFwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJBcnJvbmRpc3NlbWVudCA6IDMgY2hpZmZyZXMgKGV4OiAwMDQsIDAxMilcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcInNlY3Rpb25cIixcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiU2VjdGlvblwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJTZWN0aW9uIENhZGFzdHJhbGUgOiAyIGNhcmFjdMOocmVzIChjaGlmZnJlIGV0L291IGxldHRyZSlcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJOdW3DqXJvXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBcIk51bcOpcm8gZGUgbGEgcGFyY2VsbGUgOiA0IGNoaWZmcmVzIChleDogMDA0MSwgMDI1MClcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWUgOiBcInNoZWV0XCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkZldWlsbGVcIixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA6IFwiTnVtw6lybyBkZSBsYSBmZXVpbGxlIGNhZGFzdHJhbGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGRlZmF1bHQgem9vbSBiYXNlZCBvbiByZXN1bHRzLlxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uIHpvb21Ub1Jlc3VsdHNCeURlZmF1bHRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5mbyAtIGxvY2F0aW9uIGluZm9ybWF0aW9uXG4gICAgICogQHJldHVybnMge0ludGVnZXJ9IHpvb20gbGV2ZWxcbiAgICAgKi9cbiAgICB6b29tVG9SZXN1bHRzQnlEZWZhdWx0IDogZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgLy8gRklYTUVcbiAgICAgICAgLy8gbGEgY2xhc3NpZmljYXRpb24gZHUgZ2VvY29kYWdlIGVzdCBkaWZmZXJlbnRlIGRlIGwnaW1wb3J0YW5jZSBkZSBsJ2F1dG9jb21wbGV0aW9uICFcblxuICAgICAgICB2YXIgem9vbSA9IDE1O1xuXG4gICAgICAgIHZhciBzZXJ2aWNlID0gaW5mby5zZXJ2aWNlO1xuICAgICAgICB2YXIgZmllbGRzID0gaW5mby5maWVsZHM7XG4gICAgICAgIHZhciB0eXBlID0gaW5mby50eXBlO1xuXG4gICAgICAgIHZhciBpbXBvcnRhbmNlID0ge1xuICAgICAgICAgICAgMSA6IDExLFxuICAgICAgICAgICAgMiA6IDEyLFxuICAgICAgICAgICAgMyA6IDEzLFxuICAgICAgICAgICAgNCA6IDE0LFxuICAgICAgICAgICAgNSA6IDE1LFxuICAgICAgICAgICAgNiA6IDE2LFxuICAgICAgICAgICAgNyA6IDE3LFxuICAgICAgICAgICAgOCA6IDE3XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQXV0b0NvbXBsZXRpb24gUE9JXG4gICAgICAgIGlmIChzZXJ2aWNlID09PSBcIlN1Z2dlc3RlZExvY2F0aW9uXCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgem9vbSA9IGltcG9ydGFuY2VbZmllbGRzLmNsYXNzaWZpY2F0aW9uXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlb2NvZGFnZSBQT0lcbiAgICAgICAgaWYgKHNlcnZpY2UgPT09IFwiR2VvY29kZWRMb2NhdGlvblwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJQb3NpdGlvbk9mSW50ZXJlc3RcIikge1xuICAgICAgICAgICAgICAgIHpvb20gPSBpbXBvcnRhbmNlW2ZpZWxkcy5pbXBvcnRhbmNlXSB8fCAxNDsgLy8gYXUgY2FzIG/DuSBsYSByZWNoZXJjaGUgZXN0IGVuIGZyZWVmb3JtICFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSBcIlN0cmVldEFkZHJlc3NcIikge1xuICAgICAgICAgICAgem9vbSA9IDE3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IFwiQ2FkYXN0cmFsUGFyY2VsXCIpIHtcbiAgICAgICAgICAgIHpvb20gPSAxNztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB6b29tO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNlYXJjaEVuZ2luZVV0aWxzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Common/Utils/SearchEngineUtils.js\n"); /***/ }), @@ -2345,7 +2345,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS_Controls_Editor_GPeditorOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CSS/Controls/Editor/GPeditorOpenLayers.css */ \"./src/OpenLayers/CSS/Controls/Editor/GPeditorOpenLayers.css\");\n/* harmony import */ var _CSS_Controls_Editor_GPeditorOpenLayers_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_Editor_GPeditorOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Editor_Style__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Editor/Style */ \"./src/OpenLayers/Controls/Editor/Style.js\");\n/* harmony import */ var _Editor_Themes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Editor/Themes */ \"./src/OpenLayers/Controls/Editor/Themes.js\");\n/* harmony import */ var _Editor_Filter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Editor/Filter */ \"./src/OpenLayers/Controls/Editor/Filter.js\");\n/* harmony import */ var _Editor_Legend__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Editor/Legend */ \"./src/OpenLayers/Controls/Editor/Legend.js\");\n/* harmony import */ var _Editor_Layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Editor/Layer */ \"./src/OpenLayers/Controls/Editor/Layer.js\");\n/* harmony import */ var _Editor_Group__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Editor/Group */ \"./src/OpenLayers/Controls/Editor/Group.js\");\n/* harmony import */ var _Editor_Event__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Editor/Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Editor_Search__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Editor/Search */ \"./src/OpenLayers/Controls/Editor/Search.js\");\n/* harmony import */ var _Common_Controls_Editor_EditorDOM__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Common/Controls/Editor/EditorDOM */ \"./src/Common/Controls/Editor/EditorDOM.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n// import CSS\n\n// import library\n\n// import local\n\n\n\n\n\n\n\n\n\n\n\n\n// DOM\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLogger(\"editor\");\n\n/**\n * @classdesc\n *\n * Editor Styles MapBox...\n *\n * @constructor\n * @alias ol.style.Editor\n * @param {Object} options - options for function call.\n * @fires editor:layer:onclickvisibility\n * @fires editor:layer:onclickclone\n * @fires editor:layer:onclickremove\n * @fires editor:style:oneditjson\n * @fires editor:style:scale:onchangemin\n * @fires editor:style:scale:onchangemax\n * @fires editor:legend:onclickedition\n * @fires editor:legend:onchangevalue\n * @fires editor:filter:oneditjson\n * @fires editor:themes:onclickimage\n * @fires editor:themes:onclicktitle\n * @fires editor:group:oncollapse\n * @fires editor:onloaded\n * @example\n * var editor = new Editor ({\n * target : \"\",\n * style : \"data/styles/layer.json\",\n * themes: {\n * themesSummary : \"\",\n * themes : [{\n * \"thumbnail\": \"data/images/layer0.png\",\n * \"name\": \"standard0\",\n * \"url\": \"data/styles/layer0.json\",\n * \"description\": \"\",\n * \"selected\" : true\n * },{\n * \"thumbnail\": \"data/images/layer1.png\",\n * \"name\": \"standard1\",\n * \"url\": \"data/styles/layer1.json\",\n * \"description\": \"\"\n * }]\n * },\n * scope : this,\n * events : {\n * \"editor:layer:onclickvisibility\" : ...,\n * \"editor:layer:onclickclone\" : ...,\n * \"editor:layer:onclickremove\" : ...,\n * \"editor:style:oneditjson\" : ...,\n * \"editor:style:scale:onchangemin\" : ...,\n * \"editor:style:scale:onchangemax\" : ...,\n * \"editor:filter:oneditjson\" : ...,\n * \"editor:themes:onclickimage\" : this._onClickEventImageTheme(),\n * \"editor:themes:onclicktitle\" : function(e) {...}\n * },\n * tools : {\n * // afficher/cacher les themes (par defaut) ou utiliser les options\n * themes : true | false | {\n * target : \"...\",\n * tools : {\n * \"thumbnails\": true,\n * \"button\": { visible : true, type : \"checkbox\" }\n * },\n * },\n * layers : true | false, // afficher les couches (layers)\n * search : true | false, // TODO : afficher l'outil de recheche de couches\n * style : true | false, // afficher les styles (sous menu layers)\n * filter : true | false, // afficher les filtres (sous menu layers)\n * legend : true | false, // afficher les legendes (layers)\n * group : true | false, // grouper les couches, l'option 'sort' doit être activée (layers)\n * groupAuto : true | false, // definir la construction automatiques des groupes\n * sort : true | false, // trier les couches (layers)\n * sortBy : \"id|class|geom\", // definir le type de tri (layers)\n * sortOrder : \"asc, desc\", // definir l'ordre de tri (layers)\n * title : true | false // afficher les titres des rubriques,\n * collapse : true | false | undefined // afficher et/ou plier les couches ou ne pas afficher l'option,\n * type : true | false, // afficher le type de geometrie (layers)\n * pin : true | false, // afficher la puce pour chaque couche (layers)\n * visibility : true | false, // afficher l'icone de visibilité (layers),\n * icon : { // afficher l'icone \"oeil\" ou \"checkbox\" (layers),\n * \"image\" : true,\n * \"anchor\" : \"start\" // afficher l'icone au debut ou à la fin de la ligne\n * },\n * editable : true | false // active l'edition de la legende (legendes)\n * }\n * });\n * // options par defaut\n * {\n * themes : false,\n * layers : true,\n * search : false,\n * style : false,\n * filter : false,\n * legend : false,\n * group : false,\n * groupAuto : false,\n * sort : true,\n * sortBy : \"id\",\n * sortOrder : \"asc\",\n * title : true,\n * collapse : undefined,\n * type : true,\n * pin : true,\n * visibility : true,\n * icon : {\n * image : true,\n * anchor : \"end\"\n * },\n * editable : true\n * }\n * // Context\n * editor.setContext(\"map\", map);\n * editor.setContext(\"layer\", layer);\n * // create DOM\n * editor.createElement()\n * .then(() => {\n * console.warn(editor.getID());\n * console.log(this.getContext(\"map\"));\n * console.log(this.getContext(\"layer\"));\n * })\n * .catch(error => {});\n * // possibility to add listeners with globale variable : eventbus\n * eventbus.addEventListener(\"editor:style:scale:onchangemin\", function (e) {...});\n */\nvar Editor = /*#__PURE__*/function () {\n function Editor(options) {\n _classCallCheck(this, Editor);\n logger.trace(\"[constructor] Editor\", options);\n\n // options\n this.options = options || {\n // TODO default...\n };\n if (!(this instanceof Editor)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Editor, [{\n key: \"_initialize\",\n value: function _initialize() {\n // gestion des options\n if (!this.options.target) {\n logger.info(\"La 'target' n'est pas renseignée (options.target).\");\n }\n if (!this.options.style) {\n logger.error(\"Le 'style' MapBox n'est pas renseigné (options.style) !\");\n return;\n }\n if (this.options.events) {\n this._initEvents();\n } else {\n logger.warn(\"Les 'handlers' ne sont pas renseignés (options.events) !\");\n }\n if (!this.options.themes) {\n logger.info(\"Les 'themes' MapBox ne sont pas renseignés (options.themes).\");\n }\n\n // options par defaut\n var _toolsDefault = {\n themes: false,\n layers: true,\n search: false,\n style: false,\n filter: false,\n legend: false,\n group: false,\n groupAuto: false,\n sort: true,\n sortBy: \"id\",\n sortOrder: \"asc\",\n title: true,\n collapse: undefined,\n type: true,\n pin: true,\n visibility: true,\n icon: {\n image: true,\n anchor: \"end\"\n },\n editable: true\n };\n if (!this.options.tools) {\n logger.trace(\"Utilisation des outils MapBox par défaut (options.tools).\");\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n\n // id unique\n this.id = this.options.id || _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__[\"default\"].generate();\n\n // context\n this.context = {};\n // property layers\n this.layers = [];\n // dom container\n this.container = null;\n // dom name\n this.name = {\n target: \"GPEditorMapBoxTarget\",\n container: \"GPEditorMapBoxContainer\",\n containerID: \"GPEditorMapBoxContainer_ID_\",\n containerLayers: \"GPEditorMapBoxLayersContainer\",\n titleLayers: \"GPEditorMapBoxLayersTitle\",\n titleLayersID: \"GPEditorMapBoxLayersTitle_ID_\",\n titleThemes: \"GPEditorMapBoxThemesTitle\",\n titleThemesID: \"GPEditorMapBoxThemesTitle_ID_\",\n sep: \"GPEditorMapBoxSep\"\n };\n // style json\n this.mapbox = {};\n // INFO\n // sprites :\n // {\n // url : null,\n // size : {\n // h : null,\n // w : null\n // },\n // json : {}\n // }\n this.sprites = {};\n }\n\n /**\n * Initialize events with handlers\n * (called by constructor)\n *\n * List Events :\n * \"editor:layer:visibility\"\n * \"editor:layer:clone\"\n * \"editor:layer:remove\"\n * \"editor:style:edit\"\n * \"editor:style:minScale\"\n * \"editor:style:maxScale\"\n * \"editor:filter:edit\"\n * \"editor:themes:image\",\n * \"editor:themes:title\"\n * @private\n */\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var ctx = this.options.scope || this;\n var events = this.options.events;\n if (events) {\n for (var event in events) {\n if (events.hasOwnProperty(event)) {\n var handler = events[event];\n // test sur les events disponibles !\n if (handler) {\n if (!eventbusjs__WEBPACK_IMPORTED_MODULE_1___default.a.hasEventListener(event, handler, ctx)) {\n eventbusjs__WEBPACK_IMPORTED_MODULE_1___default.a.addEventListener(event, handler, ctx);\n }\n }\n }\n }\n }\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @example\n *
\n *
Liste des 'thèmes'
\n *
\n * ...\n *
\n *
Liste des 'couches'
\n *
\n *
\n *
\n * \n * \n * \n *
\n *
\n *
...
\n *
...
\n *
\n *
\n * @private\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n logger.trace(this.mapbox);\n\n // existance d'un autre container (editeur) ?\n // var _idx = 0;\n // var elements = document.querySelectorAll(\"div[id^=\" + this.name.containerID + \"]\");\n // for (var j = 0; j < elements.length; j++) {\n // var element = elements[j];\n // var num = parseInt(element.id.substring(element.id.lastIndexOf(\"_\") + 1), 10);\n // if (num > _idx) {\n // _idx = num;\n // }\n // }\n // if (elements.length) {\n // _idx += 1;\n // }\n // container principal de l'editeur\n var div = document.createElement(\"div\");\n div.id = this.name.containerID + this.id;\n div.className = this.name.container;\n\n // Themes\n var _toolsThemes = this.options.tools.themes;\n if (_toolsThemes && this.options.themes) {\n // title\n if (this.options.tools.title) {\n var titleThemes = document.createElement(\"div\");\n titleThemes.id = this.name.titleThemesID + this.id;\n titleThemes.className = this.name.titleThemes;\n titleThemes.innerHTML = \"Liste des 'thèmes'\";\n div.appendChild(titleThemes);\n }\n\n // lien vers les styles\n var themes = new _Editor_Themes__WEBPACK_IMPORTED_MODULE_6__[\"default\"]({\n id: this.id,\n target: div,\n tools: _typeof(_toolsThemes) === \"object\" ? _toolsThemes : {},\n obj: this.options.themes\n });\n themes.add();\n }\n\n // TODO : Recheche / filtre de couches\n if (this.options.tools.search) {\n var search = new _Editor_Search__WEBPACK_IMPORTED_MODULE_12__[\"default\"]({\n id: this.id,\n target: div,\n tools: {},\n obj: this.mapbox.layers // liste des objets layers\n });\n search.add();\n }\n for (var source in this.mapbox.sources) {\n if (this.mapbox.sources.hasOwnProperty(source)) {\n if (this.options.tools.layers) {\n // multisources ? Si oui, on renseigne un titre...\n var multisources = Object.keys(this.mapbox.sources).length > 1 ? 1 : 0;\n if (multisources) {\n var hr = document.createElement(\"hr\");\n hr.className = this.name.sep;\n div.appendChild(hr);\n }\n // title\n if (this.options.tools.title) {\n var titleLayers = document.createElement(\"div\");\n titleLayers.id = this.name.titleLayersID + this.id;\n titleLayers.className = this.name.titleLayers;\n titleLayers.innerHTML = multisources ? \"Liste des 'couches' (\" + source + \")\" : \"Liste des 'couches'\";\n div.appendChild(titleLayers);\n }\n }\n\n // gestion de l'ordre avant tri avec la metadata 'order'\n var _layers = this.mapbox.layers.slice(); // clone\n\n // une fois les layers triés, la metadata:geoportail:order permet\n // de savoir l'emplacement du layers dans le fichier de style.\n _layers.forEach(function (layer, order) {\n // on écarte les layers sans source: ex. \"background\"\n // if (!layer.source) {\n // return;\n // }\n // ajout de la metadata d'ordre\n var _metadata = layer[\"metadata\"];\n if (_metadata) {\n _metadata[\"geoportail:order\"] = order;\n } else {\n layer[\"metadata\"] = {\n \"geoportail:order\": order\n };\n }\n });\n // tri des layers\n if (this.options.tools.sort) {\n var sortBy = this.options.tools.sortBy;\n var sortOrder = this.options.tools.sortOrder;\n var sortFct = function sortFct(a, b) {\n // si on utilise les groupements utilisateurs, ils doivent\n // tous être renseignés sinon..., ça va coincer !\n var result = 0;\n if (a[\"metadata\"] && a[\"metadata\"][\"geoportail:group\"] && b[\"metadata\"] && b[\"metadata\"][\"geoportail:group\"]) {\n var cmpA = null;\n var cmpB = null;\n cmpA = a[\"metadata\"][\"geoportail:group\"];\n cmpB = b[\"metadata\"][\"geoportail:group\"];\n result = cmpA.localeCompare(cmpB);\n } else {\n switch (sortBy) {\n case \"geom\":\n result = sortOrder === \"asc\" ? a.type.localeCompare(b.type) || a.id.localeCompare(b.id) : b.type.localeCompare(a.type) || b.id.localeCompare(a.id);\n break;\n case \"class\":\n result = sortOrder === \"asc\" ? a[\"source-layer\"].localeCompare(b[\"source-layer\"]) || a.id.localeCompare(b.id) : b[\"source-layer\"].localeCompare(a[\"source-layer\"]) || b.id.localeCompare(a.id);\n break;\n case \"id\":\n default:\n // tri sur l'id par defaut\n result = sortOrder === \"asc\" ? a.id.localeCompare(b.id) : b.id.localeCompare(a.id);\n break;\n }\n }\n return result;\n };\n _layers.sort(sortFct);\n }\n logger.trace(\"Layers : \", _layers);\n\n // gestion des groupes avec la metadata de groupe\n var groupBy = this.options.tools.sortBy; // le même type de tri que les couches !\n var groupAuto = this.options.tools.groupAuto;\n var _groups = {}; // liste et comptage des layers dans chaque groupes\n _layers.forEach(function (layer) {\n // on écarte les layers sans source: ex. \"background\"\n // if (!layer.source) {\n // return;\n // }\n // balise metadata\n var _metadata = layer[\"metadata\"];\n // s'il existe déjà une meta de groupe, on l'utilise...\n // sinon, on la met en place.\n if (_metadata && _metadata[\"geoportail:group\"]) {\n var _groupName = _metadata[\"geoportail:group\"];\n _groups[_groupName] = _groups[_groupName] ? _groups[_groupName] + 1 : 1;\n } else {\n var _field = null;\n switch (groupBy) {\n case \"class\":\n _field = layer[\"source-layer\"];\n break;\n case \"geom\":\n _field = layer.type;\n break;\n case \"id\":\n default:\n _field = layer.id;\n break;\n }\n var _newGroupName = _field;\n if (groupAuto) {\n // separateur\n var _regex = /_|-|:|=/; // TODO à definir via une option !\n\n // index\n var _idx = _field.search(_regex);\n // y'a t il un separateur ?\n _newGroupName = _idx !== -1 ? _field.substring(0, _idx).trim() : _field;\n }\n // on compte le nombre d'entrée dans un groupe\n _groups[_newGroupName] = _groups[_newGroupName] ? _groups[_newGroupName] + 1 : 1;\n\n // ajout de la metadata de groupe\n if (_metadata) {\n _metadata[\"geoportail:group\"] = _newGroupName;\n } else {\n layer[\"metadata\"] = {\n \"geoportail:group\": _newGroupName\n };\n }\n }\n });\n logger.trace(\"Groups : \", _groups);\n\n // container principal des couches\n var divLayers = document.createElement(\"div\");\n divLayers.className = this.name.containerLayers;\n div.appendChild(divLayers);\n var details;\n if (this.options.tools.collapse !== undefined) {\n details = document.createElement(\"details\");\n details.className = \"\";\n details.open = !this.options.tools.collapse;\n divLayers.appendChild(details);\n var summary = document.createElement(\"summary\");\n summary.className = \"\";\n summary.innerHTML = \"\";\n details.appendChild(summary);\n }\n\n // container courant (cf. groupe) pour l'ajout des elements\n var target = this.options.tools.collapse !== undefined ? details : divLayers;\n\n // Ex. Layers, Styles, Groups et Filtres\n // \"id\": \"ocs - vegetation\",\n // \"type\": \"fill\",\n // \"source\": \"pyramide_proto\",\n // \"source-layer\": \"ocs_vegetation_surf\",\n // \"metadata\" : {\n // \"geoportail:group\": \"ocs\"\n // },\n // \"layout\": {\n // \"visibility\": \"visible\"\n // },\n // \"filter\": [\"in\",\"symbo\",\n // \"SURFACE_D_EAU\",\n // \"BASSIN\",\n // \"ZONE_MARINE\"\n // ],\n // \"paint\": {\n // \"fill-color\": \"#2BB3E1\"\n // }\n var index = -1;\n for (var ii = 0; ii < _layers.length; ii++) {\n var data = _layers[ii];\n index++;\n\n // traitement dans l'ordre des sources\n if (data.source === source) {\n // Groups\n // INFO la gestion des groupes est basée sur la balise metadata::geoportail:group\n // ainsi que sur l'ordre des couches.\n // il n'y a pas de regroupement sans tri des couches !\n if (this.options.tools.group && this.options.tools.sort) {\n var mtd = data.metadata;\n // creation du container de groupe\n // si le tag metadata existe\n if (mtd) {\n var grp = data.metadata[\"geoportail:group\"];\n if (grp) {\n // le groupe doit contenir plus d'un element\n if (_groups[grp] > 1) {\n // le groupe est déjà créé, on en veut plus par la suite...\n _groups[grp] = -1;\n // creation du groupe\n var oGroup = new _Editor_Group__WEBPACK_IMPORTED_MODULE_10__[\"default\"]({\n id: this.id,\n target: this.options.tools.collapse !== undefined ? details : divLayers,\n title: grp,\n collapse: true\n });\n oGroup.add();\n // le nouveau container pour les elements suivants\n target = oGroup.getContainer();\n } else if (_groups[grp] === 1) {\n // l'element est seul, donc pas d'ajout dans le\n // groupe en cours\n target = this.options.tools.collapse !== undefined ? details : divLayers;\n } else {\n // on ajoute l'element dans le groupe courant...\n }\n } else {\n target = this.options.tools.collapse !== undefined ? details : divLayers;\n }\n } else {\n target = this.options.tools.collapse !== undefined ? details : divLayers;\n }\n }\n // Layers\n if (this.options.tools.layers) {\n var oLayer = new _Editor_Layer__WEBPACK_IMPORTED_MODULE_9__[\"default\"]({\n id: this.id,\n target: target,\n position: index + \"_\" + this.id,\n // unique !\n tools: {\n visibility: this.options.tools.visibility,\n icon: this.options.tools.icon,\n type: this.options.tools.type,\n pin: this.options.tools.pin\n },\n obj: {\n id: data.id,\n type: data.type,\n source: data.source,\n \"source-layer\": data[\"source-layer\"]\n }\n });\n oLayer.add();\n // update visibility layer\n if (data.layout && data.layout.visibility && data.layout.visibility === \"none\") {\n oLayer.visibility(false);\n }\n // sauvegarde des layers\n this.layers.push(oLayer);\n }\n // Legende\n if (this.options.tools.legend) {\n // gestion de l'edition de la legende :\n // l'option \"editable\" est prioritaire sur le tag \"editable\" du fichier de style !\n var isEditable = this.options.tools.editable;\n if (typeof isEditable === \"undefined\") {\n isEditable = data.editable;\n }\n var oLegend = new _Editor_Legend__WEBPACK_IMPORTED_MODULE_8__[\"default\"]({\n id: this.id,\n target: target,\n sprites: this.sprites,\n obj: {\n id: data.id,\n source: data.source,\n title: data.id,\n editable: typeof isEditable !== \"undefined\" ? isEditable : false,\n paint: data.paint,\n layout: data.layout\n }\n });\n oLegend.add();\n oLegend.display(false);\n if (oLayer) {\n oLayer.addLegend(oLegend);\n oLayer.slotLegend(); // integration de la legende dans le container du layers !\n }\n }\n // Style\n if (this.options.tools.style) {\n var oStyle = new _Editor_Style__WEBPACK_IMPORTED_MODULE_5__[\"default\"]({\n id: this.id,\n target: target,\n position: index + \"_\" + this.id,\n // unique !,\n obj: {\n id: data.id,\n source: data.source,\n layout: data.layout,\n paint: data.paint\n }\n });\n oStyle.add();\n oStyle.display(false);\n if (oLayer) {\n oLayer.addStyle(oStyle);\n }\n // update visibility layer\n if (data.layout && data.layout.visibility && data.layout.visibility === \"none\") {\n oLayer.visibility(false);\n }\n }\n // Filter\n if (this.options.tools.filter) {\n var oFilter = new _Editor_Filter__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n id: this.id,\n target: target,\n position: index + \"_\" + this.id,\n // unique !,\n obj: {\n id: data.id,\n source: data.source,\n filter: data.Filter\n }\n });\n oFilter.add();\n oFilter.display(false);\n if (oLayer) {\n oLayer.addFilter(oFilter);\n }\n }\n } else {\n // on ecarte un layer car il n'est pas reconnu dans la source\n // on decremente la position du layer\n if (index >= 0) {\n index--;\n }\n }\n }\n }\n }\n\n // sauvegarde\n this.container = div;\n\n // container principal\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var _target = document.createElement(\"div\");\n _target.id = this.name.target;\n var node = document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0] || document.documentElement;\n node.appendChild(_target);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n // dispatch event\n eventbusjs__WEBPACK_IMPORTED_MODULE_1___default.a.dispatch(_Editor_Event__WEBPACK_IMPORTED_MODULE_11__[\"default\"].onloaded, this);\n }\n\n /**\n * Getting Sprites informations\n * (called by _initialize)\n *\n * @param {String} sprites - url des sprites\n * @returns {Promise} - promise\n * @private\n */\n }, {\n key: \"_getSprites\",\n value: function _getSprites(sprites) {\n var self = this;\n\n // on ne doit pas mettre de promise en échec...\n // car on souhaite continuer le traitement même si on n'a pas de sprites !\n // si le protocole est mapbox://\n if (sprites && sprites.startsWith(\"mapbox://\")) {\n return new Promise(function (resolve, reject) {\n logger.error(\"Protocole mapbox:// non géré !\");\n resolve(self);\n });\n }\n // si pas de sprites\n if (!sprites) {\n return new Promise(function (resolve, reject) {\n logger.error(\"Auncun sprites disponibles !\");\n resolve(self);\n });\n }\n var fetchSpritesImage = function fetchSpritesImage() {\n var spritesImage = sprites + \".png\";\n return fetch(spritesImage, {\n credentials: \"same-origin\"\n }).then(function (response) {\n if (response.ok) {\n return response.blob().then(function (blob) {\n self.sprites.url = spritesImage;\n // decode de l'image\n var theImage = new Image();\n theImage.src = spritesImage;\n return theImage.decode().then(function () {\n self.sprites.size = {};\n self.sprites.size.h = theImage.height;\n self.sprites.size.w = theImage.width;\n });\n })[\"catch\"](function (error) {\n logger.warn(\"fetch image sprites exception :\", error);\n });\n } else {\n var err = new Error(\"HTTP status code: \" + response.status);\n throw err;\n }\n })[\"catch\"](function (error) {\n return new Promise(function (resolve, reject) {\n logger.error(\"fetch image sprites exception :\", error);\n reject(error);\n });\n });\n };\n var fetchSpritesJson = function fetchSpritesJson() {\n var spritesJson = sprites + \".json\";\n return fetch(spritesJson, {\n credentials: \"same-origin\"\n }).then(function (response) {\n if (response.ok) {\n return response.json().then(function (json) {\n self.sprites.json = json;\n })[\"catch\"](function (error) {\n logger.warn(\"fetch json sprites exception :\", error);\n });\n } else {\n var err = new Error(\"HTTP status code: \" + response.status);\n throw err;\n }\n })[\"catch\"](function (error) {\n return new Promise(function (resolve, reject) {\n logger.error(\"fetch json sprites exception :\", error);\n reject(error);\n });\n });\n };\n\n // promise\n return Promise.all([fetchSpritesImage(), fetchSpritesJson()]);\n }\n\n // ################################################################### //\n // ########################## INTERFACE ############################## //\n // ################################################################### //\n /**\n * Create Editor\n *\n * @returns {Promise} - promise\n */\n }, {\n key: \"createElement\",\n value: function createElement() {\n var self = this;\n // objet json\n if (_typeof(this.options.style) === \"object\") {\n this.mapbox = this.options.style;\n // les sprites sont utiles que si on veut une legende !\n if (this.options.tools.legend) {\n return this._getSprites(this.mapbox.sprite).then(function () {\n // init du DOM\n self._initContainer();\n return self;\n })[\"catch\"](function (error) {\n logger.warn(\"fetch sprites exception :\", error);\n });\n } else {\n return new Promise(function (resolve, reject) {\n self._initContainer();\n resolve(self);\n });\n }\n }\n\n // url\n if (typeof this.options.style === \"string\") {\n return fetch(this.options.style, {\n credentials: \"same-origin\"\n }).then(function (response) {\n // sauvegarde du json\n return response.json().then(function (style) {\n self.mapbox = style;\n }).then(function () {\n // les sprites sont utiles que si on veut une legende !\n if (self.options.tools.legend) {\n return self._getSprites(self.mapbox.sprite).then(function () {\n // init du DOM\n self._initContainer();\n return self;\n })[\"catch\"](function (error) {\n logger.warn(\"fetch sprites exception :\", error);\n });\n } else {\n return new Promise(function (resolve, reject) {\n self._initContainer();\n resolve(self);\n });\n }\n })[\"catch\"](function (error) {\n logger.error(\"json exception :\", error);\n });\n })[\"catch\"](function (error) {\n logger.error(\"fetch exception :\", error);\n });\n }\n }\n\n /**\n * Set display container (DOM)\n *\n * @param {Boolean} display - show/hidden container\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n this.container.style.display = _display ? \"block\" : \"none\";\n }\n }, {\n key: \"setContext\",\n value: function setContext(key, value) {\n this.context[key] = value;\n }\n }, {\n key: \"getContext\",\n value: function getContext(key) {\n return this.context[key];\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Get id editor\n * @returns {Number} id\n */\n }, {\n key: \"getID\",\n value: function getID() {\n return this.id;\n }\n\n /**\n * Get container (DOM)\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n /**\n * Get Style (json)\n * @returns {Object} Style MapBox\n */\n }, {\n key: \"getStyle\",\n value: function getStyle() {\n return this.mapbox;\n }\n\n /**\n * Get layer style (json)\n * @param {Number} i - index\n * @returns {Object} Style MapBox of a layers\n */\n }, {\n key: \"getStyleLayer\",\n value: function getStyleLayer(i) {\n var layer = null;\n var o = this.getLayer(i);\n var id = o.options.obj.id;\n for (var k = 0; k < this.mapbox.layers.length; k++) {\n var l = this.mapbox.layers[k];\n if (l.id === id) {\n layer = l;\n break;\n }\n }\n return layer;\n }\n\n /**\n * Get layer object from json style\n * @param {Number} i - index into style json\n * @returns {Object} Style MapBox of a layers\n */\n }, {\n key: \"getLayerFromStyle\",\n value: function getLayerFromStyle(i) {\n var layer = null;\n var l = this.mapbox.layers[i];\n for (var k = 0; k < this.getLayers().length; k++) {\n var o = this.getLayer(k);\n if (l.id === o.options.obj.id) {\n layer = o;\n break;\n }\n }\n return layer;\n }\n\n /**\n * Get a list of layer object sorted or not (see options.tools.sort)\n * @returns {Array} - List of layer object\n * @see {ol.style.editor.Layer}\n */\n }, {\n key: \"getLayers\",\n value: function getLayers() {\n return this.layers;\n }\n\n /**\n * Get the layer object from a list sorted or not (see options.tools.sort)\n * @param {Number} i - index\n * @returns {Object} - layer object\n * @see {ol.style.editor.Layer}\n */\n }, {\n key: \"getLayer\",\n value: function getLayer(i) {\n return this.layers[i];\n }\n }]);\n}();\n;\n\n// on récupère les méthodes de la classe DOM\n_Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].assign(Editor.prototype, _Common_Controls_Editor_EditorDOM__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n\n// ################################################################### //\n// ####################### handlers events to dom #################### //\n// ################################################################### //\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Editor);\n\n// Expose Editor as ol.editor.View (for a build bundle)\nif (window.ol && window.ol.style) {\n window.ol.style.Editor = Editor;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci5qcz80MWI0Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkVkaXRvciIsIm9wdGlvbnMiLCJfY2xhc3NDYWxsQ2hlY2siLCJ0cmFjZSIsIlR5cGVFcnJvciIsIl9pbml0aWFsaXplIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJ0YXJnZXQiLCJpbmZvIiwic3R5bGUiLCJlcnJvciIsImV2ZW50cyIsIl9pbml0RXZlbnRzIiwid2FybiIsInRoZW1lcyIsIl90b29sc0RlZmF1bHQiLCJsYXllcnMiLCJzZWFyY2giLCJmaWx0ZXIiLCJsZWdlbmQiLCJncm91cCIsImdyb3VwQXV0byIsInNvcnQiLCJzb3J0QnkiLCJzb3J0T3JkZXIiLCJ0aXRsZSIsImNvbGxhcHNlIiwidW5kZWZpbmVkIiwidHlwZSIsInBpbiIsInZpc2liaWxpdHkiLCJpY29uIiwiaW1hZ2UiLCJhbmNob3IiLCJlZGl0YWJsZSIsInRvb2xzIiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsImlkIiwiSUQiLCJnZW5lcmF0ZSIsImNvbnRleHQiLCJjb250YWluZXIiLCJuYW1lIiwiY29udGFpbmVySUQiLCJjb250YWluZXJMYXllcnMiLCJ0aXRsZUxheWVycyIsInRpdGxlTGF5ZXJzSUQiLCJ0aXRsZVRoZW1lcyIsInRpdGxlVGhlbWVzSUQiLCJzZXAiLCJtYXBib3giLCJzcHJpdGVzIiwiY3R4Iiwic2NvcGUiLCJldmVudCIsImhhc093blByb3BlcnR5IiwiaGFuZGxlciIsIkV2ZW50QnVzIiwiaGFzRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJfaW5pdENvbnRhaW5lciIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIl90b29sc1RoZW1lcyIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwiVGhlbWVzIiwiX3R5cGVvZiIsIm9iaiIsImFkZCIsIlNlYXJjaCIsInNvdXJjZSIsInNvdXJjZXMiLCJtdWx0aXNvdXJjZXMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiaHIiLCJfbGF5ZXJzIiwic2xpY2UiLCJmb3JFYWNoIiwibGF5ZXIiLCJvcmRlciIsIl9tZXRhZGF0YSIsInNvcnRGY3QiLCJhIiwiYiIsInJlc3VsdCIsImNtcEEiLCJjbXBCIiwibG9jYWxlQ29tcGFyZSIsImdyb3VwQnkiLCJfZ3JvdXBzIiwiX2dyb3VwTmFtZSIsIl9maWVsZCIsIl9uZXdHcm91cE5hbWUiLCJfcmVnZXgiLCJfaWR4Iiwic3Vic3RyaW5nIiwidHJpbSIsImRpdkxheWVycyIsImRldGFpbHMiLCJvcGVuIiwic3VtbWFyeSIsImluZGV4IiwiaWkiLCJkYXRhIiwibXRkIiwibWV0YWRhdGEiLCJncnAiLCJvR3JvdXAiLCJHcm91cCIsImdldENvbnRhaW5lciIsIm9MYXllciIsIkxheWVyIiwicG9zaXRpb24iLCJsYXlvdXQiLCJwdXNoIiwiaXNFZGl0YWJsZSIsIm9MZWdlbmQiLCJMZWdlbmQiLCJwYWludCIsImRpc3BsYXkiLCJhZGRMZWdlbmQiLCJzbG90TGVnZW5kIiwib1N0eWxlIiwiU3R5bGUiLCJhZGRTdHlsZSIsIm9GaWx0ZXIiLCJGaWx0ZXIiLCJhZGRGaWx0ZXIiLCJnZXRFbGVtZW50QnlJZCIsIl90YXJnZXQiLCJub2RlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkb2N1bWVudEVsZW1lbnQiLCJkaXNwYXRjaCIsIkV2ZW50Iiwib25sb2FkZWQiLCJfZ2V0U3ByaXRlcyIsInNlbGYiLCJzdGFydHNXaXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmZXRjaFNwcml0ZXNJbWFnZSIsInNwcml0ZXNJbWFnZSIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwicmVzcG9uc2UiLCJvayIsImJsb2IiLCJ1cmwiLCJ0aGVJbWFnZSIsIkltYWdlIiwic3JjIiwiZGVjb2RlIiwic2l6ZSIsImgiLCJoZWlnaHQiLCJ3Iiwid2lkdGgiLCJlcnIiLCJFcnJvciIsInN0YXR1cyIsImZldGNoU3ByaXRlc0pzb24iLCJzcHJpdGVzSnNvbiIsImpzb24iLCJhbGwiLCJzcHJpdGUiLCJzZXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImdldElEIiwiZ2V0U3R5bGUiLCJnZXRTdHlsZUxheWVyIiwiaSIsIm8iLCJnZXRMYXllciIsImsiLCJsIiwiZ2V0TGF5ZXJGcm9tU3R5bGUiLCJnZXRMYXllcnMiLCJhc3NpZ24iLCJwcm90b3R5cGUiLCJFZGl0b3JET00iLCJ3aW5kb3ciLCJvbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUN1RDtBQUN2RDtBQUNrQztBQUNsQztBQUN1QztBQUNRO0FBQ1M7QUFDckI7QUFDRTtBQUNBO0FBQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDRTs7QUFFckM7QUFDK0Q7QUFFL0QsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsUUFBUSxDQUFDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QU9oRyxLQUFLO0lBQ2hCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBL0UsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQW1MLFVBQUEsRUFBYTtNQUNULE9BQU8sSUFBSSxDQUFDekssTUFBTTtJQUN0Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBWCxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBK0ssU0FBVUYsQ0FBQyxFQUFFO01BQ1QsT0FBTyxJQUFJLENBQUNuSyxNQUFNLENBQUNtSyxDQUFDLENBQUM7SUFDekI7RUFBQztBQUFBO0FBRUo7O0FBRUQ7QUFDQS9JLHFEQUFLLENBQUNzSixNQUFNLENBQUM1TCxNQUFNLENBQUM2TCxTQUFTLEVBQUVDLDBFQUFTLENBQUM7O0FBRXpDO0FBQ0E7QUFDQTs7QUFFZTlMLHFFQUFNLEVBQUM7O0FBRXRCO0FBQ0EsSUFBSStMLE1BQU0sQ0FBQ0MsRUFBRSxJQUFJRCxNQUFNLENBQUNDLEVBQUUsQ0FBQ3JMLEtBQUssRUFBRTtFQUM5Qm9MLE1BQU0sQ0FBQ0MsRUFBRSxDQUFDckwsS0FBSyxDQUFDWCxNQUFNLEdBQUdBLE1BQU07QUFDbkMiLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9Db250cm9scy9FZGl0b3IuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgQ1NTXG5pbXBvcnQgXCIuLi9DU1MvQ29udHJvbHMvRWRpdG9yL0dQZWRpdG9yT3BlbkxheWVycy5jc3NcIjtcbi8vIGltcG9ydCBsaWJyYXJ5XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSBcImV2ZW50YnVzanNcIjtcbi8vIGltcG9ydCBsb2NhbFxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBJRCBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL1NlbGVjdG9ySURcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBTdHlsZSBmcm9tIFwiLi9FZGl0b3IvU3R5bGVcIjtcbmltcG9ydCBUaGVtZXMgZnJvbSBcIi4vRWRpdG9yL1RoZW1lc1wiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwiLi9FZGl0b3IvRmlsdGVyXCI7XG5pbXBvcnQgTGVnZW5kIGZyb20gXCIuL0VkaXRvci9MZWdlbmRcIjtcbmltcG9ydCBMYXllciBmcm9tIFwiLi9FZGl0b3IvTGF5ZXJcIjtcbmltcG9ydCBHcm91cCBmcm9tIFwiLi9FZGl0b3IvR3JvdXBcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwiLi9FZGl0b3IvRXZlbnRcIjtcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vRWRpdG9yL1NlYXJjaFwiO1xuXG4vLyBET01cbmltcG9ydCBFZGl0b3JET00gZnJvbSBcIi4uLy4uL0NvbW1vbi9Db250cm9scy9FZGl0b3IvRWRpdG9yRE9NXCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBFZGl0b3IgU3R5bGVzIE1hcEJveC4uLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnN0eWxlLkVkaXRvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQGZpcmVzIGVkaXRvcjpsYXllcjpvbmNsaWNrdmlzaWJpbGl0eVxuICogQGZpcmVzIGVkaXRvcjpsYXllcjpvbmNsaWNrY2xvbmVcbiAqIEBmaXJlcyBlZGl0b3I6bGF5ZXI6b25jbGlja3JlbW92ZVxuICogQGZpcmVzIGVkaXRvcjpzdHlsZTpvbmVkaXRqc29uXG4gKiBAZmlyZXMgZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWluXG4gKiBAZmlyZXMgZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWF4XG4gKiBAZmlyZXMgZWRpdG9yOmxlZ2VuZDpvbmNsaWNrZWRpdGlvblxuICogQGZpcmVzIGVkaXRvcjpsZWdlbmQ6b25jaGFuZ2V2YWx1ZVxuICogQGZpcmVzIGVkaXRvcjpmaWx0ZXI6b25lZGl0anNvblxuICogQGZpcmVzIGVkaXRvcjp0aGVtZXM6b25jbGlja2ltYWdlXG4gKiBAZmlyZXMgZWRpdG9yOnRoZW1lczpvbmNsaWNrdGl0bGVcbiAqIEBmaXJlcyBlZGl0b3I6Z3JvdXA6b25jb2xsYXBzZVxuICogQGZpcmVzIGVkaXRvcjpvbmxvYWRlZFxuICogQGV4YW1wbGVcbiAqICAgdmFyIGVkaXRvciA9IG5ldyBFZGl0b3IgKHtcbiAqICAgICAgdGFyZ2V0IDogXCJcIixcbiAqICAgICAgc3R5bGUgOiBcImRhdGEvc3R5bGVzL2xheWVyLmpzb25cIixcbiAqICAgICAgdGhlbWVzOiB7XG4gKiAgICAgICAgICB0aGVtZXNTdW1tYXJ5IDogXCJcIixcbiAqICAgICAgICAgIHRoZW1lcyA6IFt7XG4gKiAgICAgICAgICAgICBcInRodW1ibmFpbFwiOiBcImRhdGEvaW1hZ2VzL2xheWVyMC5wbmdcIixcbiAqICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YW5kYXJkMFwiLFxuICogICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3N0eWxlcy9sYXllcjAuanNvblwiLFxuICogICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICogICAgICAgICAgICAgXCJzZWxlY3RlZFwiIDogdHJ1ZVxuICogICAgICAgICAgfSx7XG4gKiAgICAgICAgICAgICBcInRodW1ibmFpbFwiOiBcImRhdGEvaW1hZ2VzL2xheWVyMS5wbmdcIixcbiAqICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YW5kYXJkMVwiLFxuICogICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3N0eWxlcy9sYXllcjEuanNvblwiLFxuICogICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXG4gKiAgICAgICAgICB9XVxuICogICAgICB9LFxuICogICAgICBzY29wZSA6IHRoaXMsXG4gKiAgICAgIGV2ZW50cyA6IHtcbiAqICAgICAgICAgIFwiZWRpdG9yOmxheWVyOm9uY2xpY2t2aXNpYmlsaXR5XCIgOiAuLi4sXG4gKiAgICAgICAgICBcImVkaXRvcjpsYXllcjpvbmNsaWNrY2xvbmVcIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOmxheWVyOm9uY2xpY2tyZW1vdmVcIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOnN0eWxlOm9uZWRpdGpzb25cIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWluXCIgOiAuLi4sXG4gKiAgICAgICAgICBcImVkaXRvcjpzdHlsZTpzY2FsZTpvbmNoYW5nZW1heFwiIDogLi4uLFxuICogICAgICAgICAgXCJlZGl0b3I6ZmlsdGVyOm9uZWRpdGpzb25cIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOnRoZW1lczpvbmNsaWNraW1hZ2VcIiA6IHRoaXMuX29uQ2xpY2tFdmVudEltYWdlVGhlbWUoKSxcbiAqICAgICAgICAgIFwiZWRpdG9yOnRoZW1lczpvbmNsaWNrdGl0bGVcIiA6IGZ1bmN0aW9uKGUpIHsuLi59XG4gKiAgICAgIH0sXG4gKiAgICAgIHRvb2xzIDoge1xuICogICAgICAgICAgLy8gYWZmaWNoZXIvY2FjaGVyIGxlcyB0aGVtZXMgKHBhciBkZWZhdXQpIG91IHV0aWxpc2VyIGxlcyBvcHRpb25zXG4gKiAgICAgICAgICB0aGVtZXMgOiB0cnVlIHwgZmFsc2UgfCB7XG4gKiAgICAgICAgICAgICAgdGFyZ2V0IDogXCIuLi5cIixcbiAqICAgICAgICAgICAgICB0b29scyA6IHtcbiAqICAgICAgICAgICAgICAgICAgXCJ0aHVtYm5haWxzXCI6IHRydWUsXG4gKiAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCI6IHsgdmlzaWJsZSA6IHRydWUsIHR5cGUgOiBcImNoZWNrYm94XCIgfVxuICogICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgbGF5ZXJzIDogdHJ1ZSB8IGZhbHNlLCAgICAgLy8gYWZmaWNoZXIgbGVzIGNvdWNoZXMgKGxheWVycylcbiAqICAgICAgICAgIHNlYXJjaCA6IHRydWUgfCBmYWxzZSwgICAgIC8vIFRPRE8gOiBhZmZpY2hlciBsJ291dGlsIGRlIHJlY2hlY2hlIGRlIGNvdWNoZXNcbiAqICAgICAgICAgIHN0eWxlIDogdHJ1ZSB8IGZhbHNlLCAgICAgIC8vIGFmZmljaGVyIGxlcyBzdHlsZXMgKHNvdXMgbWVudSBsYXllcnMpXG4gKiAgICAgICAgICBmaWx0ZXIgOiB0cnVlIHwgZmFsc2UsICAgICAvLyBhZmZpY2hlciBsZXMgZmlsdHJlcyAoc291cyBtZW51IGxheWVycylcbiAqICAgICAgICAgIGxlZ2VuZCA6IHRydWUgfCBmYWxzZSwgICAgIC8vIGFmZmljaGVyIGxlcyBsZWdlbmRlcyAobGF5ZXJzKVxuICogICAgICAgICAgZ3JvdXAgOiB0cnVlIHwgZmFsc2UsICAgICAgLy8gZ3JvdXBlciBsZXMgY291Y2hlcywgbCdvcHRpb24gJ3NvcnQnIGRvaXQgw6p0cmUgYWN0aXbDqWUgKGxheWVycylcbiAqICAgICAgICAgIGdyb3VwQXV0byA6IHRydWUgfCBmYWxzZSwgIC8vIGRlZmluaXIgbGEgY29uc3RydWN0aW9uIGF1dG9tYXRpcXVlcyBkZXMgZ3JvdXBlc1xuICogICAgICAgICAgc29ydCA6IHRydWUgfCBmYWxzZSwgICAgICAgLy8gdHJpZXIgbGVzIGNvdWNoZXMgKGxheWVycylcbiAqICAgICAgICAgIHNvcnRCeSA6IFwiaWR8Y2xhc3N8Z2VvbVwiLCAgLy8gZGVmaW5pciBsZSB0eXBlIGRlIHRyaSAobGF5ZXJzKVxuICogICAgICAgICAgc29ydE9yZGVyIDogXCJhc2MsIGRlc2NcIiwgICAvLyBkZWZpbmlyIGwnb3JkcmUgZGUgdHJpIChsYXllcnMpXG4gKiAgICAgICAgICB0aXRsZSA6IHRydWUgfCBmYWxzZSAgICAgICAvLyBhZmZpY2hlciBsZXMgdGl0cmVzIGRlcyBydWJyaXF1ZXMsXG4gKiAgICAgICAgICBjb2xsYXBzZSA6IHRydWUgfCBmYWxzZSB8IHVuZGVmaW5lZCAvLyBhZmZpY2hlciBldC9vdSBwbGllciBsZXMgY291Y2hlcyBvdSBuZSBwYXMgYWZmaWNoZXIgbCdvcHRpb24sXG4gKiAgICAgICAgICB0eXBlIDogdHJ1ZSB8IGZhbHNlLCAgICAgICAvLyBhZmZpY2hlciBsZSB0eXBlIGRlIGdlb21ldHJpZSAobGF5ZXJzKVxuICogICAgICAgICAgcGluIDogdHJ1ZSB8IGZhbHNlLCAgICAgICAgLy8gYWZmaWNoZXIgbGEgcHVjZSBwb3VyIGNoYXF1ZSBjb3VjaGUgKGxheWVycylcbiAqICAgICAgICAgIHZpc2liaWxpdHkgOiB0cnVlIHwgZmFsc2UsIC8vIGFmZmljaGVyIGwnaWNvbmUgZGUgdmlzaWJpbGl0w6kgKGxheWVycyksXG4gKiAgICAgICAgICBpY29uIDogeyAgICAgICAgICAgICAgICAgICAvLyBhZmZpY2hlciBsJ2ljb25lIFwib2VpbFwiIG91IFwiY2hlY2tib3hcIiAobGF5ZXJzKSxcbiAqICAgICAgICAgICAgICBcImltYWdlXCIgOiB0cnVlLFxuICogICAgICAgICAgICAgIFwiYW5jaG9yXCIgOiBcInN0YXJ0XCIgLy8gYWZmaWNoZXIgbCdpY29uZSBhdSBkZWJ1dCBvdSDDoCBsYSBmaW4gZGUgbGEgbGlnbmVcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBlZGl0YWJsZSA6IHRydWUgfCBmYWxzZSAgICAvLyBhY3RpdmUgbCdlZGl0aW9uIGRlIGxhIGxlZ2VuZGUgKGxlZ2VuZGVzKVxuICogICAgICB9XG4gKiAgIH0pO1xuICogICAvLyBvcHRpb25zIHBhciBkZWZhdXRcbiAqICAge1xuICogICAgICB0aGVtZXMgOiBmYWxzZSxcbiAqICAgICAgbGF5ZXJzIDogdHJ1ZSxcbiAqICAgICAgc2VhcmNoIDogZmFsc2UsXG4gKiAgICAgIHN0eWxlIDogZmFsc2UsXG4gKiAgICAgIGZpbHRlciA6IGZhbHNlLFxuICogICAgICBsZWdlbmQgOiBmYWxzZSxcbiAqICAgICAgZ3JvdXAgOiBmYWxzZSxcbiAqICAgICAgZ3JvdXBBdXRvIDogZmFsc2UsXG4gKiAgICAgIHNvcnQgOiB0cnVlLFxuICogICAgICBzb3J0QnkgOiBcImlkXCIsXG4gKiAgICAgIHNvcnRPcmRlciA6IFwiYXNjXCIsXG4gKiAgICAgIHRpdGxlIDogdHJ1ZSxcbiAqICAgICAgY29sbGFwc2UgOiB1bmRlZmluZWQsXG4gKiAgICAgIHR5cGUgOiB0cnVlLFxuICogICAgICBwaW4gOiB0cnVlLFxuICogICAgICB2aXNpYmlsaXR5IDogdHJ1ZSxcbiAqICAgICAgaWNvbiA6IHtcbiAqICAgICAgICAgIGltYWdlIDogdHJ1ZSxcbiAqICAgICAgICAgIGFuY2hvciA6IFwiZW5kXCJcbiAqICAgICAgfSxcbiAqICAgICAgZWRpdGFibGUgOiB0cnVlXG4gKiAgIH1cbiAqICAgLy8gQ29udGV4dFxuICogICBlZGl0b3Iuc2V0Q29udGV4dChcIm1hcFwiLCBtYXApO1xuICogICBlZGl0b3Iuc2V0Q29udGV4dChcImxheWVyXCIsIGxheWVyKTtcbiAqICAgLy8gY3JlYXRlIERPTVxuICogICBlZGl0b3IuY3JlYXRlRWxlbWVudCgpXG4gKiAgICAgLnRoZW4oKCkgPT4ge1xuICogICAgICAgY29uc29sZS53YXJuKGVkaXRvci5nZXRJRCgpKTtcbiAqICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ2V0Q29udGV4dChcIm1hcFwiKSk7XG4gKiAgICAgICBjb25zb2xlLmxvZyh0aGlzLmdldENvbnRleHQoXCJsYXllclwiKSk7XG4gKiAgICAgfSlcbiAqICAgICAuY2F0Y2goZXJyb3IgPT4ge30pO1xuICogICAvLyBwb3NzaWJpbGl0eSB0byBhZGQgbGlzdGVuZXJzIHdpdGggZ2xvYmFsZSB2YXJpYWJsZSA6IGV2ZW50YnVzXG4gKiAgIGV2ZW50YnVzLmFkZEV2ZW50TGlzdGVuZXIoXCJlZGl0b3I6c3R5bGU6c2NhbGU6b25jaGFuZ2VtaW5cIiwgZnVuY3Rpb24gKGUpIHsuLi59KTtcbiAqL1xuY2xhc3MgRWRpdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIltjb25zdHJ1Y3Rvcl0gRWRpdG9yXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBUT0RPIGRlZmF1bHQuLi5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRWRpdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkVSUk9SIENMQVNTX0NPTlNUUlVDVE9SXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyBnZXN0aW9uIGRlcyBvcHRpb25zXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJMYSAndGFyZ2V0JyBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUgKG9wdGlvbnMudGFyZ2V0KS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiTGUgJ3N0eWxlJyBNYXBCb3ggbidlc3QgcGFzIHJlbnNlaWduw6kgKG9wdGlvbnMuc3R5bGUpICFcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJMZXMgJ2hhbmRsZXJzJyBuZSBzb250IHBhcyByZW5zZWlnbsOpcyAob3B0aW9ucy5ldmVudHMpICFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aGVtZXMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiTGVzICd0aGVtZXMnIE1hcEJveCBuZSBzb250IHBhcyByZW5zZWlnbsOpcyAob3B0aW9ucy50aGVtZXMpLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9wdGlvbnMgcGFyIGRlZmF1dFxuICAgICAgICB2YXIgX3Rvb2xzRGVmYXVsdCA9IHtcbiAgICAgICAgICAgIHRoZW1lcyA6IGZhbHNlLFxuICAgICAgICAgICAgbGF5ZXJzIDogdHJ1ZSxcbiAgICAgICAgICAgIHNlYXJjaCA6IGZhbHNlLFxuICAgICAgICAgICAgc3R5bGUgOiBmYWxzZSxcbiAgICAgICAgICAgIGZpbHRlciA6IGZhbHNlLFxuICAgICAgICAgICAgbGVnZW5kIDogZmFsc2UsXG4gICAgICAgICAgICBncm91cCA6IGZhbHNlLFxuICAgICAgICAgICAgZ3JvdXBBdXRvIDogZmFsc2UsXG4gICAgICAgICAgICBzb3J0IDogdHJ1ZSxcbiAgICAgICAgICAgIHNvcnRCeSA6IFwiaWRcIixcbiAgICAgICAgICAgIHNvcnRPcmRlciA6IFwiYXNjXCIsXG4gICAgICAgICAgICB0aXRsZSA6IHRydWUsXG4gICAgICAgICAgICBjb2xsYXBzZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHR5cGUgOiB0cnVlLFxuICAgICAgICAgICAgcGluIDogdHJ1ZSxcbiAgICAgICAgICAgIHZpc2liaWxpdHkgOiB0cnVlLFxuICAgICAgICAgICAgaWNvbiA6IHtcbiAgICAgICAgICAgICAgICBpbWFnZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgYW5jaG9yIDogXCJlbmRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVkaXRhYmxlIDogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzKSB7XG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJVdGlsaXNhdGlvbiBkZXMgb3V0aWxzIE1hcEJveCBwYXIgZMOpZmF1dCAob3B0aW9ucy50b29scykuXCIpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xzID0gX3Rvb2xzRGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucy50b29scywgX3Rvb2xzRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIC8vIGlkIHVuaXF1ZVxuICAgICAgICB0aGlzLmlkID0gdGhpcy5vcHRpb25zLmlkIHx8IElELmdlbmVyYXRlKCk7XG5cbiAgICAgICAgLy8gY29udGV4dFxuICAgICAgICB0aGlzLmNvbnRleHQgPSB7fTtcbiAgICAgICAgLy8gcHJvcGVydHkgbGF5ZXJzXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgICAgIC8vIGRvbSBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICAvLyBkb20gbmFtZVxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94VGFyZ2V0XCIsXG4gICAgICAgICAgICBjb250YWluZXIgOiBcIkdQRWRpdG9yTWFwQm94Q29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJJRCA6IFwiR1BFZGl0b3JNYXBCb3hDb250YWluZXJfSURfXCIsXG4gICAgICAgICAgICBjb250YWluZXJMYXllcnMgOiBcIkdQRWRpdG9yTWFwQm94TGF5ZXJzQ29udGFpbmVyXCIsXG4gICAgICAgICAgICB0aXRsZUxheWVycyA6IFwiR1BFZGl0b3JNYXBCb3hMYXllcnNUaXRsZVwiLFxuICAgICAgICAgICAgdGl0bGVMYXllcnNJRCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllcnNUaXRsZV9JRF9cIixcbiAgICAgICAgICAgIHRpdGxlVGhlbWVzIDogXCJHUEVkaXRvck1hcEJveFRoZW1lc1RpdGxlXCIsXG4gICAgICAgICAgICB0aXRsZVRoZW1lc0lEIDogXCJHUEVkaXRvck1hcEJveFRoZW1lc1RpdGxlX0lEX1wiLFxuICAgICAgICAgICAgc2VwIDogXCJHUEVkaXRvck1hcEJveFNlcFwiXG4gICAgICAgIH07XG4gICAgICAgIC8vIHN0eWxlIGpzb25cbiAgICAgICAgdGhpcy5tYXBib3ggPSB7fTtcbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyBzcHJpdGVzIDpcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgdXJsIDogbnVsbCxcbiAgICAgICAgLy8gICAgIHNpemUgOiB7XG4gICAgICAgIC8vICAgICAgICAgaCA6IG51bGwsXG4gICAgICAgIC8vICAgICAgICAgdyA6IG51bGxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICBqc29uIDoge31cbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLnNwcml0ZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEluaXRpYWxpemUgZXZlbnRzIHdpdGggaGFuZGxlcnNcbiAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgKlxuICAgICogTGlzdCBFdmVudHMgOlxuICAgICogICAgICAgICAgXCJlZGl0b3I6bGF5ZXI6dmlzaWJpbGl0eVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpsYXllcjpjbG9uZVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpsYXllcjpyZW1vdmVcIlxuICAgICogICAgICAgICAgXCJlZGl0b3I6c3R5bGU6ZWRpdFwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpzdHlsZTptaW5TY2FsZVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpzdHlsZTptYXhTY2FsZVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpmaWx0ZXI6ZWRpdFwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjp0aGVtZXM6aW1hZ2VcIixcbiAgICAqICAgICAgICAgIFwiZWRpdG9yOnRoZW1lczp0aXRsZVwiXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgX2luaXRFdmVudHMgKCkge1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5vcHRpb25zLnNjb3BlIHx8IHRoaXM7XG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLm9wdGlvbnMuZXZlbnRzO1xuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50c1tldmVudF07XG4gICAgICAgICAgICAgICAgICAgIC8vIHRlc3Qgc3VyIGxlcyBldmVudHMgZGlzcG9uaWJsZXMgIVxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFdmVudEJ1cy5oYXNFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBjdHgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyYXBoaWNhbCByZW5kZXJpbmcgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hDb250YWluZXJcIiBpZD1cIkdQRWRpdG9yTWFwQm94Q29udGFpbmVyX0lEXzBcIj5cbiAgICAgKiAgICA8ZGl2IGlkPVwiR1BFZGl0b3JNYXBCb3hUaGVtZXNUaXRsZVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZXNUaXRsZVwiPkxpc3RlIGRlcyAndGjDqG1lcyc8L2Rpdj5cbiAgICAgKiAgICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZXNDb250YWluZXJcIj5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgIDwvZGl2PlxuICAgICAqICAgIDxkaXYgaWQ9XCJHUEVkaXRvck1hcEJveExheWVyc1RpdGxlXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyc1RpdGxlXCI+TGlzdGUgZGVzICdjb3VjaGVzJzwvZGl2PlxuICAgICAqICAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyc0NvbnRhaW5lclwiPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJDb250YWluZXJcIj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGlkPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlQ29udGFpbmVyLTBfMVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlQ29udGFpbmVyXCI+XG4gICAgICogICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUxhYmVsXCI+PC9sYWJlbD5cbiAgICAgKiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlSW5wdXQtMF8xXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVJbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiPlxuICAgICAqICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVMYWJlbFwiIGZvcj1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUlucHV0LTBfMVwiIHRpdGxlPVwic3RhdGVzXCI+cG9wdWxhdGlvbl9sdF8ybTwvbGFiZWw+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyQ29udGFpbmVyXCI+Li4uPC9kaXY+XG4gICAgICogICAgICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMYXllckNvbnRhaW5lclwiPi4uLjwvZGl2PlxuICAgICAqICAgIDwvZGl2PlxuICAgICAqICA8L2Rpdj5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pbml0Q29udGFpbmVyICgpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKHRoaXMubWFwYm94KTtcblxuICAgICAgICAvLyBleGlzdGFuY2UgZCd1biBhdXRyZSBjb250YWluZXIgKGVkaXRldXIpID9cbiAgICAgICAgLy8gdmFyIF9pZHggPSAwO1xuICAgICAgICAvLyB2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiZGl2W2lkXj1cIiArIHRoaXMubmFtZS5jb250YWluZXJJRCArIFwiXVwiKTtcbiAgICAgICAgLy8gZm9yICh2YXIgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAvLyAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tqXTtcbiAgICAgICAgLy8gICAgIHZhciBudW0gPSBwYXJzZUludChlbGVtZW50LmlkLnN1YnN0cmluZyhlbGVtZW50LmlkLmxhc3RJbmRleE9mKFwiX1wiKSArIDEpLCAxMCk7XG4gICAgICAgIC8vICAgICBpZiAobnVtID4gX2lkeCkge1xuICAgICAgICAvLyAgICAgICAgIF9pZHggPSBudW07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAvLyAgICAgX2lkeCArPSAxO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnRhaW5lciBwcmluY2lwYWwgZGUgbCdlZGl0ZXVyXG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUuY29udGFpbmVySUQgKyB0aGlzLmlkO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICAvLyBUaGVtZXNcbiAgICAgICAgdmFyIF90b29sc1RoZW1lcyA9IHRoaXMub3B0aW9ucy50b29scy50aGVtZXM7XG4gICAgICAgIGlmIChfdG9vbHNUaGVtZXMgJiYgdGhpcy5vcHRpb25zLnRoZW1lcykge1xuICAgICAgICAgICAgLy8gdGl0bGVcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMudGl0bGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGl0bGVUaGVtZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIHRpdGxlVGhlbWVzLmlkID0gdGhpcy5uYW1lLnRpdGxlVGhlbWVzSUQgKyB0aGlzLmlkO1xuICAgICAgICAgICAgICAgIHRpdGxlVGhlbWVzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS50aXRsZVRoZW1lcztcbiAgICAgICAgICAgICAgICB0aXRsZVRoZW1lcy5pbm5lckhUTUwgPSBcIkxpc3RlIGRlcyAndGjDqG1lcydcIjtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGl0bGVUaGVtZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsaWVuIHZlcnMgbGVzIHN0eWxlc1xuICAgICAgICAgICAgdmFyIHRoZW1lcyA9IG5ldyBUaGVtZXMoe1xuICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB0YXJnZXQgOiBkaXYsXG4gICAgICAgICAgICAgICAgdG9vbHMgOiAodHlwZW9mIF90b29sc1RoZW1lcyA9PT0gXCJvYmplY3RcIikgPyBfdG9vbHNUaGVtZXMgOiB7fSxcbiAgICAgICAgICAgICAgICBvYmogOiB0aGlzLm9wdGlvbnMudGhlbWVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoZW1lcy5hZGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8gOiBSZWNoZWNoZSAvIGZpbHRyZSBkZSBjb3VjaGVzXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuc2VhcmNoKSB7XG4gICAgICAgICAgICB2YXIgc2VhcmNoID0gbmV3IFNlYXJjaCh7XG4gICAgICAgICAgICAgICAgaWQgOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHRhcmdldCA6IGRpdixcbiAgICAgICAgICAgICAgICB0b29scyA6IHt9LFxuICAgICAgICAgICAgICAgIG9iaiA6IHRoaXMubWFwYm94LmxheWVycyAvLyBsaXN0ZSBkZXMgb2JqZXRzIGxheWVyc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWFyY2guYWRkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBzb3VyY2UgaW4gdGhpcy5tYXBib3guc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFwYm94LnNvdXJjZXMuaGFzT3duUHJvcGVydHkoc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG11bHRpc291cmNlcyA/IFNpIG91aSwgb24gcmVuc2VpZ25lIHVuIHRpdHJlLi4uXG4gICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXNvdXJjZXMgPSAoT2JqZWN0LmtleXModGhpcy5tYXBib3guc291cmNlcykubGVuZ3RoID4gMSkgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImhyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaHIuY2xhc3NOYW1lID0gdGhpcy5uYW1lLnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChocik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlTGF5ZXJzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlTGF5ZXJzLmlkID0gdGhpcy5uYW1lLnRpdGxlTGF5ZXJzSUQgKyB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVMYXllcnMuY2xhc3NOYW1lID0gdGhpcy5uYW1lLnRpdGxlTGF5ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVMYXllcnMuaW5uZXJIVE1MID0gKG11bHRpc291cmNlcykgPyBcIkxpc3RlIGRlcyAnY291Y2hlcycgKFwiICsgc291cmNlICsgXCIpXCIgOiBcIkxpc3RlIGRlcyAnY291Y2hlcydcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0aXRsZUxheWVycyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlIGwnb3JkcmUgYXZhbnQgdHJpIGF2ZWMgbGEgbWV0YWRhdGEgJ29yZGVyJ1xuICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJzID0gdGhpcy5tYXBib3gubGF5ZXJzLnNsaWNlKCk7IC8vIGNsb25lXG5cbiAgICAgICAgICAgICAgICAvLyB1bmUgZm9pcyBsZXMgbGF5ZXJzIHRyacOpcywgbGEgbWV0YWRhdGE6Z2VvcG9ydGFpbDpvcmRlciBwZXJtZXRcbiAgICAgICAgICAgICAgICAvLyBkZSBzYXZvaXIgbCdlbXBsYWNlbWVudCBkdSBsYXllcnMgZGFucyBsZSBmaWNoaWVyIGRlIHN0eWxlLlxuICAgICAgICAgICAgICAgIF9sYXllcnMuZm9yRWFjaChmdW5jdGlvbiAobGF5ZXIsIG9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIMOpY2FydGUgbGVzIGxheWVycyBzYW5zIHNvdXJjZTogZXguIFwiYmFja2dyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gYWpvdXQgZGUgbGEgbWV0YWRhdGEgZCdvcmRyZVxuICAgICAgICAgICAgICAgICAgICB2YXIgX21ldGFkYXRhID0gbGF5ZXJbXCJtZXRhZGF0YVwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX21ldGFkYXRhW1wiZ2VvcG9ydGFpbDpvcmRlclwiXSA9IG9yZGVyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJbXCJtZXRhZGF0YVwiXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlb3BvcnRhaWw6b3JkZXJcIiA6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gdHJpIGRlcyBsYXllcnNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnRCeSA9IHRoaXMub3B0aW9ucy50b29scy5zb3J0Qnk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0T3JkZXIgPSB0aGlzLm9wdGlvbnMudG9vbHMuc29ydE9yZGVyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydEZjdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBvbiB1dGlsaXNlIGxlcyBncm91cGVtZW50cyB1dGlsaXNhdGV1cnMsIGlscyBkb2l2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3VzIMOqdHJlIHJlbnNlaWduw6lzIHNpbm9uLi4uLCDDp2EgdmEgY29pbmNlciAhXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhW1wibWV0YWRhdGFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1wibWV0YWRhdGFcIl1bXCJnZW9wb3J0YWlsOmdyb3VwXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYltcIm1ldGFkYXRhXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYltcIm1ldGFkYXRhXCJdW1wiZ2VvcG9ydGFpbDpncm91cFwiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbXBBID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY21wQiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wQSA9IGFbXCJtZXRhZGF0YVwiXVtcImdlb3BvcnRhaWw6Z3JvdXBcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wQiA9IGJbXCJtZXRhZGF0YVwiXVtcImdlb3BvcnRhaWw6Z3JvdXBcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY21wQS5sb2NhbGVDb21wYXJlKGNtcEIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZ2VvbVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc29ydE9yZGVyID09PSBcImFzY1wiID8gYS50eXBlLmxvY2FsZUNvbXBhcmUoYi50eXBlKSB8fCBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIudHlwZS5sb2NhbGVDb21wYXJlKGEudHlwZSkgfHwgYi5pZC5sb2NhbGVDb21wYXJlKGEuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjbGFzc1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc29ydE9yZGVyID09PSBcImFzY1wiID8gYVtcInNvdXJjZS1sYXllclwiXS5sb2NhbGVDb21wYXJlKGJbXCJzb3VyY2UtbGF5ZXJcIl0pIHx8IGEuaWQubG9jYWxlQ29tcGFyZShiLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYltcInNvdXJjZS1sYXllclwiXS5sb2NhbGVDb21wYXJlKGFbXCJzb3VyY2UtbGF5ZXJcIl0pIHx8IGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaSBzdXIgbCdpZCBwYXIgZGVmYXV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3J0T3JkZXIgPT09IFwiYXNjXCIgPyBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkgOiBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIF9sYXllcnMuc29ydChzb3J0RmN0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJMYXllcnMgOiBcIiwgX2xheWVycyk7XG5cbiAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlcyBncm91cGVzIGF2ZWMgbGEgbWV0YWRhdGEgZGUgZ3JvdXBlXG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwQnkgPSB0aGlzLm9wdGlvbnMudG9vbHMuc29ydEJ5OyAvLyBsZSBtw6ptZSB0eXBlIGRlIHRyaSBxdWUgbGVzIGNvdWNoZXMgIVxuICAgICAgICAgICAgICAgIHZhciBncm91cEF1dG8gPSB0aGlzLm9wdGlvbnMudG9vbHMuZ3JvdXBBdXRvO1xuICAgICAgICAgICAgICAgIHZhciBfZ3JvdXBzID0ge307IC8vIGxpc3RlIGV0IGNvbXB0YWdlIGRlcyBsYXllcnMgZGFucyBjaGFxdWUgZ3JvdXBlc1xuICAgICAgICAgICAgICAgIF9sYXllcnMuZm9yRWFjaChmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gw6ljYXJ0ZSBsZXMgbGF5ZXJzIHNhbnMgc291cmNlOiBleC4gXCJiYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBiYWxpc2UgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9tZXRhZGF0YSA9IGxheWVyW1wibWV0YWRhdGFcIl07XG4gICAgICAgICAgICAgICAgICAgIC8vIHMnaWwgZXhpc3RlIGTDqWrDoCB1bmUgbWV0YSBkZSBncm91cGUsIG9uIGwndXRpbGlzZS4uLlxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5vbiwgb24gbGEgbWV0IGVuIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoX21ldGFkYXRhICYmIF9tZXRhZGF0YVtcImdlb3BvcnRhaWw6Z3JvdXBcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZ3JvdXBOYW1lID0gX21ldGFkYXRhW1wiZ2VvcG9ydGFpbDpncm91cFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9ncm91cHNbX2dyb3VwTmFtZV0gPSAoX2dyb3Vwc1tfZ3JvdXBOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9ncm91cHNbX2dyb3VwTmFtZV0gKyAxIDogMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZmllbGQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChncm91cEJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9maWVsZCA9IGxheWVyW1wic291cmNlLWxheWVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZ2VvbVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmllbGQgPSBsYXllci50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmllbGQgPSBsYXllci5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX25ld0dyb3VwTmFtZSA9IF9maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cEF1dG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZXVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWdleCA9IC9ffC18Onw9LzsgLy8gVE9ETyDDoCBkZWZpbmlyIHZpYSB1bmUgb3B0aW9uICFcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9pZHggPSBfZmllbGQuc2VhcmNoKF9yZWdleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geSdhIHQgaWwgdW4gc2VwYXJhdGV1ciA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX25ld0dyb3VwTmFtZSA9IChfaWR4ICE9PSAtMSkgPyBfZmllbGQuc3Vic3RyaW5nKDAsIF9pZHgpLnRyaW0oKSA6IF9maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbXB0ZSBsZSBub21icmUgZCdlbnRyw6llIGRhbnMgdW4gZ3JvdXBlXG4gICAgICAgICAgICAgICAgICAgICAgICBfZ3JvdXBzW19uZXdHcm91cE5hbWVdID0gKF9ncm91cHNbX25ld0dyb3VwTmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfZ3JvdXBzW19uZXdHcm91cE5hbWVdICsgMSA6IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFqb3V0IGRlIGxhIG1ldGFkYXRhIGRlIGdyb3VwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXRhZGF0YVtcImdlb3BvcnRhaWw6Z3JvdXBcIl0gPSBfbmV3R3JvdXBOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcltcIm1ldGFkYXRhXCJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlb3BvcnRhaWw6Z3JvdXBcIiA6IF9uZXdHcm91cE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJHcm91cHMgOiBcIiwgX2dyb3Vwcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgcHJpbmNpcGFsIGRlcyBjb3VjaGVzXG4gICAgICAgICAgICAgICAgdmFyIGRpdkxheWVycyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgZGl2TGF5ZXJzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJMYXllcnM7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRpdkxheWVycyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGV0YWlscztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmNvbGxhcHNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkZXRhaWxzXCIpO1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHMub3BlbiA9ICF0aGlzLm9wdGlvbnMudG9vbHMuY29sbGFwc2U7XG4gICAgICAgICAgICAgICAgICAgIGRpdkxheWVycy5hcHBlbmRDaGlsZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdW1tYXJ5XCIpO1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmRDaGlsZChzdW1tYXJ5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgY291cmFudCAoY2YuIGdyb3VwZSkgcG91ciBsJ2Fqb3V0IGRlcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSAodGhpcy5vcHRpb25zLnRvb2xzLmNvbGxhcHNlICE9PSB1bmRlZmluZWQpID8gZGV0YWlscyA6IGRpdkxheWVycztcblxuICAgICAgICAgICAgICAgIC8vIEV4LiBMYXllcnMsIFN0eWxlcywgR3JvdXBzIGV0IEZpbHRyZXNcbiAgICAgICAgICAgICAgICAvLyAgXCJpZFwiOiBcIm9jcyAtIHZlZ2V0YXRpb25cIixcbiAgICAgICAgICAgICAgICAvLyAgXCJ0eXBlXCI6IFwiZmlsbFwiLFxuICAgICAgICAgICAgICAgIC8vICBcInNvdXJjZVwiOiBcInB5cmFtaWRlX3Byb3RvXCIsXG4gICAgICAgICAgICAgICAgLy8gIFwic291cmNlLWxheWVyXCI6IFwib2NzX3ZlZ2V0YXRpb25fc3VyZlwiLFxuICAgICAgICAgICAgICAgIC8vICBcIm1ldGFkYXRhXCIgOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICBcImdlb3BvcnRhaWw6Z3JvdXBcIjogXCJvY3NcIlxuICAgICAgICAgICAgICAgIC8vICB9LFxuICAgICAgICAgICAgICAgIC8vICBcImxheW91dFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgXCJ2aXNpYmlsaXR5XCI6IFwidmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgICAgICAgICAgLy8gIFwiZmlsdGVyXCI6IFtcImluXCIsXCJzeW1ib1wiLFxuICAgICAgICAgICAgICAgIC8vICAgICAgXCJTVVJGQUNFX0RfRUFVXCIsXG4gICAgICAgICAgICAgICAgLy8gICAgICBcIkJBU1NJTlwiLFxuICAgICAgICAgICAgICAgIC8vICAgICAgXCJaT05FX01BUklORVwiXG4gICAgICAgICAgICAgICAgLy8gIF0sXG4gICAgICAgICAgICAgICAgLy8gIFwicGFpbnRcIjoge1xuICAgICAgICAgICAgICAgIC8vICAgIFwiZmlsbC1jb2xvclwiOiBcIiMyQkIzRTFcIlxuICAgICAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IF9sYXllcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX2xheWVyc1tpaV07XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdHJhaXRlbWVudCBkYW5zIGwnb3JkcmUgZGVzIHNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc291cmNlID09PSBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU5GTyBsYSBnZXN0aW9uIGRlcyBncm91cGVzIGVzdCBiYXPDqWUgc3VyIGxhIGJhbGlzZSBtZXRhZGF0YTo6Z2VvcG9ydGFpbDpncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWluc2kgcXVlIHN1ciBsJ29yZHJlIGRlcyBjb3VjaGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWwgbid5IGEgcGFzIGRlIHJlZ3JvdXBlbWVudCBzYW5zIHRyaSBkZXMgY291Y2hlcyAhXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmdyb3VwICYmIHRoaXMub3B0aW9ucy50b29scy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG10ZCA9IGRhdGEubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRpb24gZHUgY29udGFpbmVyIGRlIGdyb3VwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGxlIHRhZyBtZXRhZGF0YSBleGlzdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncnAgPSBkYXRhLm1ldGFkYXRhW1wiZ2VvcG9ydGFpbDpncm91cFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdycCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGUgZ3JvdXBlIGRvaXQgY29udGVuaXIgcGx1cyBkJ3VuIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZ3JvdXBzW2dycF0gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGUgZ3JvdXBlIGVzdCBkw6lqw6AgY3LDqcOpLCBvbiBlbiB2ZXV0IHBsdXMgcGFyIGxhIHN1aXRlLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dyb3Vwc1tncnBdID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRpb24gZHUgZ3JvdXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9Hcm91cCA9IG5ldyBHcm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IDogKHRoaXMub3B0aW9ucy50b29scy5jb2xsYXBzZSAhPT0gdW5kZWZpbmVkKSA/IGRldGFpbHMgOiBkaXZMYXllcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIDogZ3JwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvR3JvdXAuYWRkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGUgbm91dmVhdSBjb250YWluZXIgcG91ciBsZXMgZWxlbWVudHMgc3VpdmFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBvR3JvdXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9ncm91cHNbZ3JwXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGwnZWxlbWVudCBlc3Qgc2V1bCwgZG9uYyBwYXMgZCdham91dCBkYW5zIGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXBlIGVuIGNvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRoaXMub3B0aW9ucy50b29scy5jb2xsYXBzZSAhPT0gdW5kZWZpbmVkKSA/IGRldGFpbHMgOiBkaXZMYXllcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGFqb3V0ZSBsJ2VsZW1lbnQgZGFucyBsZSBncm91cGUgY291cmFudC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRoaXMub3B0aW9ucy50b29scy5jb2xsYXBzZSAhPT0gdW5kZWZpbmVkKSA/IGRldGFpbHMgOiBkaXZMYXllcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAodGhpcy5vcHRpb25zLnRvb2xzLmNvbGxhcHNlICE9PSB1bmRlZmluZWQpID8gZGV0YWlscyA6IGRpdkxheWVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXllcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9MYXllciA9IG5ldyBMYXllcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA6IGluZGV4ICsgXCJfXCIgKyB0aGlzLmlkLCAvLyB1bmlxdWUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29scyA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHkgOiB0aGlzLm9wdGlvbnMudG9vbHMudmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24gOiB0aGlzLm9wdGlvbnMudG9vbHMuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiB0aGlzLm9wdGlvbnMudG9vbHMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbiA6IHRoaXMub3B0aW9ucy50b29scy5waW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBkYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGRhdGEuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzb3VyY2UtbGF5ZXJcIiA6IGRhdGFbXCJzb3VyY2UtbGF5ZXJcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci5hZGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmlzaWJpbGl0eSBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxheW91dCAmJiBkYXRhLmxheW91dC52aXNpYmlsaXR5ICYmIGRhdGEubGF5b3V0LnZpc2liaWxpdHkgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci52aXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F1dmVnYXJkZSBkZXMgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvTGF5ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnZW5kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5sZWdlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlIGwnZWRpdGlvbiBkZSBsYSBsZWdlbmRlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsJ29wdGlvbiBcImVkaXRhYmxlXCIgZXN0IHByaW9yaXRhaXJlIHN1ciBsZSB0YWcgXCJlZGl0YWJsZVwiIGR1IGZpY2hpZXIgZGUgc3R5bGUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0VkaXRhYmxlID0gdGhpcy5vcHRpb25zLnRvb2xzLmVkaXRhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXNFZGl0YWJsZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VkaXRhYmxlID0gZGF0YS5lZGl0YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9MZWdlbmQgPSBuZXcgTGVnZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgOiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZXMgOiB0aGlzLnNwcml0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGRhdGEuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiBkYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGUgOiAodHlwZW9mIGlzRWRpdGFibGUgIT09IFwidW5kZWZpbmVkXCIpID8gaXNFZGl0YWJsZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQgOiBkYXRhLnBhaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0IDogZGF0YS5sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MZWdlbmQuYWRkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xlZ2VuZC5kaXNwbGF5KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob0xheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci5hZGRMZWdlbmQob0xlZ2VuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci5zbG90TGVnZW5kKCk7IC8vIGludGVncmF0aW9uIGRlIGxhIGxlZ2VuZGUgZGFucyBsZSBjb250YWluZXIgZHUgbGF5ZXJzICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5zdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvU3R5bGUgPSBuZXcgU3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA6IHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gOiBpbmRleCArIFwiX1wiICsgdGhpcy5pZCwgLy8gdW5pcXVlICEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGRhdGEuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0IDogZGF0YS5sYXlvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCA6IGRhdGEucGFpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9TdHlsZS5hZGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvU3R5bGUuZGlzcGxheShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9MYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGF5ZXIuYWRkU3R5bGUob1N0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHZpc2liaWxpdHkgbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sYXlvdXQgJiYgZGF0YS5sYXlvdXQudmlzaWJpbGl0eSAmJiBkYXRhLmxheW91dC52aXNpYmlsaXR5ID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGF5ZXIudmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvRmlsdGVyID0gbmV3IEZpbHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA6IGluZGV4ICsgXCJfXCIgKyB0aGlzLmlkLCAvLyB1bmlxdWUgISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBkYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIDogZGF0YS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgOiBkYXRhLkZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb0ZpbHRlci5hZGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRmlsdGVyLmRpc3BsYXkoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xheWVyLmFkZEZpbHRlcihvRmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBlY2FydGUgdW4gbGF5ZXIgY2FyIGlsIG4nZXN0IHBhcyByZWNvbm51IGRhbnMgbGEgc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBkZWNyZW1lbnRlIGxhIHBvc2l0aW9uIGR1IGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXV2ZWdhcmRlXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gZGl2O1xuXG4gICAgICAgIC8vIGNvbnRhaW5lciBwcmluY2lwYWxcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF90YXJnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIF90YXJnZXQuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChfdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50XG4gICAgICAgIEV2ZW50QnVzLmRpc3BhdGNoKEV2ZW50Lm9ubG9hZGVkLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXR0aW5nIFNwcml0ZXMgaW5mb3JtYXRpb25zXG4gICAgICogKGNhbGxlZCBieSBfaW5pdGlhbGl6ZSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcHJpdGVzIC0gdXJsIGRlcyBzcHJpdGVzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gcHJvbWlzZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldFNwcml0ZXMgKHNwcml0ZXMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIC8vIG9uIG5lIGRvaXQgcGFzIG1ldHRyZSBkZSBwcm9taXNlIGVuIMOpY2hlYy4uLlxuICAgICAgICAvLyBjYXIgb24gc291aGFpdGUgY29udGludWVyIGxlIHRyYWl0ZW1lbnQgbcOqbWUgc2kgb24gbidhIHBhcyBkZSBzcHJpdGVzICFcbiAgICAgICAgLy8gc2kgbGUgcHJvdG9jb2xlIGVzdCBtYXBib3g6Ly9cbiAgICAgICAgaWYgKHNwcml0ZXMgJiYgc3ByaXRlcy5zdGFydHNXaXRoKFwibWFwYm94Oi8vXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIlByb3RvY29sZSBtYXBib3g6Ly8gbm9uIGfDqXLDqSAhXCIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzaSBwYXMgZGUgc3ByaXRlc1xuICAgICAgICBpZiAoIXNwcml0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQXVuY3VuIHNwcml0ZXMgZGlzcG9uaWJsZXMgIVwiKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmV0Y2hTcHJpdGVzSW1hZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3ByaXRlc0ltYWdlID0gc3ByaXRlcyArIFwiLnBuZ1wiO1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoKHNwcml0ZXNJbWFnZSwge1xuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIDogXCJzYW1lLW9yaWdpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNwcml0ZXMudXJsID0gc3ByaXRlc0ltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNvZGUgZGUgbCdpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhlSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSW1hZ2Uuc3JjID0gc3ByaXRlc0ltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlSW1hZ2UuZGVjb2RlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNwcml0ZXMuc2l6ZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ByaXRlcy5zaXplLmggPSB0aGVJbWFnZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcHJpdGVzLnNpemUudyA9IHRoZUltYWdlLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcImZldGNoIGltYWdlIHNwcml0ZXMgZXhjZXB0aW9uIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIkhUVFAgc3RhdHVzIGNvZGU6IFwiICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImZldGNoIGltYWdlIHNwcml0ZXMgZXhjZXB0aW9uIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmZXRjaFNwcml0ZXNKc29uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNwcml0ZXNKc29uID0gc3ByaXRlcyArIFwiLmpzb25cIjtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaChzcHJpdGVzSnNvbiwge1xuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIDogXCJzYW1lLW9yaWdpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNwcml0ZXMuanNvbiA9IGpzb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcImZldGNoIGpzb24gc3ByaXRlcyBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiSFRUUCBzdGF0dXMgY29kZTogXCIgKyByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiZmV0Y2gganNvbiBzcHJpdGVzIGV4Y2VwdGlvbiA6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHByb21pc2VcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGZldGNoU3ByaXRlc0ltYWdlKCksXG4gICAgICAgICAgICBmZXRjaFNwcml0ZXNKc29uKClcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOVEVSRkFDRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEVkaXRvclxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gcHJvbWlzZVxuICAgICAqL1xuICAgIGNyZWF0ZUVsZW1lbnQgKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIG9iamV0IGpzb25cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMubWFwYm94ID0gdGhpcy5vcHRpb25zLnN0eWxlO1xuICAgICAgICAgICAgLy8gbGVzIHNwcml0ZXMgc29udCB1dGlsZXMgcXVlIHNpIG9uIHZldXQgdW5lIGxlZ2VuZGUgIVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5sZWdlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3ByaXRlcyh0aGlzLm1hcGJveC5zcHJpdGUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXQgZHUgRE9NXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiZmV0Y2ggc3ByaXRlcyBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cmxcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc3R5bGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaCh0aGlzLm9wdGlvbnMuc3R5bGUsIHtcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFscyA6IFwic2FtZS1vcmlnaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNhdXZlZ2FyZGUgZHUganNvblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBib3ggPSBzdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVzIHNwcml0ZXMgc29udCB1dGlsZXMgcXVlIHNpIG9uIHZldXQgdW5lIGxlZ2VuZGUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudG9vbHMubGVnZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRTcHJpdGVzKHNlbGYubWFwYm94LnNwcml0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0IGR1IERPTVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiZmV0Y2ggc3ByaXRlcyBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5pdENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwianNvbiBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImZldGNoIGV4Y2VwdGlvbiA6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkaXNwbGF5IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkpID8gXCJibG9ja1wiIDogXCJub25lXCI7XG4gICAgfVxuXG4gICAgc2V0Q29udGV4dCAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmNvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldENvbnRleHQgKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogR2V0IGlkIGVkaXRvclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IGlkXG4gICAgICovXG4gICAgZ2V0SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIChET00pXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBTdHlsZSAoanNvbilcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdHlsZSBNYXBCb3hcbiAgICAgKi9cbiAgICBnZXRTdHlsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcGJveDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbGF5ZXIgc3R5bGUgKGpzb24pXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFN0eWxlIE1hcEJveCBvZiBhIGxheWVyc1xuICAgICAqL1xuICAgIGdldFN0eWxlTGF5ZXIgKGkpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbnVsbDtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmdldExheWVyKGkpO1xuICAgICAgICB2YXIgaWQgPSBvLm9wdGlvbnMub2JqLmlkO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubWFwYm94LmxheWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdmFyIGwgPSB0aGlzLm1hcGJveC5sYXllcnNba107XG4gICAgICAgICAgICBpZiAobC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBsYXllciA9IGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsYXllciBvYmplY3QgZnJvbSBqc29uIHN0eWxlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBpbmRleCBpbnRvIHN0eWxlIGpzb25cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdHlsZSBNYXBCb3ggb2YgYSBsYXllcnNcbiAgICAgKi9cbiAgICBnZXRMYXllckZyb21TdHlsZSAoaSkge1xuICAgICAgICB2YXIgbGF5ZXIgPSBudWxsO1xuICAgICAgICB2YXIgbCA9IHRoaXMubWFwYm94LmxheWVyc1tpXTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmdldExheWVycygpLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHRoaXMuZ2V0TGF5ZXIoayk7XG4gICAgICAgICAgICBpZiAobC5pZCA9PT0gby5vcHRpb25zLm9iai5pZCkge1xuICAgICAgICAgICAgICAgIGxheWVyID0gbztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGlzdCBvZiBsYXllciBvYmplY3Qgc29ydGVkIG9yIG5vdCAoc2VlIG9wdGlvbnMudG9vbHMuc29ydClcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gTGlzdCBvZiBsYXllciBvYmplY3RcbiAgICAgKiBAc2VlIHtvbC5zdHlsZS5lZGl0b3IuTGF5ZXJ9XG4gICAgICovXG4gICAgZ2V0TGF5ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGF5ZXIgb2JqZWN0IGZyb20gYSBsaXN0IHNvcnRlZCBvciBub3QgKHNlZSBvcHRpb25zLnRvb2xzLnNvcnQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IC0gbGF5ZXIgb2JqZWN0XG4gICAgICogQHNlZSB7b2wuc3R5bGUuZWRpdG9yLkxheWVyfVxuICAgICAqL1xuICAgIGdldExheWVyIChpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyc1tpXTtcbiAgICB9XG5cbn07XG5cbi8vIG9uIHLDqWN1cMOocmUgbGVzIG3DqXRob2RlcyBkZSBsYSBjbGFzc2UgRE9NXG5VdGlscy5hc3NpZ24oRWRpdG9yLnByb3RvdHlwZSwgRWRpdG9yRE9NKTtcblxuLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIHRvIGRvbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG5leHBvcnQgZGVmYXVsdCBFZGl0b3I7XG5cbi8vIEV4cG9zZSBFZGl0b3IgYXMgb2wuZWRpdG9yLlZpZXcgKGZvciBhIGJ1aWxkIGJ1bmRsZSlcbmlmICh3aW5kb3cub2wgJiYgd2luZG93Lm9sLnN0eWxlKSB7XG4gICAgd2luZG93Lm9sLnN0eWxlLkVkaXRvciA9IEVkaXRvcjtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS_Controls_Editor_GPeditorOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CSS/Controls/Editor/GPeditorOpenLayers.css */ \"./src/OpenLayers/CSS/Controls/Editor/GPeditorOpenLayers.css\");\n/* harmony import */ var _CSS_Controls_Editor_GPeditorOpenLayers_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_Editor_GPeditorOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Editor_Style__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Editor/Style */ \"./src/OpenLayers/Controls/Editor/Style.js\");\n/* harmony import */ var _Editor_Themes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Editor/Themes */ \"./src/OpenLayers/Controls/Editor/Themes.js\");\n/* harmony import */ var _Editor_Filter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Editor/Filter */ \"./src/OpenLayers/Controls/Editor/Filter.js\");\n/* harmony import */ var _Editor_Legend__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Editor/Legend */ \"./src/OpenLayers/Controls/Editor/Legend.js\");\n/* harmony import */ var _Editor_Layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Editor/Layer */ \"./src/OpenLayers/Controls/Editor/Layer.js\");\n/* harmony import */ var _Editor_Group__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Editor/Group */ \"./src/OpenLayers/Controls/Editor/Group.js\");\n/* harmony import */ var _Editor_Event__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Editor/Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Editor_Search__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Editor/Search */ \"./src/OpenLayers/Controls/Editor/Search.js\");\n/* harmony import */ var _Common_Controls_Editor_EditorDOM__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Common/Controls/Editor/EditorDOM */ \"./src/Common/Controls/Editor/EditorDOM.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n// import CSS\n\n// import library\n\n// import local\n\n\n\n\n\n\n\n\n\n\n\n\n// DOM\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLogger(\"editor\");\n\n/**\n * @classdesc\n *\n * Editor Styles MapBox...\n *\n * @constructor\n * @alias ol.style.Editor\n * @param {Object} options - options for function call.\n * @fires editor:layer:onclickvisibility\n * @fires editor:layer:onclickclone\n * @fires editor:layer:onclickremove\n * @fires editor:style:oneditjson\n * @fires editor:style:scale:onchangemin\n * @fires editor:style:scale:onchangemax\n * @fires editor:legend:onclickedition\n * @fires editor:legend:onchangevalue\n * @fires editor:filter:oneditjson\n * @fires editor:themes:onclickimage\n * @fires editor:themes:onclicktitle\n * @fires editor:group:oncollapse\n * @fires editor:onloaded\n * @example\n * var editor = new Editor ({\n * target : \"\",\n * style : \"data/styles/layer.json\",\n * themes: {\n * themesSummary : \"\",\n * themes : [{\n * \"thumbnail\": \"data/images/layer0.png\",\n * \"name\": \"standard0\",\n * \"url\": \"data/styles/layer0.json\",\n * \"description\": \"\",\n * \"selected\" : true\n * },{\n * \"thumbnail\": \"data/images/layer1.png\",\n * \"name\": \"standard1\",\n * \"url\": \"data/styles/layer1.json\",\n * \"description\": \"\"\n * }]\n * },\n * scope : this,\n * events : {\n * \"editor:layer:onclickvisibility\" : ...,\n * \"editor:layer:onclickclone\" : ...,\n * \"editor:layer:onclickremove\" : ...,\n * \"editor:style:oneditjson\" : ...,\n * \"editor:style:scale:onchangemin\" : ...,\n * \"editor:style:scale:onchangemax\" : ...,\n * \"editor:filter:oneditjson\" : ...,\n * \"editor:themes:onclickimage\" : this._onClickEventImageTheme(),\n * \"editor:themes:onclicktitle\" : function(e) {...}\n * },\n * tools : {\n * // afficher/cacher les themes (par defaut) ou utiliser les options\n * themes : true | false | {\n * target : \"...\",\n * tools : {\n * \"thumbnails\": true,\n * \"button\": { visible : true, type : \"checkbox\" }\n * },\n * },\n * layers : true | false, // afficher les couches (layers)\n * search : true | false, // TODO : afficher l'outil de recheche de couches\n * style : true | false, // afficher les styles (sous menu layers)\n * filter : true | false, // afficher les filtres (sous menu layers)\n * legend : true | false, // afficher les legendes (layers)\n * group : true | false, // grouper les couches, l'option 'sort' doit être activée (layers)\n * groupAuto : true | false, // definir la construction automatiques des groupes\n * sort : true | false, // trier les couches (layers)\n * sortBy : \"id|class|geom\", // definir le type de tri (layers)\n * sortOrder : \"asc, desc\", // definir l'ordre de tri (layers)\n * title : true | false // afficher les titres des rubriques,\n * collapse : true | false | undefined // afficher et/ou plier les couches ou ne pas afficher l'option,\n * type : true | false, // afficher le type de geometrie (layers)\n * pin : true | false, // afficher la puce pour chaque couche (layers)\n * visibility : true | false, // afficher l'icone de visibilité (layers),\n * icon : { // afficher l'icone \"oeil\" ou \"checkbox\" (layers),\n * \"image\" : true,\n * \"anchor\" : \"start\" // afficher l'icone au debut ou à la fin de la ligne\n * },\n * editable : true | false // active l'edition de la legende (legendes)\n * }\n * });\n * // options par defaut\n * {\n * themes : false,\n * layers : true,\n * search : false,\n * style : false,\n * filter : false,\n * legend : false,\n * group : false,\n * groupAuto : false,\n * sort : true,\n * sortBy : \"id\",\n * sortOrder : \"asc\",\n * title : true,\n * collapse : undefined,\n * type : true,\n * pin : true,\n * visibility : true,\n * icon : {\n * image : true,\n * anchor : \"end\"\n * },\n * editable : true\n * }\n * // Context\n * editor.setContext(\"map\", map);\n * editor.setContext(\"layer\", layer);\n * // create DOM\n * editor.createElement()\n * .then(() => {\n * console.warn(editor.getID());\n * console.log(this.getContext(\"map\"));\n * console.log(this.getContext(\"layer\"));\n * })\n * .catch(error => {});\n * // possibility to add listeners with globale variable : eventbus\n * eventbus.addEventListener(\"editor:style:scale:onchangemin\", function (e) {...});\n */\nvar Editor = /*#__PURE__*/function () {\n function Editor(options) {\n _classCallCheck(this, Editor);\n logger.trace(\"[constructor] Editor\", options);\n\n // options\n this.options = options || {\n // TODO default...\n };\n if (!(this instanceof Editor)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Editor, [{\n key: \"_initialize\",\n value: function _initialize() {\n // gestion des options\n if (!this.options.target) {\n logger.info(\"La 'target' n'est pas renseignée (options.target).\");\n }\n if (!this.options.style) {\n logger.error(\"Le 'style' MapBox n'est pas renseigné (options.style) !\");\n return;\n }\n if (this.options.events) {\n this._initEvents();\n } else {\n logger.warn(\"Les 'handlers' ne sont pas renseignés (options.events) !\");\n }\n if (!this.options.themes) {\n logger.info(\"Les 'themes' MapBox ne sont pas renseignés (options.themes).\");\n }\n\n // options par defaut\n var _toolsDefault = {\n themes: false,\n layers: true,\n search: false,\n style: false,\n filter: false,\n legend: false,\n group: false,\n groupAuto: false,\n sort: true,\n sortBy: \"id\",\n sortOrder: \"asc\",\n title: true,\n collapse: undefined,\n type: true,\n pin: true,\n visibility: true,\n icon: {\n image: true,\n anchor: \"end\"\n },\n editable: true\n };\n if (!this.options.tools) {\n logger.trace(\"Utilisation des outils MapBox par défaut (options.tools).\");\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n\n // id unique\n this.id = this.options.id || _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__[\"default\"].generate();\n\n // context\n this.context = {};\n // property layers\n this.layers = [];\n // dom container\n this.container = null;\n // dom name\n this.name = {\n target: \"GPEditorMapBoxTarget\",\n container: \"GPEditorMapBoxContainer\",\n containerID: \"GPEditorMapBoxContainer_ID_\",\n containerLayers: \"GPEditorMapBoxLayersContainer\",\n titleLayers: \"GPEditorMapBoxLayersTitle\",\n titleLayersID: \"GPEditorMapBoxLayersTitle_ID_\",\n titleThemes: \"GPEditorMapBoxThemesTitle\",\n titleThemesID: \"GPEditorMapBoxThemesTitle_ID_\",\n sep: \"GPEditorMapBoxSep\"\n };\n // style json\n this.mapbox = {};\n // INFO\n // sprites :\n // {\n // url : null,\n // size : {\n // h : null,\n // w : null\n // },\n // json : {}\n // }\n this.sprites = {};\n }\n\n /**\n * Initialize events with handlers\n * (called by constructor)\n *\n * List Events :\n * \"editor:layer:visibility\"\n * \"editor:layer:clone\"\n * \"editor:layer:remove\"\n * \"editor:style:edit\"\n * \"editor:style:minScale\"\n * \"editor:style:maxScale\"\n * \"editor:filter:edit\"\n * \"editor:themes:image\",\n * \"editor:themes:title\"\n * @private\n */\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var ctx = this.options.scope || this;\n var events = this.options.events;\n if (events) {\n for (var event in events) {\n if (events.hasOwnProperty(event)) {\n var handler = events[event];\n // test sur les events disponibles !\n if (handler) {\n if (!eventbusjs__WEBPACK_IMPORTED_MODULE_1___default.a.hasEventListener(event, handler, ctx)) {\n eventbusjs__WEBPACK_IMPORTED_MODULE_1___default.a.addEventListener(event, handler, ctx);\n }\n }\n }\n }\n }\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @example\n *
\n *
Liste des 'thèmes'
\n *
\n * ...\n *
\n *
Liste des 'couches'
\n *
\n *
\n *
\n * \n * \n * \n *
\n *
\n *
...
\n *
...
\n *
\n *
\n * @private\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n logger.trace(this.mapbox);\n\n // existance d'un autre container (editeur) ?\n // var _idx = 0;\n // var elements = document.querySelectorAll(\"div[id^=\" + this.name.containerID + \"]\");\n // for (var j = 0; j < elements.length; j++) {\n // var element = elements[j];\n // var num = parseInt(element.id.substring(element.id.lastIndexOf(\"_\") + 1), 10);\n // if (num > _idx) {\n // _idx = num;\n // }\n // }\n // if (elements.length) {\n // _idx += 1;\n // }\n // container principal de l'editeur\n var div = document.createElement(\"div\");\n div.id = this.name.containerID + this.id;\n div.className = this.name.container;\n\n // Themes\n var _toolsThemes = this.options.tools.themes;\n if (_toolsThemes && this.options.themes) {\n // title\n if (this.options.tools.title) {\n var titleThemes = document.createElement(\"div\");\n titleThemes.id = this.name.titleThemesID + this.id;\n titleThemes.className = this.name.titleThemes;\n titleThemes.innerHTML = \"Liste des 'thèmes'\";\n div.appendChild(titleThemes);\n }\n\n // lien vers les styles\n var themes = new _Editor_Themes__WEBPACK_IMPORTED_MODULE_6__[\"default\"]({\n id: this.id,\n target: div,\n tools: _typeof(_toolsThemes) === \"object\" ? _toolsThemes : {},\n obj: this.options.themes\n });\n themes.add();\n }\n\n // TODO : Recheche / filtre de couches\n if (this.options.tools.search) {\n var search = new _Editor_Search__WEBPACK_IMPORTED_MODULE_12__[\"default\"]({\n id: this.id,\n target: div,\n tools: {},\n obj: this.mapbox.layers // liste des objets layers\n });\n search.add();\n }\n for (var source in this.mapbox.sources) {\n if (this.mapbox.sources.hasOwnProperty(source)) {\n if (this.options.tools.layers) {\n // multisources ? Si oui, on renseigne un titre...\n var multisources = Object.keys(this.mapbox.sources).length > 1 ? 1 : 0;\n if (multisources) {\n var hr = document.createElement(\"hr\");\n hr.className = this.name.sep;\n div.appendChild(hr);\n }\n // title\n if (this.options.tools.title) {\n var titleLayers = document.createElement(\"div\");\n titleLayers.id = this.name.titleLayersID + this.id;\n titleLayers.className = this.name.titleLayers;\n titleLayers.innerHTML = multisources ? \"Liste des 'couches' (\" + source + \")\" : \"Liste des 'couches'\";\n div.appendChild(titleLayers);\n }\n }\n\n // gestion de l'ordre avant tri avec la metadata 'order'\n var _layers = this.mapbox.layers.slice(); // clone\n\n // une fois les layers triés, la metadata:geoportail:order permet\n // de savoir l'emplacement du layers dans le fichier de style.\n _layers.forEach(function (layer, order) {\n // on écarte les layers sans source: ex. \"background\"\n // if (!layer.source) {\n // return;\n // }\n // ajout de la metadata d'ordre\n var _metadata = layer[\"metadata\"];\n if (_metadata) {\n _metadata[\"geoportail:order\"] = order;\n } else {\n layer[\"metadata\"] = {\n \"geoportail:order\": order\n };\n }\n });\n // tri des layers\n if (this.options.tools.sort) {\n var sortBy = this.options.tools.sortBy;\n var sortOrder = this.options.tools.sortOrder;\n var sortFct = function sortFct(a, b) {\n // si on utilise les groupements utilisateurs, ils doivent\n // tous être renseignés sinon..., ça va coincer !\n var result = 0;\n if (a[\"metadata\"] && a[\"metadata\"][\"geoportail:group\"] && b[\"metadata\"] && b[\"metadata\"][\"geoportail:group\"]) {\n var cmpA = null;\n var cmpB = null;\n cmpA = a[\"metadata\"][\"geoportail:group\"];\n cmpB = b[\"metadata\"][\"geoportail:group\"];\n result = cmpA.localeCompare(cmpB);\n } else {\n switch (sortBy) {\n case \"geom\":\n result = sortOrder === \"asc\" ? a.type.localeCompare(b.type) || a.id.localeCompare(b.id) : b.type.localeCompare(a.type) || b.id.localeCompare(a.id);\n break;\n case \"class\":\n result = sortOrder === \"asc\" ? a[\"source-layer\"].localeCompare(b[\"source-layer\"]) || a.id.localeCompare(b.id) : b[\"source-layer\"].localeCompare(a[\"source-layer\"]) || b.id.localeCompare(a.id);\n break;\n case \"id\":\n default:\n // tri sur l'id par defaut\n result = sortOrder === \"asc\" ? a.id.localeCompare(b.id) : b.id.localeCompare(a.id);\n break;\n }\n }\n return result;\n };\n _layers.sort(sortFct);\n }\n logger.trace(\"Layers : \", _layers);\n\n // gestion des groupes avec la metadata de groupe\n var groupBy = this.options.tools.sortBy; // le même type de tri que les couches !\n var groupAuto = this.options.tools.groupAuto;\n var _groups = {}; // liste et comptage des layers dans chaque groupes\n _layers.forEach(function (layer) {\n // on écarte les layers sans source: ex. \"background\"\n // if (!layer.source) {\n // return;\n // }\n // balise metadata\n var _metadata = layer[\"metadata\"];\n // s'il existe déjà une meta de groupe, on l'utilise...\n // sinon, on la met en place.\n if (_metadata && _metadata[\"geoportail:group\"]) {\n var _groupName = _metadata[\"geoportail:group\"];\n _groups[_groupName] = _groups[_groupName] ? _groups[_groupName] + 1 : 1;\n } else {\n var _field = null;\n switch (groupBy) {\n case \"class\":\n _field = layer[\"source-layer\"];\n break;\n case \"geom\":\n _field = layer.type;\n break;\n case \"id\":\n default:\n _field = layer.id;\n break;\n }\n var _newGroupName = _field;\n if (groupAuto) {\n // separateur\n var _regex = /_|-|:|=/; // TODO à definir via une option !\n\n // index\n var _idx = _field.search(_regex);\n // y'a t il un separateur ?\n _newGroupName = _idx !== -1 ? _field.substring(0, _idx).trim() : _field;\n }\n // on compte le nombre d'entrée dans un groupe\n _groups[_newGroupName] = _groups[_newGroupName] ? _groups[_newGroupName] + 1 : 1;\n\n // ajout de la metadata de groupe\n if (_metadata) {\n _metadata[\"geoportail:group\"] = _newGroupName;\n } else {\n layer[\"metadata\"] = {\n \"geoportail:group\": _newGroupName\n };\n }\n }\n });\n logger.trace(\"Groups : \", _groups);\n\n // container principal des couches\n var divLayers = document.createElement(\"div\");\n divLayers.className = this.name.containerLayers;\n div.appendChild(divLayers);\n var details;\n if (this.options.tools.collapse !== undefined) {\n details = document.createElement(\"details\");\n details.className = \"\";\n details.open = !this.options.tools.collapse;\n divLayers.appendChild(details);\n var summary = document.createElement(\"summary\");\n summary.className = \"\";\n summary.innerHTML = \"\";\n details.appendChild(summary);\n }\n\n // container courant (cf. groupe) pour l'ajout des elements\n var target = this.options.tools.collapse !== undefined ? details : divLayers;\n\n // Ex. Layers, Styles, Groups et Filtres\n // \"id\": \"ocs - vegetation\",\n // \"type\": \"fill\",\n // \"source\": \"pyramide_proto\",\n // \"source-layer\": \"ocs_vegetation_surf\",\n // \"metadata\" : {\n // \"geoportail:group\": \"ocs\"\n // },\n // \"layout\": {\n // \"visibility\": \"visible\"\n // },\n // \"filter\": [\"in\",\"symbo\",\n // \"SURFACE_D_EAU\",\n // \"BASSIN\",\n // \"ZONE_MARINE\"\n // ],\n // \"paint\": {\n // \"fill-color\": \"#2BB3E1\"\n // }\n var index = -1;\n for (var ii = 0; ii < _layers.length; ii++) {\n var data = _layers[ii];\n index++;\n\n // traitement dans l'ordre des sources\n if (data.source === source) {\n // Groups\n // INFO la gestion des groupes est basée sur la balise metadata::geoportail:group\n // ainsi que sur l'ordre des couches.\n // il n'y a pas de regroupement sans tri des couches !\n if (this.options.tools.group && this.options.tools.sort) {\n var mtd = data.metadata;\n // creation du container de groupe\n // si le tag metadata existe\n if (mtd) {\n var grp = data.metadata[\"geoportail:group\"];\n if (grp) {\n // le groupe doit contenir plus d'un element\n if (_groups[grp] > 1) {\n // le groupe est déjà créé, on en veut plus par la suite...\n _groups[grp] = -1;\n // creation du groupe\n var oGroup = new _Editor_Group__WEBPACK_IMPORTED_MODULE_10__[\"default\"]({\n id: this.id,\n target: this.options.tools.collapse !== undefined ? details : divLayers,\n title: grp,\n collapse: true\n });\n oGroup.add();\n // le nouveau container pour les elements suivants\n target = oGroup.getContainer();\n } else if (_groups[grp] === 1) {\n // l'element est seul, donc pas d'ajout dans le\n // groupe en cours\n target = this.options.tools.collapse !== undefined ? details : divLayers;\n } else {\n // on ajoute l'element dans le groupe courant...\n }\n } else {\n target = this.options.tools.collapse !== undefined ? details : divLayers;\n }\n } else {\n target = this.options.tools.collapse !== undefined ? details : divLayers;\n }\n }\n // Layers\n if (this.options.tools.layers) {\n var oLayer = new _Editor_Layer__WEBPACK_IMPORTED_MODULE_9__[\"default\"]({\n id: this.id,\n target: target,\n position: index + \"_\" + this.id,\n // unique !\n tools: {\n visibility: this.options.tools.visibility,\n icon: this.options.tools.icon,\n type: this.options.tools.type,\n pin: this.options.tools.pin\n },\n obj: {\n id: data.id,\n type: data.type,\n source: data.source,\n \"source-layer\": data[\"source-layer\"]\n }\n });\n oLayer.add();\n // update visibility layer\n if (data.layout && data.layout.visibility && data.layout.visibility === \"none\") {\n oLayer.visibility(false);\n }\n // sauvegarde des layers\n this.layers.push(oLayer);\n }\n // Legende\n if (this.options.tools.legend) {\n // gestion de l'edition de la legende :\n // l'option \"editable\" est prioritaire sur le tag \"editable\" du fichier de style !\n var isEditable = this.options.tools.editable;\n if (typeof isEditable === \"undefined\") {\n isEditable = data.editable;\n }\n var oLegend = new _Editor_Legend__WEBPACK_IMPORTED_MODULE_8__[\"default\"]({\n id: this.id,\n target: target,\n sprites: this.sprites,\n obj: {\n id: data.id,\n source: data.source,\n title: data.id,\n editable: typeof isEditable !== \"undefined\" ? isEditable : false,\n paint: data.paint,\n layout: data.layout\n }\n });\n oLegend.add();\n oLegend.display(false);\n if (oLayer) {\n oLayer.addLegend(oLegend);\n oLayer.slotLegend(); // integration de la legende dans le container du layers !\n }\n }\n // Style\n if (this.options.tools.style) {\n var oStyle = new _Editor_Style__WEBPACK_IMPORTED_MODULE_5__[\"default\"]({\n id: this.id,\n target: target,\n position: index + \"_\" + this.id,\n // unique !,\n obj: {\n id: data.id,\n source: data.source,\n layout: data.layout,\n paint: data.paint\n }\n });\n oStyle.add();\n oStyle.display(false);\n if (oLayer) {\n oLayer.addStyle(oStyle);\n }\n // update visibility layer\n if (data.layout && data.layout.visibility && data.layout.visibility === \"none\") {\n oLayer.visibility(false);\n }\n }\n // Filter\n if (this.options.tools.filter) {\n var oFilter = new _Editor_Filter__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n id: this.id,\n target: target,\n position: index + \"_\" + this.id,\n // unique !,\n obj: {\n id: data.id,\n source: data.source,\n filter: data.Filter\n }\n });\n oFilter.add();\n oFilter.display(false);\n if (oLayer) {\n oLayer.addFilter(oFilter);\n }\n }\n } else {\n // on ecarte un layer car il n'est pas reconnu dans la source\n // on decremente la position du layer\n if (index >= 0) {\n index--;\n }\n }\n }\n }\n }\n\n // sauvegarde\n this.container = div;\n\n // container principal\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var _target = document.createElement(\"div\");\n _target.id = this.name.target;\n var node = document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0] || document.documentElement;\n node.appendChild(_target);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n // dispatch event\n eventbusjs__WEBPACK_IMPORTED_MODULE_1___default.a.dispatch(_Editor_Event__WEBPACK_IMPORTED_MODULE_11__[\"default\"].onloaded, this);\n }\n\n /**\n * Getting Sprites informations\n * (called by _initialize)\n *\n * @param {String} sprites - url des sprites\n * @returns {Promise} - promise\n * @private\n */\n }, {\n key: \"_getSprites\",\n value: function _getSprites(sprites) {\n var self = this;\n\n // on ne doit pas mettre de promise en échec...\n // car on souhaite continuer le traitement même si on n'a pas de sprites !\n // si le protocole est mapbox://\n if (sprites && sprites.startsWith(\"mapbox://\")) {\n return new Promise(function (resolve, reject) {\n logger.error(\"Protocole mapbox:// non géré !\");\n resolve(self);\n });\n }\n // si pas de sprites\n if (!sprites) {\n return new Promise(function (resolve, reject) {\n logger.error(\"Auncun sprites disponibles !\");\n resolve(self);\n });\n }\n var fetchSpritesImage = function fetchSpritesImage() {\n var spritesImage = sprites + \".png\";\n return fetch(spritesImage, {\n credentials: \"same-origin\"\n }).then(function (response) {\n if (response.ok) {\n return response.blob().then(function (blob) {\n self.sprites.url = spritesImage;\n // decode de l'image\n var theImage = new Image();\n theImage.src = spritesImage;\n return theImage.decode().then(function () {\n self.sprites.size = {};\n self.sprites.size.h = theImage.height;\n self.sprites.size.w = theImage.width;\n });\n })[\"catch\"](function (error) {\n logger.warn(\"fetch image sprites exception :\", error);\n });\n } else {\n var err = new Error(\"HTTP status code: \" + response.status);\n throw err;\n }\n })[\"catch\"](function (error) {\n return new Promise(function (resolve, reject) {\n logger.error(\"fetch image sprites exception :\", error);\n reject(error);\n });\n });\n };\n var fetchSpritesJson = function fetchSpritesJson() {\n var spritesJson = sprites + \".json\";\n return fetch(spritesJson, {\n credentials: \"same-origin\"\n }).then(function (response) {\n if (response.ok) {\n return response.json().then(function (json) {\n self.sprites.json = json;\n })[\"catch\"](function (error) {\n logger.warn(\"fetch json sprites exception :\", error);\n });\n } else {\n var err = new Error(\"HTTP status code: \" + response.status);\n throw err;\n }\n })[\"catch\"](function (error) {\n return new Promise(function (resolve, reject) {\n logger.error(\"fetch json sprites exception :\", error);\n reject(error);\n });\n });\n };\n\n // promise\n return Promise.all([fetchSpritesImage(), fetchSpritesJson()]);\n }\n\n // ################################################################### //\n // ########################## INTERFACE ############################## //\n // ################################################################### //\n /**\n * Create Editor\n *\n * @returns {Promise} - promise\n */\n }, {\n key: \"createElement\",\n value: function createElement() {\n var self = this;\n // objet json\n if (_typeof(this.options.style) === \"object\") {\n this.mapbox = this.options.style;\n // les sprites sont utiles que si on veut une legende !\n if (this.options.tools.legend) {\n return this._getSprites(this.mapbox.sprite).then(function () {\n // init du DOM\n self._initContainer();\n return self;\n })[\"catch\"](function (error) {\n logger.warn(\"fetch sprites exception :\", error);\n });\n } else {\n return new Promise(function (resolve, reject) {\n self._initContainer();\n resolve(self);\n });\n }\n }\n\n // url\n if (typeof this.options.style === \"string\") {\n return fetch(this.options.style, {\n credentials: \"same-origin\"\n }).then(function (response) {\n // sauvegarde du json\n return response.json().then(function (style) {\n self.mapbox = style;\n }).then(function () {\n // les sprites sont utiles que si on veut une legende !\n if (self.options.tools.legend) {\n return self._getSprites(self.mapbox.sprite).then(function () {\n // init du DOM\n self._initContainer();\n return self;\n })[\"catch\"](function (error) {\n logger.warn(\"fetch sprites exception :\", error);\n });\n } else {\n return new Promise(function (resolve, reject) {\n self._initContainer();\n resolve(self);\n });\n }\n })[\"catch\"](function (error) {\n logger.error(\"json exception :\", error);\n });\n })[\"catch\"](function (error) {\n logger.error(\"fetch exception :\", error);\n });\n }\n }\n\n /**\n * Set display container (DOM)\n *\n * @param {Boolean} display - show/hidden container\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n this.container.style.display = _display ? \"block\" : \"none\";\n }\n }, {\n key: \"setContext\",\n value: function setContext(key, value) {\n this.context[key] = value;\n }\n }, {\n key: \"getContext\",\n value: function getContext(key) {\n return this.context[key];\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Get id editor\n * @returns {Number} id\n */\n }, {\n key: \"getID\",\n value: function getID() {\n return this.id;\n }\n\n /**\n * Get container (DOM)\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n /**\n * Get Style (json)\n * @returns {Object} Style MapBox\n */\n }, {\n key: \"getStyle\",\n value: function getStyle() {\n return this.mapbox;\n }\n\n /**\n * Get layer style (json)\n * @param {Number} i - index\n * @returns {Object} Style MapBox of a layers\n */\n }, {\n key: \"getStyleLayer\",\n value: function getStyleLayer(i) {\n var layer = null;\n var o = this.getLayer(i);\n var id = o.options.obj.id;\n for (var k = 0; k < this.mapbox.layers.length; k++) {\n var l = this.mapbox.layers[k];\n if (l.id === id) {\n layer = l;\n break;\n }\n }\n return layer;\n }\n\n /**\n * Get layer object from json style\n * @param {Number} i - index into style json\n * @returns {Object} Style MapBox of a layers\n */\n }, {\n key: \"getLayerFromStyle\",\n value: function getLayerFromStyle(i) {\n var layer = null;\n var l = this.mapbox.layers[i];\n for (var k = 0; k < this.getLayers().length; k++) {\n var o = this.getLayer(k);\n if (l.id === o.options.obj.id) {\n layer = o;\n break;\n }\n }\n return layer;\n }\n\n /**\n * Get a list of layer object sorted or not (see options.tools.sort)\n * @returns {Array} - List of layer object\n * @see {ol.style.editor.Layer}\n */\n }, {\n key: \"getLayers\",\n value: function getLayers() {\n return this.layers;\n }\n\n /**\n * Get the layer object from a list sorted or not (see options.tools.sort)\n * @param {Number} i - index\n * @returns {Object} - layer object\n * @see {ol.style.editor.Layer}\n */\n }, {\n key: \"getLayer\",\n value: function getLayer(i) {\n return this.layers[i];\n }\n }]);\n}();\n;\n\n// on récupère les méthodes de la classe DOM\n_Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].assign(Editor.prototype, _Common_Controls_Editor_EditorDOM__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n\n// ################################################################### //\n// ####################### handlers events to dom #################### //\n// ################################################################### //\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Editor);\n\n// Expose Editor as ol.editor.View (for a build bundle)\nif (window.ol && window.ol.style) {\n window.ol.style.Editor = Editor;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci5qcz80MWI0Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkVkaXRvciIsIm9wdGlvbnMiLCJfY2xhc3NDYWxsQ2hlY2siLCJ0cmFjZSIsIlR5cGVFcnJvciIsIl9pbml0aWFsaXplIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJ0YXJnZXQiLCJpbmZvIiwic3R5bGUiLCJlcnJvciIsImV2ZW50cyIsIl9pbml0RXZlbnRzIiwid2FybiIsInRoZW1lcyIsIl90b29sc0RlZmF1bHQiLCJsYXllcnMiLCJzZWFyY2giLCJmaWx0ZXIiLCJsZWdlbmQiLCJncm91cCIsImdyb3VwQXV0byIsInNvcnQiLCJzb3J0QnkiLCJzb3J0T3JkZXIiLCJ0aXRsZSIsImNvbGxhcHNlIiwidW5kZWZpbmVkIiwidHlwZSIsInBpbiIsInZpc2liaWxpdHkiLCJpY29uIiwiaW1hZ2UiLCJhbmNob3IiLCJlZGl0YWJsZSIsInRvb2xzIiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsImlkIiwiSUQiLCJnZW5lcmF0ZSIsImNvbnRleHQiLCJjb250YWluZXIiLCJuYW1lIiwiY29udGFpbmVySUQiLCJjb250YWluZXJMYXllcnMiLCJ0aXRsZUxheWVycyIsInRpdGxlTGF5ZXJzSUQiLCJ0aXRsZVRoZW1lcyIsInRpdGxlVGhlbWVzSUQiLCJzZXAiLCJtYXBib3giLCJzcHJpdGVzIiwiY3R4Iiwic2NvcGUiLCJldmVudCIsImhhc093blByb3BlcnR5IiwiaGFuZGxlciIsIkV2ZW50QnVzIiwiaGFzRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJfaW5pdENvbnRhaW5lciIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIl90b29sc1RoZW1lcyIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwiVGhlbWVzIiwiX3R5cGVvZiIsIm9iaiIsImFkZCIsIlNlYXJjaCIsInNvdXJjZSIsInNvdXJjZXMiLCJtdWx0aXNvdXJjZXMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiaHIiLCJfbGF5ZXJzIiwic2xpY2UiLCJmb3JFYWNoIiwibGF5ZXIiLCJvcmRlciIsIl9tZXRhZGF0YSIsInNvcnRGY3QiLCJhIiwiYiIsInJlc3VsdCIsImNtcEEiLCJjbXBCIiwibG9jYWxlQ29tcGFyZSIsImdyb3VwQnkiLCJfZ3JvdXBzIiwiX2dyb3VwTmFtZSIsIl9maWVsZCIsIl9uZXdHcm91cE5hbWUiLCJfcmVnZXgiLCJfaWR4Iiwic3Vic3RyaW5nIiwidHJpbSIsImRpdkxheWVycyIsImRldGFpbHMiLCJvcGVuIiwic3VtbWFyeSIsImluZGV4IiwiaWkiLCJkYXRhIiwibXRkIiwibWV0YWRhdGEiLCJncnAiLCJvR3JvdXAiLCJHcm91cCIsImdldENvbnRhaW5lciIsIm9MYXllciIsIkxheWVyIiwicG9zaXRpb24iLCJsYXlvdXQiLCJwdXNoIiwiaXNFZGl0YWJsZSIsIm9MZWdlbmQiLCJMZWdlbmQiLCJwYWludCIsImRpc3BsYXkiLCJhZGRMZWdlbmQiLCJzbG90TGVnZW5kIiwib1N0eWxlIiwiU3R5bGUiLCJhZGRTdHlsZSIsIm9GaWx0ZXIiLCJGaWx0ZXIiLCJhZGRGaWx0ZXIiLCJnZXRFbGVtZW50QnlJZCIsIl90YXJnZXQiLCJub2RlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkb2N1bWVudEVsZW1lbnQiLCJkaXNwYXRjaCIsIkV2ZW50Iiwib25sb2FkZWQiLCJfZ2V0U3ByaXRlcyIsInNlbGYiLCJzdGFydHNXaXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmZXRjaFNwcml0ZXNJbWFnZSIsInNwcml0ZXNJbWFnZSIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwicmVzcG9uc2UiLCJvayIsImJsb2IiLCJ1cmwiLCJ0aGVJbWFnZSIsIkltYWdlIiwic3JjIiwiZGVjb2RlIiwic2l6ZSIsImgiLCJoZWlnaHQiLCJ3Iiwid2lkdGgiLCJlcnIiLCJFcnJvciIsInN0YXR1cyIsImZldGNoU3ByaXRlc0pzb24iLCJzcHJpdGVzSnNvbiIsImpzb24iLCJhbGwiLCJzcHJpdGUiLCJzZXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImdldElEIiwiZ2V0U3R5bGUiLCJnZXRTdHlsZUxheWVyIiwiaSIsIm8iLCJnZXRMYXllciIsImsiLCJsIiwiZ2V0TGF5ZXJGcm9tU3R5bGUiLCJnZXRMYXllcnMiLCJhc3NpZ24iLCJwcm90b3R5cGUiLCJFZGl0b3JET00iLCJ3aW5kb3ciLCJvbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUN1RDtBQUN2RDtBQUNrQztBQUNsQztBQUN1QztBQUNRO0FBQ1M7QUFDckI7QUFDRTtBQUNBO0FBQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDRTs7QUFFckM7QUFDK0Q7QUFFL0QsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsUUFBUSxDQUFDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QU9oRyxLQUFLO0lBQ2hCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBL0UsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQW1MLFVBQUEsRUFBYTtNQUNULE9BQU8sSUFBSSxDQUFDekssTUFBTTtJQUN0Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBWCxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBK0ssU0FBVUYsQ0FBQyxFQUFFO01BQ1QsT0FBTyxJQUFJLENBQUNuSyxNQUFNLENBQUNtSyxDQUFDLENBQUM7SUFDekI7RUFBQztBQUFBO0FBRUo7O0FBRUQ7QUFDQS9JLHFEQUFLLENBQUNzSixNQUFNLENBQUM1TCxNQUFNLENBQUM2TCxTQUFTLEVBQUVDLDBFQUFTLENBQUM7O0FBRXpDO0FBQ0E7QUFDQTs7QUFFZTlMLHFFQUFNLEVBQUM7O0FBRXRCO0FBQ0EsSUFBSStMLE1BQU0sQ0FBQ0MsRUFBRSxJQUFJRCxNQUFNLENBQUNDLEVBQUUsQ0FBQ3JMLEtBQUssRUFBRTtFQUM5Qm9MLE1BQU0sQ0FBQ0MsRUFBRSxDQUFDckwsS0FBSyxDQUFDWCxNQUFNLEdBQUdBLE1BQU07QUFDbkMiLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9Db250cm9scy9FZGl0b3IuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgQ1NTXG5pbXBvcnQgXCIuLi9DU1MvQ29udHJvbHMvRWRpdG9yL0dQZWRpdG9yT3BlbkxheWVycy5jc3NcIjtcbi8vIGltcG9ydCBsaWJyYXJ5XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSBcImV2ZW50YnVzanNcIjtcbi8vIGltcG9ydCBsb2NhbFxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBJRCBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL1NlbGVjdG9ySURcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBTdHlsZSBmcm9tIFwiLi9FZGl0b3IvU3R5bGVcIjtcbmltcG9ydCBUaGVtZXMgZnJvbSBcIi4vRWRpdG9yL1RoZW1lc1wiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwiLi9FZGl0b3IvRmlsdGVyXCI7XG5pbXBvcnQgTGVnZW5kIGZyb20gXCIuL0VkaXRvci9MZWdlbmRcIjtcbmltcG9ydCBMYXllciBmcm9tIFwiLi9FZGl0b3IvTGF5ZXJcIjtcbmltcG9ydCBHcm91cCBmcm9tIFwiLi9FZGl0b3IvR3JvdXBcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwiLi9FZGl0b3IvRXZlbnRcIjtcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vRWRpdG9yL1NlYXJjaFwiO1xuXG4vLyBET01cbmltcG9ydCBFZGl0b3JET00gZnJvbSBcIi4uLy4uL0NvbW1vbi9Db250cm9scy9FZGl0b3IvRWRpdG9yRE9NXCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBFZGl0b3IgU3R5bGVzIE1hcEJveC4uLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnN0eWxlLkVkaXRvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQGZpcmVzIGVkaXRvcjpsYXllcjpvbmNsaWNrdmlzaWJpbGl0eVxuICogQGZpcmVzIGVkaXRvcjpsYXllcjpvbmNsaWNrY2xvbmVcbiAqIEBmaXJlcyBlZGl0b3I6bGF5ZXI6b25jbGlja3JlbW92ZVxuICogQGZpcmVzIGVkaXRvcjpzdHlsZTpvbmVkaXRqc29uXG4gKiBAZmlyZXMgZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWluXG4gKiBAZmlyZXMgZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWF4XG4gKiBAZmlyZXMgZWRpdG9yOmxlZ2VuZDpvbmNsaWNrZWRpdGlvblxuICogQGZpcmVzIGVkaXRvcjpsZWdlbmQ6b25jaGFuZ2V2YWx1ZVxuICogQGZpcmVzIGVkaXRvcjpmaWx0ZXI6b25lZGl0anNvblxuICogQGZpcmVzIGVkaXRvcjp0aGVtZXM6b25jbGlja2ltYWdlXG4gKiBAZmlyZXMgZWRpdG9yOnRoZW1lczpvbmNsaWNrdGl0bGVcbiAqIEBmaXJlcyBlZGl0b3I6Z3JvdXA6b25jb2xsYXBzZVxuICogQGZpcmVzIGVkaXRvcjpvbmxvYWRlZFxuICogQGV4YW1wbGVcbiAqICAgdmFyIGVkaXRvciA9IG5ldyBFZGl0b3IgKHtcbiAqICAgICAgdGFyZ2V0IDogXCJcIixcbiAqICAgICAgc3R5bGUgOiBcImRhdGEvc3R5bGVzL2xheWVyLmpzb25cIixcbiAqICAgICAgdGhlbWVzOiB7XG4gKiAgICAgICAgICB0aGVtZXNTdW1tYXJ5IDogXCJcIixcbiAqICAgICAgICAgIHRoZW1lcyA6IFt7XG4gKiAgICAgICAgICAgICBcInRodW1ibmFpbFwiOiBcImRhdGEvaW1hZ2VzL2xheWVyMC5wbmdcIixcbiAqICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YW5kYXJkMFwiLFxuICogICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3N0eWxlcy9sYXllcjAuanNvblwiLFxuICogICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICogICAgICAgICAgICAgXCJzZWxlY3RlZFwiIDogdHJ1ZVxuICogICAgICAgICAgfSx7XG4gKiAgICAgICAgICAgICBcInRodW1ibmFpbFwiOiBcImRhdGEvaW1hZ2VzL2xheWVyMS5wbmdcIixcbiAqICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YW5kYXJkMVwiLFxuICogICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3N0eWxlcy9sYXllcjEuanNvblwiLFxuICogICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXG4gKiAgICAgICAgICB9XVxuICogICAgICB9LFxuICogICAgICBzY29wZSA6IHRoaXMsXG4gKiAgICAgIGV2ZW50cyA6IHtcbiAqICAgICAgICAgIFwiZWRpdG9yOmxheWVyOm9uY2xpY2t2aXNpYmlsaXR5XCIgOiAuLi4sXG4gKiAgICAgICAgICBcImVkaXRvcjpsYXllcjpvbmNsaWNrY2xvbmVcIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOmxheWVyOm9uY2xpY2tyZW1vdmVcIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOnN0eWxlOm9uZWRpdGpzb25cIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWluXCIgOiAuLi4sXG4gKiAgICAgICAgICBcImVkaXRvcjpzdHlsZTpzY2FsZTpvbmNoYW5nZW1heFwiIDogLi4uLFxuICogICAgICAgICAgXCJlZGl0b3I6ZmlsdGVyOm9uZWRpdGpzb25cIiA6IC4uLixcbiAqICAgICAgICAgIFwiZWRpdG9yOnRoZW1lczpvbmNsaWNraW1hZ2VcIiA6IHRoaXMuX29uQ2xpY2tFdmVudEltYWdlVGhlbWUoKSxcbiAqICAgICAgICAgIFwiZWRpdG9yOnRoZW1lczpvbmNsaWNrdGl0bGVcIiA6IGZ1bmN0aW9uKGUpIHsuLi59XG4gKiAgICAgIH0sXG4gKiAgICAgIHRvb2xzIDoge1xuICogICAgICAgICAgLy8gYWZmaWNoZXIvY2FjaGVyIGxlcyB0aGVtZXMgKHBhciBkZWZhdXQpIG91IHV0aWxpc2VyIGxlcyBvcHRpb25zXG4gKiAgICAgICAgICB0aGVtZXMgOiB0cnVlIHwgZmFsc2UgfCB7XG4gKiAgICAgICAgICAgICAgdGFyZ2V0IDogXCIuLi5cIixcbiAqICAgICAgICAgICAgICB0b29scyA6IHtcbiAqICAgICAgICAgICAgICAgICAgXCJ0aHVtYm5haWxzXCI6IHRydWUsXG4gKiAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCI6IHsgdmlzaWJsZSA6IHRydWUsIHR5cGUgOiBcImNoZWNrYm94XCIgfVxuICogICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgbGF5ZXJzIDogdHJ1ZSB8IGZhbHNlLCAgICAgLy8gYWZmaWNoZXIgbGVzIGNvdWNoZXMgKGxheWVycylcbiAqICAgICAgICAgIHNlYXJjaCA6IHRydWUgfCBmYWxzZSwgICAgIC8vIFRPRE8gOiBhZmZpY2hlciBsJ291dGlsIGRlIHJlY2hlY2hlIGRlIGNvdWNoZXNcbiAqICAgICAgICAgIHN0eWxlIDogdHJ1ZSB8IGZhbHNlLCAgICAgIC8vIGFmZmljaGVyIGxlcyBzdHlsZXMgKHNvdXMgbWVudSBsYXllcnMpXG4gKiAgICAgICAgICBmaWx0ZXIgOiB0cnVlIHwgZmFsc2UsICAgICAvLyBhZmZpY2hlciBsZXMgZmlsdHJlcyAoc291cyBtZW51IGxheWVycylcbiAqICAgICAgICAgIGxlZ2VuZCA6IHRydWUgfCBmYWxzZSwgICAgIC8vIGFmZmljaGVyIGxlcyBsZWdlbmRlcyAobGF5ZXJzKVxuICogICAgICAgICAgZ3JvdXAgOiB0cnVlIHwgZmFsc2UsICAgICAgLy8gZ3JvdXBlciBsZXMgY291Y2hlcywgbCdvcHRpb24gJ3NvcnQnIGRvaXQgw6p0cmUgYWN0aXbDqWUgKGxheWVycylcbiAqICAgICAgICAgIGdyb3VwQXV0byA6IHRydWUgfCBmYWxzZSwgIC8vIGRlZmluaXIgbGEgY29uc3RydWN0aW9uIGF1dG9tYXRpcXVlcyBkZXMgZ3JvdXBlc1xuICogICAgICAgICAgc29ydCA6IHRydWUgfCBmYWxzZSwgICAgICAgLy8gdHJpZXIgbGVzIGNvdWNoZXMgKGxheWVycylcbiAqICAgICAgICAgIHNvcnRCeSA6IFwiaWR8Y2xhc3N8Z2VvbVwiLCAgLy8gZGVmaW5pciBsZSB0eXBlIGRlIHRyaSAobGF5ZXJzKVxuICogICAgICAgICAgc29ydE9yZGVyIDogXCJhc2MsIGRlc2NcIiwgICAvLyBkZWZpbmlyIGwnb3JkcmUgZGUgdHJpIChsYXllcnMpXG4gKiAgICAgICAgICB0aXRsZSA6IHRydWUgfCBmYWxzZSAgICAgICAvLyBhZmZpY2hlciBsZXMgdGl0cmVzIGRlcyBydWJyaXF1ZXMsXG4gKiAgICAgICAgICBjb2xsYXBzZSA6IHRydWUgfCBmYWxzZSB8IHVuZGVmaW5lZCAvLyBhZmZpY2hlciBldC9vdSBwbGllciBsZXMgY291Y2hlcyBvdSBuZSBwYXMgYWZmaWNoZXIgbCdvcHRpb24sXG4gKiAgICAgICAgICB0eXBlIDogdHJ1ZSB8IGZhbHNlLCAgICAgICAvLyBhZmZpY2hlciBsZSB0eXBlIGRlIGdlb21ldHJpZSAobGF5ZXJzKVxuICogICAgICAgICAgcGluIDogdHJ1ZSB8IGZhbHNlLCAgICAgICAgLy8gYWZmaWNoZXIgbGEgcHVjZSBwb3VyIGNoYXF1ZSBjb3VjaGUgKGxheWVycylcbiAqICAgICAgICAgIHZpc2liaWxpdHkgOiB0cnVlIHwgZmFsc2UsIC8vIGFmZmljaGVyIGwnaWNvbmUgZGUgdmlzaWJpbGl0w6kgKGxheWVycyksXG4gKiAgICAgICAgICBpY29uIDogeyAgICAgICAgICAgICAgICAgICAvLyBhZmZpY2hlciBsJ2ljb25lIFwib2VpbFwiIG91IFwiY2hlY2tib3hcIiAobGF5ZXJzKSxcbiAqICAgICAgICAgICAgICBcImltYWdlXCIgOiB0cnVlLFxuICogICAgICAgICAgICAgIFwiYW5jaG9yXCIgOiBcInN0YXJ0XCIgLy8gYWZmaWNoZXIgbCdpY29uZSBhdSBkZWJ1dCBvdSDDoCBsYSBmaW4gZGUgbGEgbGlnbmVcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBlZGl0YWJsZSA6IHRydWUgfCBmYWxzZSAgICAvLyBhY3RpdmUgbCdlZGl0aW9uIGRlIGxhIGxlZ2VuZGUgKGxlZ2VuZGVzKVxuICogICAgICB9XG4gKiAgIH0pO1xuICogICAvLyBvcHRpb25zIHBhciBkZWZhdXRcbiAqICAge1xuICogICAgICB0aGVtZXMgOiBmYWxzZSxcbiAqICAgICAgbGF5ZXJzIDogdHJ1ZSxcbiAqICAgICAgc2VhcmNoIDogZmFsc2UsXG4gKiAgICAgIHN0eWxlIDogZmFsc2UsXG4gKiAgICAgIGZpbHRlciA6IGZhbHNlLFxuICogICAgICBsZWdlbmQgOiBmYWxzZSxcbiAqICAgICAgZ3JvdXAgOiBmYWxzZSxcbiAqICAgICAgZ3JvdXBBdXRvIDogZmFsc2UsXG4gKiAgICAgIHNvcnQgOiB0cnVlLFxuICogICAgICBzb3J0QnkgOiBcImlkXCIsXG4gKiAgICAgIHNvcnRPcmRlciA6IFwiYXNjXCIsXG4gKiAgICAgIHRpdGxlIDogdHJ1ZSxcbiAqICAgICAgY29sbGFwc2UgOiB1bmRlZmluZWQsXG4gKiAgICAgIHR5cGUgOiB0cnVlLFxuICogICAgICBwaW4gOiB0cnVlLFxuICogICAgICB2aXNpYmlsaXR5IDogdHJ1ZSxcbiAqICAgICAgaWNvbiA6IHtcbiAqICAgICAgICAgIGltYWdlIDogdHJ1ZSxcbiAqICAgICAgICAgIGFuY2hvciA6IFwiZW5kXCJcbiAqICAgICAgfSxcbiAqICAgICAgZWRpdGFibGUgOiB0cnVlXG4gKiAgIH1cbiAqICAgLy8gQ29udGV4dFxuICogICBlZGl0b3Iuc2V0Q29udGV4dChcIm1hcFwiLCBtYXApO1xuICogICBlZGl0b3Iuc2V0Q29udGV4dChcImxheWVyXCIsIGxheWVyKTtcbiAqICAgLy8gY3JlYXRlIERPTVxuICogICBlZGl0b3IuY3JlYXRlRWxlbWVudCgpXG4gKiAgICAgLnRoZW4oKCkgPT4ge1xuICogICAgICAgY29uc29sZS53YXJuKGVkaXRvci5nZXRJRCgpKTtcbiAqICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ2V0Q29udGV4dChcIm1hcFwiKSk7XG4gKiAgICAgICBjb25zb2xlLmxvZyh0aGlzLmdldENvbnRleHQoXCJsYXllclwiKSk7XG4gKiAgICAgfSlcbiAqICAgICAuY2F0Y2goZXJyb3IgPT4ge30pO1xuICogICAvLyBwb3NzaWJpbGl0eSB0byBhZGQgbGlzdGVuZXJzIHdpdGggZ2xvYmFsZSB2YXJpYWJsZSA6IGV2ZW50YnVzXG4gKiAgIGV2ZW50YnVzLmFkZEV2ZW50TGlzdGVuZXIoXCJlZGl0b3I6c3R5bGU6c2NhbGU6b25jaGFuZ2VtaW5cIiwgZnVuY3Rpb24gKGUpIHsuLi59KTtcbiAqL1xuY2xhc3MgRWRpdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIltjb25zdHJ1Y3Rvcl0gRWRpdG9yXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBUT0RPIGRlZmF1bHQuLi5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRWRpdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkVSUk9SIENMQVNTX0NPTlNUUlVDVE9SXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyBnZXN0aW9uIGRlcyBvcHRpb25zXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJMYSAndGFyZ2V0JyBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUgKG9wdGlvbnMudGFyZ2V0KS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiTGUgJ3N0eWxlJyBNYXBCb3ggbidlc3QgcGFzIHJlbnNlaWduw6kgKG9wdGlvbnMuc3R5bGUpICFcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJMZXMgJ2hhbmRsZXJzJyBuZSBzb250IHBhcyByZW5zZWlnbsOpcyAob3B0aW9ucy5ldmVudHMpICFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aGVtZXMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiTGVzICd0aGVtZXMnIE1hcEJveCBuZSBzb250IHBhcyByZW5zZWlnbsOpcyAob3B0aW9ucy50aGVtZXMpLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9wdGlvbnMgcGFyIGRlZmF1dFxuICAgICAgICB2YXIgX3Rvb2xzRGVmYXVsdCA9IHtcbiAgICAgICAgICAgIHRoZW1lcyA6IGZhbHNlLFxuICAgICAgICAgICAgbGF5ZXJzIDogdHJ1ZSxcbiAgICAgICAgICAgIHNlYXJjaCA6IGZhbHNlLFxuICAgICAgICAgICAgc3R5bGUgOiBmYWxzZSxcbiAgICAgICAgICAgIGZpbHRlciA6IGZhbHNlLFxuICAgICAgICAgICAgbGVnZW5kIDogZmFsc2UsXG4gICAgICAgICAgICBncm91cCA6IGZhbHNlLFxuICAgICAgICAgICAgZ3JvdXBBdXRvIDogZmFsc2UsXG4gICAgICAgICAgICBzb3J0IDogdHJ1ZSxcbiAgICAgICAgICAgIHNvcnRCeSA6IFwiaWRcIixcbiAgICAgICAgICAgIHNvcnRPcmRlciA6IFwiYXNjXCIsXG4gICAgICAgICAgICB0aXRsZSA6IHRydWUsXG4gICAgICAgICAgICBjb2xsYXBzZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHR5cGUgOiB0cnVlLFxuICAgICAgICAgICAgcGluIDogdHJ1ZSxcbiAgICAgICAgICAgIHZpc2liaWxpdHkgOiB0cnVlLFxuICAgICAgICAgICAgaWNvbiA6IHtcbiAgICAgICAgICAgICAgICBpbWFnZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgYW5jaG9yIDogXCJlbmRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVkaXRhYmxlIDogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzKSB7XG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJVdGlsaXNhdGlvbiBkZXMgb3V0aWxzIE1hcEJveCBwYXIgZMOpZmF1dCAob3B0aW9ucy50b29scykuXCIpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xzID0gX3Rvb2xzRGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucy50b29scywgX3Rvb2xzRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIC8vIGlkIHVuaXF1ZVxuICAgICAgICB0aGlzLmlkID0gdGhpcy5vcHRpb25zLmlkIHx8IElELmdlbmVyYXRlKCk7XG5cbiAgICAgICAgLy8gY29udGV4dFxuICAgICAgICB0aGlzLmNvbnRleHQgPSB7fTtcbiAgICAgICAgLy8gcHJvcGVydHkgbGF5ZXJzXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgICAgIC8vIGRvbSBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICAvLyBkb20gbmFtZVxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94VGFyZ2V0XCIsXG4gICAgICAgICAgICBjb250YWluZXIgOiBcIkdQRWRpdG9yTWFwQm94Q29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJJRCA6IFwiR1BFZGl0b3JNYXBCb3hDb250YWluZXJfSURfXCIsXG4gICAgICAgICAgICBjb250YWluZXJMYXllcnMgOiBcIkdQRWRpdG9yTWFwQm94TGF5ZXJzQ29udGFpbmVyXCIsXG4gICAgICAgICAgICB0aXRsZUxheWVycyA6IFwiR1BFZGl0b3JNYXBCb3hMYXllcnNUaXRsZVwiLFxuICAgICAgICAgICAgdGl0bGVMYXllcnNJRCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllcnNUaXRsZV9JRF9cIixcbiAgICAgICAgICAgIHRpdGxlVGhlbWVzIDogXCJHUEVkaXRvck1hcEJveFRoZW1lc1RpdGxlXCIsXG4gICAgICAgICAgICB0aXRsZVRoZW1lc0lEIDogXCJHUEVkaXRvck1hcEJveFRoZW1lc1RpdGxlX0lEX1wiLFxuICAgICAgICAgICAgc2VwIDogXCJHUEVkaXRvck1hcEJveFNlcFwiXG4gICAgICAgIH07XG4gICAgICAgIC8vIHN0eWxlIGpzb25cbiAgICAgICAgdGhpcy5tYXBib3ggPSB7fTtcbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyBzcHJpdGVzIDpcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgdXJsIDogbnVsbCxcbiAgICAgICAgLy8gICAgIHNpemUgOiB7XG4gICAgICAgIC8vICAgICAgICAgaCA6IG51bGwsXG4gICAgICAgIC8vICAgICAgICAgdyA6IG51bGxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICBqc29uIDoge31cbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLnNwcml0ZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEluaXRpYWxpemUgZXZlbnRzIHdpdGggaGFuZGxlcnNcbiAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgKlxuICAgICogTGlzdCBFdmVudHMgOlxuICAgICogICAgICAgICAgXCJlZGl0b3I6bGF5ZXI6dmlzaWJpbGl0eVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpsYXllcjpjbG9uZVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpsYXllcjpyZW1vdmVcIlxuICAgICogICAgICAgICAgXCJlZGl0b3I6c3R5bGU6ZWRpdFwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpzdHlsZTptaW5TY2FsZVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpzdHlsZTptYXhTY2FsZVwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjpmaWx0ZXI6ZWRpdFwiXG4gICAgKiAgICAgICAgICBcImVkaXRvcjp0aGVtZXM6aW1hZ2VcIixcbiAgICAqICAgICAgICAgIFwiZWRpdG9yOnRoZW1lczp0aXRsZVwiXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgX2luaXRFdmVudHMgKCkge1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5vcHRpb25zLnNjb3BlIHx8IHRoaXM7XG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLm9wdGlvbnMuZXZlbnRzO1xuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50c1tldmVudF07XG4gICAgICAgICAgICAgICAgICAgIC8vIHRlc3Qgc3VyIGxlcyBldmVudHMgZGlzcG9uaWJsZXMgIVxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFdmVudEJ1cy5oYXNFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBjdHgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyYXBoaWNhbCByZW5kZXJpbmcgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hDb250YWluZXJcIiBpZD1cIkdQRWRpdG9yTWFwQm94Q29udGFpbmVyX0lEXzBcIj5cbiAgICAgKiAgICA8ZGl2IGlkPVwiR1BFZGl0b3JNYXBCb3hUaGVtZXNUaXRsZVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZXNUaXRsZVwiPkxpc3RlIGRlcyAndGjDqG1lcyc8L2Rpdj5cbiAgICAgKiAgICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZXNDb250YWluZXJcIj5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgIDwvZGl2PlxuICAgICAqICAgIDxkaXYgaWQ9XCJHUEVkaXRvck1hcEJveExheWVyc1RpdGxlXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyc1RpdGxlXCI+TGlzdGUgZGVzICdjb3VjaGVzJzwvZGl2PlxuICAgICAqICAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyc0NvbnRhaW5lclwiPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJDb250YWluZXJcIj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGlkPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlQ29udGFpbmVyLTBfMVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlQ29udGFpbmVyXCI+XG4gICAgICogICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUxhYmVsXCI+PC9sYWJlbD5cbiAgICAgKiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlSW5wdXQtMF8xXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVJbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiPlxuICAgICAqICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVMYWJlbFwiIGZvcj1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUlucHV0LTBfMVwiIHRpdGxlPVwic3RhdGVzXCI+cG9wdWxhdGlvbl9sdF8ybTwvbGFiZWw+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyQ29udGFpbmVyXCI+Li4uPC9kaXY+XG4gICAgICogICAgICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMYXllckNvbnRhaW5lclwiPi4uLjwvZGl2PlxuICAgICAqICAgIDwvZGl2PlxuICAgICAqICA8L2Rpdj5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pbml0Q29udGFpbmVyICgpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKHRoaXMubWFwYm94KTtcblxuICAgICAgICAvLyBleGlzdGFuY2UgZCd1biBhdXRyZSBjb250YWluZXIgKGVkaXRldXIpID9cbiAgICAgICAgLy8gdmFyIF9pZHggPSAwO1xuICAgICAgICAvLyB2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiZGl2W2lkXj1cIiArIHRoaXMubmFtZS5jb250YWluZXJJRCArIFwiXVwiKTtcbiAgICAgICAgLy8gZm9yICh2YXIgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAvLyAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tqXTtcbiAgICAgICAgLy8gICAgIHZhciBudW0gPSBwYXJzZUludChlbGVtZW50LmlkLnN1YnN0cmluZyhlbGVtZW50LmlkLmxhc3RJbmRleE9mKFwiX1wiKSArIDEpLCAxMCk7XG4gICAgICAgIC8vICAgICBpZiAobnVtID4gX2lkeCkge1xuICAgICAgICAvLyAgICAgICAgIF9pZHggPSBudW07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAvLyAgICAgX2lkeCArPSAxO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnRhaW5lciBwcmluY2lwYWwgZGUgbCdlZGl0ZXVyXG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUuY29udGFpbmVySUQgKyB0aGlzLmlkO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICAvLyBUaGVtZXNcbiAgICAgICAgdmFyIF90b29sc1RoZW1lcyA9IHRoaXMub3B0aW9ucy50b29scy50aGVtZXM7XG4gICAgICAgIGlmIChfdG9vbHNUaGVtZXMgJiYgdGhpcy5vcHRpb25zLnRoZW1lcykge1xuICAgICAgICAgICAgLy8gdGl0bGVcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMudGl0bGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGl0bGVUaGVtZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIHRpdGxlVGhlbWVzLmlkID0gdGhpcy5uYW1lLnRpdGxlVGhlbWVzSUQgKyB0aGlzLmlkO1xuICAgICAgICAgICAgICAgIHRpdGxlVGhlbWVzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS50aXRsZVRoZW1lcztcbiAgICAgICAgICAgICAgICB0aXRsZVRoZW1lcy5pbm5lckhUTUwgPSBcIkxpc3RlIGRlcyAndGjDqG1lcydcIjtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGl0bGVUaGVtZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsaWVuIHZlcnMgbGVzIHN0eWxlc1xuICAgICAgICAgICAgdmFyIHRoZW1lcyA9IG5ldyBUaGVtZXMoe1xuICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB0YXJnZXQgOiBkaXYsXG4gICAgICAgICAgICAgICAgdG9vbHMgOiAodHlwZW9mIF90b29sc1RoZW1lcyA9PT0gXCJvYmplY3RcIikgPyBfdG9vbHNUaGVtZXMgOiB7fSxcbiAgICAgICAgICAgICAgICBvYmogOiB0aGlzLm9wdGlvbnMudGhlbWVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoZW1lcy5hZGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8gOiBSZWNoZWNoZSAvIGZpbHRyZSBkZSBjb3VjaGVzXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuc2VhcmNoKSB7XG4gICAgICAgICAgICB2YXIgc2VhcmNoID0gbmV3IFNlYXJjaCh7XG4gICAgICAgICAgICAgICAgaWQgOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHRhcmdldCA6IGRpdixcbiAgICAgICAgICAgICAgICB0b29scyA6IHt9LFxuICAgICAgICAgICAgICAgIG9iaiA6IHRoaXMubWFwYm94LmxheWVycyAvLyBsaXN0ZSBkZXMgb2JqZXRzIGxheWVyc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWFyY2guYWRkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBzb3VyY2UgaW4gdGhpcy5tYXBib3guc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFwYm94LnNvdXJjZXMuaGFzT3duUHJvcGVydHkoc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG11bHRpc291cmNlcyA/IFNpIG91aSwgb24gcmVuc2VpZ25lIHVuIHRpdHJlLi4uXG4gICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXNvdXJjZXMgPSAoT2JqZWN0LmtleXModGhpcy5tYXBib3guc291cmNlcykubGVuZ3RoID4gMSkgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImhyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaHIuY2xhc3NOYW1lID0gdGhpcy5uYW1lLnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChocik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlTGF5ZXJzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlTGF5ZXJzLmlkID0gdGhpcy5uYW1lLnRpdGxlTGF5ZXJzSUQgKyB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVMYXllcnMuY2xhc3NOYW1lID0gdGhpcy5uYW1lLnRpdGxlTGF5ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVMYXllcnMuaW5uZXJIVE1MID0gKG11bHRpc291cmNlcykgPyBcIkxpc3RlIGRlcyAnY291Y2hlcycgKFwiICsgc291cmNlICsgXCIpXCIgOiBcIkxpc3RlIGRlcyAnY291Y2hlcydcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0aXRsZUxheWVycyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlIGwnb3JkcmUgYXZhbnQgdHJpIGF2ZWMgbGEgbWV0YWRhdGEgJ29yZGVyJ1xuICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJzID0gdGhpcy5tYXBib3gubGF5ZXJzLnNsaWNlKCk7IC8vIGNsb25lXG5cbiAgICAgICAgICAgICAgICAvLyB1bmUgZm9pcyBsZXMgbGF5ZXJzIHRyacOpcywgbGEgbWV0YWRhdGE6Z2VvcG9ydGFpbDpvcmRlciBwZXJtZXRcbiAgICAgICAgICAgICAgICAvLyBkZSBzYXZvaXIgbCdlbXBsYWNlbWVudCBkdSBsYXllcnMgZGFucyBsZSBmaWNoaWVyIGRlIHN0eWxlLlxuICAgICAgICAgICAgICAgIF9sYXllcnMuZm9yRWFjaChmdW5jdGlvbiAobGF5ZXIsIG9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIMOpY2FydGUgbGVzIGxheWVycyBzYW5zIHNvdXJjZTogZXguIFwiYmFja2dyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gYWpvdXQgZGUgbGEgbWV0YWRhdGEgZCdvcmRyZVxuICAgICAgICAgICAgICAgICAgICB2YXIgX21ldGFkYXRhID0gbGF5ZXJbXCJtZXRhZGF0YVwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX21ldGFkYXRhW1wiZ2VvcG9ydGFpbDpvcmRlclwiXSA9IG9yZGVyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJbXCJtZXRhZGF0YVwiXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlb3BvcnRhaWw6b3JkZXJcIiA6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gdHJpIGRlcyBsYXllcnNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnRCeSA9IHRoaXMub3B0aW9ucy50b29scy5zb3J0Qnk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0T3JkZXIgPSB0aGlzLm9wdGlvbnMudG9vbHMuc29ydE9yZGVyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydEZjdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBvbiB1dGlsaXNlIGxlcyBncm91cGVtZW50cyB1dGlsaXNhdGV1cnMsIGlscyBkb2l2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3VzIMOqdHJlIHJlbnNlaWduw6lzIHNpbm9uLi4uLCDDp2EgdmEgY29pbmNlciAhXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhW1wibWV0YWRhdGFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1wibWV0YWRhdGFcIl1bXCJnZW9wb3J0YWlsOmdyb3VwXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYltcIm1ldGFkYXRhXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYltcIm1ldGFkYXRhXCJdW1wiZ2VvcG9ydGFpbDpncm91cFwiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbXBBID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY21wQiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wQSA9IGFbXCJtZXRhZGF0YVwiXVtcImdlb3BvcnRhaWw6Z3JvdXBcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wQiA9IGJbXCJtZXRhZGF0YVwiXVtcImdlb3BvcnRhaWw6Z3JvdXBcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY21wQS5sb2NhbGVDb21wYXJlKGNtcEIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZ2VvbVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc29ydE9yZGVyID09PSBcImFzY1wiID8gYS50eXBlLmxvY2FsZUNvbXBhcmUoYi50eXBlKSB8fCBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIudHlwZS5sb2NhbGVDb21wYXJlKGEudHlwZSkgfHwgYi5pZC5sb2NhbGVDb21wYXJlKGEuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjbGFzc1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc29ydE9yZGVyID09PSBcImFzY1wiID8gYVtcInNvdXJjZS1sYXllclwiXS5sb2NhbGVDb21wYXJlKGJbXCJzb3VyY2UtbGF5ZXJcIl0pIHx8IGEuaWQubG9jYWxlQ29tcGFyZShiLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYltcInNvdXJjZS1sYXllclwiXS5sb2NhbGVDb21wYXJlKGFbXCJzb3VyY2UtbGF5ZXJcIl0pIHx8IGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaSBzdXIgbCdpZCBwYXIgZGVmYXV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3J0T3JkZXIgPT09IFwiYXNjXCIgPyBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkgOiBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIF9sYXllcnMuc29ydChzb3J0RmN0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJMYXllcnMgOiBcIiwgX2xheWVycyk7XG5cbiAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlcyBncm91cGVzIGF2ZWMgbGEgbWV0YWRhdGEgZGUgZ3JvdXBlXG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwQnkgPSB0aGlzLm9wdGlvbnMudG9vbHMuc29ydEJ5OyAvLyBsZSBtw6ptZSB0eXBlIGRlIHRyaSBxdWUgbGVzIGNvdWNoZXMgIVxuICAgICAgICAgICAgICAgIHZhciBncm91cEF1dG8gPSB0aGlzLm9wdGlvbnMudG9vbHMuZ3JvdXBBdXRvO1xuICAgICAgICAgICAgICAgIHZhciBfZ3JvdXBzID0ge307IC8vIGxpc3RlIGV0IGNvbXB0YWdlIGRlcyBsYXllcnMgZGFucyBjaGFxdWUgZ3JvdXBlc1xuICAgICAgICAgICAgICAgIF9sYXllcnMuZm9yRWFjaChmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gw6ljYXJ0ZSBsZXMgbGF5ZXJzIHNhbnMgc291cmNlOiBleC4gXCJiYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBiYWxpc2UgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9tZXRhZGF0YSA9IGxheWVyW1wibWV0YWRhdGFcIl07XG4gICAgICAgICAgICAgICAgICAgIC8vIHMnaWwgZXhpc3RlIGTDqWrDoCB1bmUgbWV0YSBkZSBncm91cGUsIG9uIGwndXRpbGlzZS4uLlxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5vbiwgb24gbGEgbWV0IGVuIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoX21ldGFkYXRhICYmIF9tZXRhZGF0YVtcImdlb3BvcnRhaWw6Z3JvdXBcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZ3JvdXBOYW1lID0gX21ldGFkYXRhW1wiZ2VvcG9ydGFpbDpncm91cFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9ncm91cHNbX2dyb3VwTmFtZV0gPSAoX2dyb3Vwc1tfZ3JvdXBOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9ncm91cHNbX2dyb3VwTmFtZV0gKyAxIDogMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZmllbGQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChncm91cEJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9maWVsZCA9IGxheWVyW1wic291cmNlLWxheWVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZ2VvbVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmllbGQgPSBsYXllci50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmllbGQgPSBsYXllci5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX25ld0dyb3VwTmFtZSA9IF9maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cEF1dG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZXVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWdleCA9IC9ffC18Onw9LzsgLy8gVE9ETyDDoCBkZWZpbmlyIHZpYSB1bmUgb3B0aW9uICFcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9pZHggPSBfZmllbGQuc2VhcmNoKF9yZWdleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geSdhIHQgaWwgdW4gc2VwYXJhdGV1ciA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX25ld0dyb3VwTmFtZSA9IChfaWR4ICE9PSAtMSkgPyBfZmllbGQuc3Vic3RyaW5nKDAsIF9pZHgpLnRyaW0oKSA6IF9maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbXB0ZSBsZSBub21icmUgZCdlbnRyw6llIGRhbnMgdW4gZ3JvdXBlXG4gICAgICAgICAgICAgICAgICAgICAgICBfZ3JvdXBzW19uZXdHcm91cE5hbWVdID0gKF9ncm91cHNbX25ld0dyb3VwTmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfZ3JvdXBzW19uZXdHcm91cE5hbWVdICsgMSA6IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFqb3V0IGRlIGxhIG1ldGFkYXRhIGRlIGdyb3VwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXRhZGF0YVtcImdlb3BvcnRhaWw6Z3JvdXBcIl0gPSBfbmV3R3JvdXBOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcltcIm1ldGFkYXRhXCJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlb3BvcnRhaWw6Z3JvdXBcIiA6IF9uZXdHcm91cE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJHcm91cHMgOiBcIiwgX2dyb3Vwcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgcHJpbmNpcGFsIGRlcyBjb3VjaGVzXG4gICAgICAgICAgICAgICAgdmFyIGRpdkxheWVycyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgZGl2TGF5ZXJzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJMYXllcnM7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRpdkxheWVycyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGV0YWlscztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmNvbGxhcHNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkZXRhaWxzXCIpO1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHMub3BlbiA9ICF0aGlzLm9wdGlvbnMudG9vbHMuY29sbGFwc2U7XG4gICAgICAgICAgICAgICAgICAgIGRpdkxheWVycy5hcHBlbmRDaGlsZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdW1tYXJ5XCIpO1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmRDaGlsZChzdW1tYXJ5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgY291cmFudCAoY2YuIGdyb3VwZSkgcG91ciBsJ2Fqb3V0IGRlcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSAodGhpcy5vcHRpb25zLnRvb2xzLmNvbGxhcHNlICE9PSB1bmRlZmluZWQpID8gZGV0YWlscyA6IGRpdkxheWVycztcblxuICAgICAgICAgICAgICAgIC8vIEV4LiBMYXllcnMsIFN0eWxlcywgR3JvdXBzIGV0IEZpbHRyZXNcbiAgICAgICAgICAgICAgICAvLyAgXCJpZFwiOiBcIm9jcyAtIHZlZ2V0YXRpb25cIixcbiAgICAgICAgICAgICAgICAvLyAgXCJ0eXBlXCI6IFwiZmlsbFwiLFxuICAgICAgICAgICAgICAgIC8vICBcInNvdXJjZVwiOiBcInB5cmFtaWRlX3Byb3RvXCIsXG4gICAgICAgICAgICAgICAgLy8gIFwic291cmNlLWxheWVyXCI6IFwib2NzX3ZlZ2V0YXRpb25fc3VyZlwiLFxuICAgICAgICAgICAgICAgIC8vICBcIm1ldGFkYXRhXCIgOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICBcImdlb3BvcnRhaWw6Z3JvdXBcIjogXCJvY3NcIlxuICAgICAgICAgICAgICAgIC8vICB9LFxuICAgICAgICAgICAgICAgIC8vICBcImxheW91dFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgXCJ2aXNpYmlsaXR5XCI6IFwidmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgICAgICAgICAgLy8gIFwiZmlsdGVyXCI6IFtcImluXCIsXCJzeW1ib1wiLFxuICAgICAgICAgICAgICAgIC8vICAgICAgXCJTVVJGQUNFX0RfRUFVXCIsXG4gICAgICAgICAgICAgICAgLy8gICAgICBcIkJBU1NJTlwiLFxuICAgICAgICAgICAgICAgIC8vICAgICAgXCJaT05FX01BUklORVwiXG4gICAgICAgICAgICAgICAgLy8gIF0sXG4gICAgICAgICAgICAgICAgLy8gIFwicGFpbnRcIjoge1xuICAgICAgICAgICAgICAgIC8vICAgIFwiZmlsbC1jb2xvclwiOiBcIiMyQkIzRTFcIlxuICAgICAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IF9sYXllcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX2xheWVyc1tpaV07XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdHJhaXRlbWVudCBkYW5zIGwnb3JkcmUgZGVzIHNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc291cmNlID09PSBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU5GTyBsYSBnZXN0aW9uIGRlcyBncm91cGVzIGVzdCBiYXPDqWUgc3VyIGxhIGJhbGlzZSBtZXRhZGF0YTo6Z2VvcG9ydGFpbDpncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWluc2kgcXVlIHN1ciBsJ29yZHJlIGRlcyBjb3VjaGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWwgbid5IGEgcGFzIGRlIHJlZ3JvdXBlbWVudCBzYW5zIHRyaSBkZXMgY291Y2hlcyAhXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmdyb3VwICYmIHRoaXMub3B0aW9ucy50b29scy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG10ZCA9IGRhdGEubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRpb24gZHUgY29udGFpbmVyIGRlIGdyb3VwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGxlIHRhZyBtZXRhZGF0YSBleGlzdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncnAgPSBkYXRhLm1ldGFkYXRhW1wiZ2VvcG9ydGFpbDpncm91cFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdycCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGUgZ3JvdXBlIGRvaXQgY29udGVuaXIgcGx1cyBkJ3VuIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZ3JvdXBzW2dycF0gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGUgZ3JvdXBlIGVzdCBkw6lqw6AgY3LDqcOpLCBvbiBlbiB2ZXV0IHBsdXMgcGFyIGxhIHN1aXRlLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dyb3Vwc1tncnBdID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRpb24gZHUgZ3JvdXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9Hcm91cCA9IG5ldyBHcm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IDogKHRoaXMub3B0aW9ucy50b29scy5jb2xsYXBzZSAhPT0gdW5kZWZpbmVkKSA/IGRldGFpbHMgOiBkaXZMYXllcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIDogZ3JwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvR3JvdXAuYWRkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGUgbm91dmVhdSBjb250YWluZXIgcG91ciBsZXMgZWxlbWVudHMgc3VpdmFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBvR3JvdXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9ncm91cHNbZ3JwXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGwnZWxlbWVudCBlc3Qgc2V1bCwgZG9uYyBwYXMgZCdham91dCBkYW5zIGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXBlIGVuIGNvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRoaXMub3B0aW9ucy50b29scy5jb2xsYXBzZSAhPT0gdW5kZWZpbmVkKSA/IGRldGFpbHMgOiBkaXZMYXllcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGFqb3V0ZSBsJ2VsZW1lbnQgZGFucyBsZSBncm91cGUgY291cmFudC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRoaXMub3B0aW9ucy50b29scy5jb2xsYXBzZSAhPT0gdW5kZWZpbmVkKSA/IGRldGFpbHMgOiBkaXZMYXllcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAodGhpcy5vcHRpb25zLnRvb2xzLmNvbGxhcHNlICE9PSB1bmRlZmluZWQpID8gZGV0YWlscyA6IGRpdkxheWVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXllcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9MYXllciA9IG5ldyBMYXllcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA6IGluZGV4ICsgXCJfXCIgKyB0aGlzLmlkLCAvLyB1bmlxdWUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29scyA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHkgOiB0aGlzLm9wdGlvbnMudG9vbHMudmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24gOiB0aGlzLm9wdGlvbnMudG9vbHMuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiB0aGlzLm9wdGlvbnMudG9vbHMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbiA6IHRoaXMub3B0aW9ucy50b29scy5waW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBkYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGRhdGEuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzb3VyY2UtbGF5ZXJcIiA6IGRhdGFbXCJzb3VyY2UtbGF5ZXJcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci5hZGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmlzaWJpbGl0eSBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxheW91dCAmJiBkYXRhLmxheW91dC52aXNpYmlsaXR5ICYmIGRhdGEubGF5b3V0LnZpc2liaWxpdHkgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci52aXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F1dmVnYXJkZSBkZXMgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvTGF5ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnZW5kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5sZWdlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlIGwnZWRpdGlvbiBkZSBsYSBsZWdlbmRlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsJ29wdGlvbiBcImVkaXRhYmxlXCIgZXN0IHByaW9yaXRhaXJlIHN1ciBsZSB0YWcgXCJlZGl0YWJsZVwiIGR1IGZpY2hpZXIgZGUgc3R5bGUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0VkaXRhYmxlID0gdGhpcy5vcHRpb25zLnRvb2xzLmVkaXRhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXNFZGl0YWJsZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VkaXRhYmxlID0gZGF0YS5lZGl0YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9MZWdlbmQgPSBuZXcgTGVnZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgOiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZXMgOiB0aGlzLnNwcml0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGRhdGEuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiBkYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGUgOiAodHlwZW9mIGlzRWRpdGFibGUgIT09IFwidW5kZWZpbmVkXCIpID8gaXNFZGl0YWJsZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQgOiBkYXRhLnBhaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0IDogZGF0YS5sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MZWdlbmQuYWRkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xlZ2VuZC5kaXNwbGF5KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob0xheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci5hZGRMZWdlbmQob0xlZ2VuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MYXllci5zbG90TGVnZW5kKCk7IC8vIGludGVncmF0aW9uIGRlIGxhIGxlZ2VuZGUgZGFucyBsZSBjb250YWluZXIgZHUgbGF5ZXJzICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5zdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvU3R5bGUgPSBuZXcgU3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA6IHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gOiBpbmRleCArIFwiX1wiICsgdGhpcy5pZCwgLy8gdW5pcXVlICEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGRhdGEuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0IDogZGF0YS5sYXlvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCA6IGRhdGEucGFpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9TdHlsZS5hZGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvU3R5bGUuZGlzcGxheShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9MYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGF5ZXIuYWRkU3R5bGUob1N0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHZpc2liaWxpdHkgbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sYXlvdXQgJiYgZGF0YS5sYXlvdXQudmlzaWJpbGl0eSAmJiBkYXRhLmxheW91dC52aXNpYmlsaXR5ID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGF5ZXIudmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvRmlsdGVyID0gbmV3IEZpbHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA6IGluZGV4ICsgXCJfXCIgKyB0aGlzLmlkLCAvLyB1bmlxdWUgISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBkYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIDogZGF0YS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgOiBkYXRhLkZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb0ZpbHRlci5hZGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRmlsdGVyLmRpc3BsYXkoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xheWVyLmFkZEZpbHRlcihvRmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBlY2FydGUgdW4gbGF5ZXIgY2FyIGlsIG4nZXN0IHBhcyByZWNvbm51IGRhbnMgbGEgc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBkZWNyZW1lbnRlIGxhIHBvc2l0aW9uIGR1IGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXV2ZWdhcmRlXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gZGl2O1xuXG4gICAgICAgIC8vIGNvbnRhaW5lciBwcmluY2lwYWxcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF90YXJnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIF90YXJnZXQuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChfdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50XG4gICAgICAgIEV2ZW50QnVzLmRpc3BhdGNoKEV2ZW50Lm9ubG9hZGVkLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXR0aW5nIFNwcml0ZXMgaW5mb3JtYXRpb25zXG4gICAgICogKGNhbGxlZCBieSBfaW5pdGlhbGl6ZSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcHJpdGVzIC0gdXJsIGRlcyBzcHJpdGVzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gcHJvbWlzZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldFNwcml0ZXMgKHNwcml0ZXMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIC8vIG9uIG5lIGRvaXQgcGFzIG1ldHRyZSBkZSBwcm9taXNlIGVuIMOpY2hlYy4uLlxuICAgICAgICAvLyBjYXIgb24gc291aGFpdGUgY29udGludWVyIGxlIHRyYWl0ZW1lbnQgbcOqbWUgc2kgb24gbidhIHBhcyBkZSBzcHJpdGVzICFcbiAgICAgICAgLy8gc2kgbGUgcHJvdG9jb2xlIGVzdCBtYXBib3g6Ly9cbiAgICAgICAgaWYgKHNwcml0ZXMgJiYgc3ByaXRlcy5zdGFydHNXaXRoKFwibWFwYm94Oi8vXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIlByb3RvY29sZSBtYXBib3g6Ly8gbm9uIGfDqXLDqSAhXCIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzaSBwYXMgZGUgc3ByaXRlc1xuICAgICAgICBpZiAoIXNwcml0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQXVuY3VuIHNwcml0ZXMgZGlzcG9uaWJsZXMgIVwiKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmV0Y2hTcHJpdGVzSW1hZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3ByaXRlc0ltYWdlID0gc3ByaXRlcyArIFwiLnBuZ1wiO1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoKHNwcml0ZXNJbWFnZSwge1xuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIDogXCJzYW1lLW9yaWdpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNwcml0ZXMudXJsID0gc3ByaXRlc0ltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNvZGUgZGUgbCdpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhlSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSW1hZ2Uuc3JjID0gc3ByaXRlc0ltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlSW1hZ2UuZGVjb2RlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNwcml0ZXMuc2l6ZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ByaXRlcy5zaXplLmggPSB0aGVJbWFnZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcHJpdGVzLnNpemUudyA9IHRoZUltYWdlLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcImZldGNoIGltYWdlIHNwcml0ZXMgZXhjZXB0aW9uIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIkhUVFAgc3RhdHVzIGNvZGU6IFwiICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImZldGNoIGltYWdlIHNwcml0ZXMgZXhjZXB0aW9uIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmZXRjaFNwcml0ZXNKc29uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNwcml0ZXNKc29uID0gc3ByaXRlcyArIFwiLmpzb25cIjtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaChzcHJpdGVzSnNvbiwge1xuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIDogXCJzYW1lLW9yaWdpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNwcml0ZXMuanNvbiA9IGpzb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcImZldGNoIGpzb24gc3ByaXRlcyBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiSFRUUCBzdGF0dXMgY29kZTogXCIgKyByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiZmV0Y2gganNvbiBzcHJpdGVzIGV4Y2VwdGlvbiA6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHByb21pc2VcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGZldGNoU3ByaXRlc0ltYWdlKCksXG4gICAgICAgICAgICBmZXRjaFNwcml0ZXNKc29uKClcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOVEVSRkFDRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEVkaXRvclxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gcHJvbWlzZVxuICAgICAqL1xuICAgIGNyZWF0ZUVsZW1lbnQgKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIG9iamV0IGpzb25cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMubWFwYm94ID0gdGhpcy5vcHRpb25zLnN0eWxlO1xuICAgICAgICAgICAgLy8gbGVzIHNwcml0ZXMgc29udCB1dGlsZXMgcXVlIHNpIG9uIHZldXQgdW5lIGxlZ2VuZGUgIVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5sZWdlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3ByaXRlcyh0aGlzLm1hcGJveC5zcHJpdGUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXQgZHUgRE9NXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiZmV0Y2ggc3ByaXRlcyBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cmxcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc3R5bGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaCh0aGlzLm9wdGlvbnMuc3R5bGUsIHtcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFscyA6IFwic2FtZS1vcmlnaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNhdXZlZ2FyZGUgZHUganNvblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBib3ggPSBzdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVzIHNwcml0ZXMgc29udCB1dGlsZXMgcXVlIHNpIG9uIHZldXQgdW5lIGxlZ2VuZGUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudG9vbHMubGVnZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRTcHJpdGVzKHNlbGYubWFwYm94LnNwcml0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0IGR1IERPTVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiZmV0Y2ggc3ByaXRlcyBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5pdENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwianNvbiBleGNlcHRpb24gOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImZldGNoIGV4Y2VwdGlvbiA6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkaXNwbGF5IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkpID8gXCJibG9ja1wiIDogXCJub25lXCI7XG4gICAgfVxuXG4gICAgc2V0Q29udGV4dCAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmNvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldENvbnRleHQgKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogR2V0IGlkIGVkaXRvclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IGlkXG4gICAgICovXG4gICAgZ2V0SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIChET00pXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBTdHlsZSAoanNvbilcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdHlsZSBNYXBCb3hcbiAgICAgKi9cbiAgICBnZXRTdHlsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcGJveDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbGF5ZXIgc3R5bGUgKGpzb24pXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFN0eWxlIE1hcEJveCBvZiBhIGxheWVyc1xuICAgICAqL1xuICAgIGdldFN0eWxlTGF5ZXIgKGkpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbnVsbDtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmdldExheWVyKGkpO1xuICAgICAgICB2YXIgaWQgPSBvLm9wdGlvbnMub2JqLmlkO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubWFwYm94LmxheWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdmFyIGwgPSB0aGlzLm1hcGJveC5sYXllcnNba107XG4gICAgICAgICAgICBpZiAobC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBsYXllciA9IGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsYXllciBvYmplY3QgZnJvbSBqc29uIHN0eWxlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBpbmRleCBpbnRvIHN0eWxlIGpzb25cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdHlsZSBNYXBCb3ggb2YgYSBsYXllcnNcbiAgICAgKi9cbiAgICBnZXRMYXllckZyb21TdHlsZSAoaSkge1xuICAgICAgICB2YXIgbGF5ZXIgPSBudWxsO1xuICAgICAgICB2YXIgbCA9IHRoaXMubWFwYm94LmxheWVyc1tpXTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmdldExheWVycygpLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHRoaXMuZ2V0TGF5ZXIoayk7XG4gICAgICAgICAgICBpZiAobC5pZCA9PT0gby5vcHRpb25zLm9iai5pZCkge1xuICAgICAgICAgICAgICAgIGxheWVyID0gbztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGlzdCBvZiBsYXllciBvYmplY3Qgc29ydGVkIG9yIG5vdCAoc2VlIG9wdGlvbnMudG9vbHMuc29ydClcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gTGlzdCBvZiBsYXllciBvYmplY3RcbiAgICAgKiBAc2VlIHtvbC5zdHlsZS5lZGl0b3IuTGF5ZXJ9XG4gICAgICovXG4gICAgZ2V0TGF5ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGF5ZXIgb2JqZWN0IGZyb20gYSBsaXN0IHNvcnRlZCBvciBub3QgKHNlZSBvcHRpb25zLnRvb2xzLnNvcnQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IC0gbGF5ZXIgb2JqZWN0XG4gICAgICogQHNlZSB7b2wuc3R5bGUuZWRpdG9yLkxheWVyfVxuICAgICAqL1xuICAgIGdldExheWVyIChpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyc1tpXTtcbiAgICB9XG5cbn07XG5cbi8vIG9uIHLDqWN1cMOocmUgbGVzIG3DqXRob2RlcyBkZSBsYSBjbGFzc2UgRE9NXG5VdGlscy5hc3NpZ24oRWRpdG9yLnByb3RvdHlwZSwgRWRpdG9yRE9NKTtcblxuLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIHRvIGRvbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG5leHBvcnQgZGVmYXVsdCBFZGl0b3I7XG5cbi8vIEV4cG9zZSBFZGl0b3IgYXMgb2wuZWRpdG9yLlZpZXcgKGZvciBhIGJ1aWxkIGJ1bmRsZSlcbmlmICh3aW5kb3cub2wgJiYgd2luZG93Lm9sLnN0eWxlKSB7XG4gICAgd2luZG93Lm9sLnN0eWxlLkVkaXRvciA9IEVkaXRvcjtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor.js\n"); /***/ }), @@ -2369,7 +2369,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/**\n* managing events\n*\n* /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"editor-filter\");\n\n/**\n * @classdesc\n *\n * MapBox filter management\n *\n * @constructor\n * @alias ol.style.editor.Filter\n * @param {Object} options - options for function call.\n * @example\n * var filter = new Filter ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * tools : {\n * edition : false\n * },\n * title : \"Filtres (JSON)\",\n * obj : {\n * filter : []\n * }\n * });\n * filter.add();\n * filter.display(true);\n * filter.getContainer();\n */\nvar Filter = /*#__PURE__*/function () {\n function Filter(options) {\n _classCallCheck(this, Filter);\n logger.trace(\"[constructor] Filter\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n position: 0,\n tools: null,\n title: null,\n obj: null\n };\n if (!(this instanceof Filter)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Filter, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.position) {\n this.options.position = 0;\n }\n var _toolsDefault = {\n edition: false\n };\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition futur...\n this.options.obj = {\n filter: []\n };\n }\n if (!this.options.title) {\n this.options.title = \"JSON Filtres :\";\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxFilterTarget\",\n container: \"GPEditorMapBoxFilterContainer\",\n containerjson: \"GPEditorMapBoxFilterJsonContainer\",\n jsonlabel: \"GPEditorMapBoxFilterTitleJson\",\n jsondisplay: \"GPEditorMapBoxFilterDisplayJson\",\n containertoolsedit: \"GPEditorMapBoxFilterToolsEditionContainer\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n * \n *
...
\n *
\n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var _found = false;\n var _filter = JSON.parse(JSON.stringify(this.options.obj)); // on manipule une copie !\n\n // FIXME tag filter est obselete !\n // on doit utiliser les expressions dans \"paint\" ou \"layout\" !\n if (_filter.filter) {\n _found = true;\n if (_filter.filter.length === 0) {\n logger.info(\"tag 'filter' is empty !\");\n }\n }\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n var json = null;\n if (_found) {\n json = JSON.stringify(_filter.filter, null, 4);\n }\n var divJson = document.createElement(\"div\");\n divJson.className = this.name.containerjson;\n var labelJson = document.createElement(\"label\");\n labelJson.className = this.name.jsonlabel;\n labelJson.innerHTML = this.options.title;\n divJson.appendChild(labelJson);\n var preJson = document.createElement(\"pre\");\n preJson.className = this.name.jsondisplay;\n preJson.innerHTML = json;\n if (preJson.addEventListener) {\n preJson.addEventListener(\"click\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonFilterMapBox(e);\n }\n });\n } else if (preJson.attachEvent) {\n preJson.attachEvent(\"onclick\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonFilterMapBox(e);\n }\n });\n }\n divJson.appendChild(preJson);\n div.appendChild(divJson);\n if (this.options.tools.edition) {\n var divEdit = document.createElement(\"div\");\n divEdit.className = this.name.containertoolsedit;\n div.appendChild(divEdit);\n }\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Filter#editor:style:oneditjson\n */\n }, {\n key: \"onEditJsonFilterMapBox\",\n value: function onEditJsonFilterMapBox(e) {\n logger.trace(\"onEditJsonFilterMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].filter.oneditjson, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Filter);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9GaWx0ZXIuanM/ZTkxMiJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJGaWx0ZXIiLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsInRvb2xzIiwidGl0bGUiLCJvYmoiLCJUeXBlRXJyb3IiLCJfaW5pdGlhbGl6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJpZCIsIl90b29sc0RlZmF1bHQiLCJlZGl0aW9uIiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsImZpbHRlciIsImNvbnRhaW5lciIsIm5hbWUiLCJjb250YWluZXJqc29uIiwianNvbmxhYmVsIiwianNvbmRpc3BsYXkiLCJjb250YWluZXJ0b29sc2VkaXQiLCJzZWxmIiwiX2ZvdW5kIiwiX2ZpbHRlciIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImxlbmd0aCIsImluZm8iLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJqc29uIiwiZGl2SnNvbiIsImxhYmVsSnNvbiIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwicHJlSnNvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwib25FZGl0SnNvbkZpbHRlck1hcEJveCIsImF0dGFjaEV2ZW50IiwiZGl2RWRpdCIsImFkZCIsImdldEVsZW1lbnRCeUlkIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGlzcGxheSIsInN0eWxlIiwiZ2V0Q29udGFpbmVyIiwiZWRpdG9ySUQiLCJkYXRhIiwiRXZlbnRCdXMiLCJkaXNwYXRjaCIsIkV2ZW50RWRpdG9yIiwib25lZGl0anNvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQWtDO0FBQ0E7QUFDUTtBQUNpQjtB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LEtBQUssQ0FBQ0QsT0FBTyxHQUFJQSxRQUFPLEdBQUksTUFBTSxHQUFHLE1BQU07TUFDOUQ7TUFDQSxPQUFRLElBQUksQ0FBQ2xDLFNBQVMsQ0FBQ21DLEtBQUssQ0FBQ0QsT0FBTyxLQUFLLE1BQU07SUFDbkQ7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUExQyxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBMkMsYUFBQSxFQUFnQjtNQUNaLE9BQU8sSUFBSSxDQUFDcEMsU0FBUztJQUN6Qjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFSLEdBQUE7SUFBQUMsS0FBQSxFQVVBLFNBQUFpQyx1QkFBd0JELENBQUMsRUFBRTtNQUN2QmpELE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHdCQUF3QixFQUFFMkMsQ0FBQyxDQUFDO01BQ3pDQSxDQUFDLENBQUNZLFFBQVEsR0FBRyxJQUFJLENBQUMzQyxFQUFFO01BQ3BCK0IsQ0FBQyxDQUFDYSxJQUFJLEdBQUcsSUFBSSxDQUFDMUQsT0FBTztNQUNyQjJELGlEQUFRLENBQUNDLFFBQVEsQ0FBQ0MsOENBQVcsQ0FBQzFDLE1BQU0sQ0FBQzJDLFVBQVUsRUFBRWpCLENBQUMsQ0FBQztJQUN2RDtFQUFDO0FBQUE7QUFFSjtBQUVjOUMscUVBQU0iLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9Db250cm9scy9FZGl0b3IvRmlsdGVyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vLi4vQ29tbW9uL1V0aWxzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLWZpbHRlclwiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogTWFwQm94IGZpbHRlciBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLkZpbHRlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGZpbHRlciA9IG5ldyBGaWx0ZXIgKHtcbiAqICAgICAgdGFyZ2V0IDogLi4uLFxuICogICAgICBwb3NpdGlvbiA6IDEsIC8vIGlkZW50aWZpYW50IGRlIHBvc2l0aW9uICh1bmlxdWUgISlcbiAqICAgICAgdG9vbHMgOiB7XG4gKiAgICAgICAgICBlZGl0aW9uIDogZmFsc2VcbiAqICAgICAgfSxcbiAqICAgICAgdGl0bGUgOiBcIkZpbHRyZXMgKEpTT04pXCIsXG4gKiAgICAgIG9iaiA6IHtcbiAqICAgICAgICAgIGZpbHRlciA6IFtdXG4gKiAgICAgIH1cbiAqICAgfSk7XG4gKiAgZmlsdGVyLmFkZCgpO1xuICogIGZpbHRlci5kaXNwbGF5KHRydWUpO1xuICogIGZpbHRlci5nZXRDb250YWluZXIoKTtcbiAqL1xuY2xhc3MgRmlsdGVyIHtcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIltjb25zdHJ1Y3Rvcl0gRmlsdGVyXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgcG9zaXRpb24gOiAwLFxuICAgICAgICAgICAgdG9vbHMgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGUgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBGaWx0ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGNmLiBhZGQoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3Rvb2xzRGVmYXVsdCA9IHtcbiAgICAgICAgICAgIGVkaXRpb24gOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbHMgPSBfdG9vbHNEZWZhdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMubWVyZ2VQYXJhbXModGhpcy5vcHRpb25zLnRvb2xzLCBfdG9vbHNEZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub2JqKSB7XG4gICAgICAgICAgICAvLyBjaG9peCBkJ2F2b2lyIHVuIG9iamV0IHZpZGUgcG91ciB1bmUgZWRpdGlvbiBmdXR1ci4uLlxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9iaiA9IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIgOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGl0bGUgPSBcIkpTT04gRmlsdHJlcyA6XCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIERPTSA6IGNsYXNzTmFtZSBvciBpZFxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94RmlsdGVyVGFyZ2V0XCIsXG4gICAgICAgICAgICBjb250YWluZXIgOiBcIkdQRWRpdG9yTWFwQm94RmlsdGVyQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJqc29uIDogXCJHUEVkaXRvck1hcEJveEZpbHRlckpzb25Db250YWluZXJcIixcbiAgICAgICAgICAgIGpzb25sYWJlbCA6IFwiR1BFZGl0b3JNYXBCb3hGaWx0ZXJUaXRsZUpzb25cIixcbiAgICAgICAgICAgIGpzb25kaXNwbGF5IDogXCJHUEVkaXRvck1hcEJveEZpbHRlckRpc3BsYXlKc29uXCIsXG4gICAgICAgICAgICBjb250YWluZXJ0b29sc2VkaXQgOiBcIkdQRWRpdG9yTWFwQm94RmlsdGVyVG9vbHNFZGl0aW9uQ29udGFpbmVyXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveEZpbHRlckNvbnRhaW5lclwiPlxuICAgICAqICA8ZGl2IGNsYXNzID1cIkdQRWRpdG9yTWFwQm94RmlsdGVySnNvbm9udGFpbmVyXCI+XG4gICAgICogICAgIDxsYWJlbCBjbGFzcz1cIkdQRWRpdG9yTWFwQm94RmlsdGVyVGl0bGVKc29uXCI+SlNPTiBGaWx0cmVzIDo8L2xhYmVsPlxuICAgICAqICAgICA8cHJlIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hGaWx0ZXJEaXNwbGF5SnNvblwiPi4uLjwvcHJlPlxuICAgICAqICA8L2Rpdj5cbiAgICAgKiAgPGRpdiBjbGFzcyA9XCJHUEVkaXRvck1hcEJveFN0eWxlVG9vbHNFZGl0aW9uQ29udGFpbmVyXCI+PC9kaXY+XG4gICAgICogPC9kaXY+XG4gICAgICovXG4gICAgX2luaXRDb250YWluZXIgKCkge1xuICAgICAgICAvLyBjb250ZXh0ZVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIF9mb3VuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgX2ZpbHRlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLm9iaikpOyAvLyBvbiBtYW5pcHVsZSB1bmUgY29waWUgICFcblxuICAgICAgICAvLyBGSVhNRSB0YWcgZmlsdGVyIGVzdCBvYnNlbGV0ZSAhXG4gICAgICAgIC8vIG9uIGRvaXQgdXRpbGlzZXIgbGVzIGV4cHJlc3Npb25zIGRhbnMgXCJwYWludFwiIG91IFwibGF5b3V0XCIgIVxuICAgICAgICBpZiAoX2ZpbHRlci5maWx0ZXIpIHtcbiAgICAgICAgICAgIF9mb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoX2ZpbHRlci5maWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ0YWcgJ2ZpbHRlcicgaXMgZW1wdHkgIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICB2YXIganNvbiA9IG51bGw7XG4gICAgICAgIGlmIChfZm91bmQpIHtcbiAgICAgICAgICAgIGpzb24gPSBKU09OLnN0cmluZ2lmeShfZmlsdGVyLmZpbHRlciwgbnVsbCwgNCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGl2SnNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdkpzb24uY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcmpzb247XG5cbiAgICAgICAgdmFyIGxhYmVsSnNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWxKc29uLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5qc29ubGFiZWw7XG4gICAgICAgIGxhYmVsSnNvbi5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIGRpdkpzb24uYXBwZW5kQ2hpbGQobGFiZWxKc29uKTtcblxuICAgICAgICB2YXIgcHJlSnNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgIHByZUpzb24uY2xhc3NOYW1lID0gdGhpcy5uYW1lLmpzb25kaXNwbGF5O1xuICAgICAgICBwcmVKc29uLmlubmVySFRNTCA9IGpzb247XG4gICAgICAgIGlmIChwcmVKc29uLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHByZUpzb24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29scy5lZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25FZGl0SnNvbkZpbHRlck1hcEJveChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmVKc29uLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICBwcmVKc29uLmF0dGFjaEV2ZW50KFwib25jbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRWRpdEpzb25GaWx0ZXJNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2SnNvbi5hcHBlbmRDaGlsZChwcmVKc29uKTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRpdkpzb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgdmFyIGRpdkVkaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZGl2RWRpdC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVydG9vbHNlZGl0O1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRpdkVkaXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQWRkIGVsZW1lbnQgaW50byB0YXJnZXQgRE9NXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBMZWdlbmQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGQgKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIG9yIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJkaXNwbGF5KClcIiwgZGlzcGxheSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiZmxleFwiIDogXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcImZsZXhcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgdG8gZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybS4uLlxuICAgICAqXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBvcHRpb24gb2JqZWN0IGludG8gJ2UudGFyZ2V0LmRhdGEnICFcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIGlkIGVkaXRvciBpbnRvICdlLnRhcmdldC5lZGl0b3JJRCcgIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIEZpbHRlciNlZGl0b3I6c3R5bGU6b25lZGl0anNvblxuICAgICAqL1xuICAgIG9uRWRpdEpzb25GaWx0ZXJNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25FZGl0SnNvbkZpbHRlck1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3IuZmlsdGVyLm9uZWRpdGpzb24sIGUpO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Filter.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"editor-filter\");\n\n/**\n * @classdesc\n *\n * MapBox filter management\n *\n * @constructor\n * @alias ol.style.editor.Filter\n * @param {Object} options - options for function call.\n * @example\n * var filter = new Filter ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * tools : {\n * edition : false\n * },\n * title : \"Filtres (JSON)\",\n * obj : {\n * filter : []\n * }\n * });\n * filter.add();\n * filter.display(true);\n * filter.getContainer();\n */\nvar Filter = /*#__PURE__*/function () {\n function Filter(options) {\n _classCallCheck(this, Filter);\n logger.trace(\"[constructor] Filter\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n position: 0,\n tools: null,\n title: null,\n obj: null\n };\n if (!(this instanceof Filter)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Filter, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.position) {\n this.options.position = 0;\n }\n var _toolsDefault = {\n edition: false\n };\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition futur...\n this.options.obj = {\n filter: []\n };\n }\n if (!this.options.title) {\n this.options.title = \"JSON Filtres :\";\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxFilterTarget\",\n container: \"GPEditorMapBoxFilterContainer\",\n containerjson: \"GPEditorMapBoxFilterJsonContainer\",\n jsonlabel: \"GPEditorMapBoxFilterTitleJson\",\n jsondisplay: \"GPEditorMapBoxFilterDisplayJson\",\n containertoolsedit: \"GPEditorMapBoxFilterToolsEditionContainer\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n * \n *
...
\n *
\n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var _found = false;\n var _filter = JSON.parse(JSON.stringify(this.options.obj)); // on manipule une copie !\n\n // FIXME tag filter est obselete !\n // on doit utiliser les expressions dans \"paint\" ou \"layout\" !\n if (_filter.filter) {\n _found = true;\n if (_filter.filter.length === 0) {\n logger.info(\"tag 'filter' is empty !\");\n }\n }\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n var json = null;\n if (_found) {\n json = JSON.stringify(_filter.filter, null, 4);\n }\n var divJson = document.createElement(\"div\");\n divJson.className = this.name.containerjson;\n var labelJson = document.createElement(\"label\");\n labelJson.className = this.name.jsonlabel;\n labelJson.innerHTML = this.options.title;\n divJson.appendChild(labelJson);\n var preJson = document.createElement(\"pre\");\n preJson.className = this.name.jsondisplay;\n preJson.innerHTML = json;\n if (preJson.addEventListener) {\n preJson.addEventListener(\"click\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonFilterMapBox(e);\n }\n });\n } else if (preJson.attachEvent) {\n preJson.attachEvent(\"onclick\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonFilterMapBox(e);\n }\n });\n }\n divJson.appendChild(preJson);\n div.appendChild(divJson);\n if (this.options.tools.edition) {\n var divEdit = document.createElement(\"div\");\n divEdit.className = this.name.containertoolsedit;\n div.appendChild(divEdit);\n }\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Filter#editor:style:oneditjson\n */\n }, {\n key: \"onEditJsonFilterMapBox\",\n value: function onEditJsonFilterMapBox(e) {\n logger.trace(\"onEditJsonFilterMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].filter.oneditjson, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Filter);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9GaWx0ZXIuanM/ZTkxMiJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJGaWx0ZXIiLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsInRvb2xzIiwidGl0bGUiLCJvYmoiLCJUeXBlRXJyb3IiLCJfaW5pdGlhbGl6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJpZCIsIl90b29sc0RlZmF1bHQiLCJlZGl0aW9uIiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsImZpbHRlciIsImNvbnRhaW5lciIsIm5hbWUiLCJjb250YWluZXJqc29uIiwianNvbmxhYmVsIiwianNvbmRpc3BsYXkiLCJjb250YWluZXJ0b29sc2VkaXQiLCJzZWxmIiwiX2ZvdW5kIiwiX2ZpbHRlciIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImxlbmd0aCIsImluZm8iLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJqc29uIiwiZGl2SnNvbiIsImxhYmVsSnNvbiIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwicHJlSnNvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwib25FZGl0SnNvbkZpbHRlck1hcEJveCIsImF0dGFjaEV2ZW50IiwiZGl2RWRpdCIsImFkZCIsImdldEVsZW1lbnRCeUlkIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGlzcGxheSIsInN0eWxlIiwiZ2V0Q29udGFpbmVyIiwiZWRpdG9ySUQiLCJkYXRhIiwiRXZlbnRCdXMiLCJkaXNwYXRjaCIsIkV2ZW50RWRpdG9yIiwib25lZGl0anNvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQWtDO0FBQ0E7QUFDUTtBQUNpQjtB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LEtBQUssQ0FBQ0QsT0FBTyxHQUFJQSxRQUFPLEdBQUksTUFBTSxHQUFHLE1BQU07TUFDOUQ7TUFDQSxPQUFRLElBQUksQ0FBQ2xDLFNBQVMsQ0FBQ21DLEtBQUssQ0FBQ0QsT0FBTyxLQUFLLE1BQU07SUFDbkQ7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUExQyxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBMkMsYUFBQSxFQUFnQjtNQUNaLE9BQU8sSUFBSSxDQUFDcEMsU0FBUztJQUN6Qjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFSLEdBQUE7SUFBQUMsS0FBQSxFQVVBLFNBQUFpQyx1QkFBd0JELENBQUMsRUFBRTtNQUN2QmpELE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHdCQUF3QixFQUFFMkMsQ0FBQyxDQUFDO01BQ3pDQSxDQUFDLENBQUNZLFFBQVEsR0FBRyxJQUFJLENBQUMzQyxFQUFFO01BQ3BCK0IsQ0FBQyxDQUFDYSxJQUFJLEdBQUcsSUFBSSxDQUFDMUQsT0FBTztNQUNyQjJELGlEQUFRLENBQUNDLFFBQVEsQ0FBQ0MsOENBQVcsQ0FBQzFDLE1BQU0sQ0FBQzJDLFVBQVUsRUFBRWpCLENBQUMsQ0FBQztJQUN2RDtFQUFDO0FBQUE7QUFFSjtBQUVjOUMscUVBQU0iLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9Db250cm9scy9FZGl0b3IvRmlsdGVyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vLi4vQ29tbW9uL1V0aWxzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLWZpbHRlclwiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogTWFwQm94IGZpbHRlciBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLkZpbHRlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGZpbHRlciA9IG5ldyBGaWx0ZXIgKHtcbiAqICAgICAgdGFyZ2V0IDogLi4uLFxuICogICAgICBwb3NpdGlvbiA6IDEsIC8vIGlkZW50aWZpYW50IGRlIHBvc2l0aW9uICh1bmlxdWUgISlcbiAqICAgICAgdG9vbHMgOiB7XG4gKiAgICAgICAgICBlZGl0aW9uIDogZmFsc2VcbiAqICAgICAgfSxcbiAqICAgICAgdGl0bGUgOiBcIkZpbHRyZXMgKEpTT04pXCIsXG4gKiAgICAgIG9iaiA6IHtcbiAqICAgICAgICAgIGZpbHRlciA6IFtdXG4gKiAgICAgIH1cbiAqICAgfSk7XG4gKiAgZmlsdGVyLmFkZCgpO1xuICogIGZpbHRlci5kaXNwbGF5KHRydWUpO1xuICogIGZpbHRlci5nZXRDb250YWluZXIoKTtcbiAqL1xuY2xhc3MgRmlsdGVyIHtcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIltjb25zdHJ1Y3Rvcl0gRmlsdGVyXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgcG9zaXRpb24gOiAwLFxuICAgICAgICAgICAgdG9vbHMgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGUgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBGaWx0ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGNmLiBhZGQoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3Rvb2xzRGVmYXVsdCA9IHtcbiAgICAgICAgICAgIGVkaXRpb24gOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbHMgPSBfdG9vbHNEZWZhdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMubWVyZ2VQYXJhbXModGhpcy5vcHRpb25zLnRvb2xzLCBfdG9vbHNEZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub2JqKSB7XG4gICAgICAgICAgICAvLyBjaG9peCBkJ2F2b2lyIHVuIG9iamV0IHZpZGUgcG91ciB1bmUgZWRpdGlvbiBmdXR1ci4uLlxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9iaiA9IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIgOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGl0bGUgPSBcIkpTT04gRmlsdHJlcyA6XCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIERPTSA6IGNsYXNzTmFtZSBvciBpZFxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94RmlsdGVyVGFyZ2V0XCIsXG4gICAgICAgICAgICBjb250YWluZXIgOiBcIkdQRWRpdG9yTWFwQm94RmlsdGVyQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJqc29uIDogXCJHUEVkaXRvck1hcEJveEZpbHRlckpzb25Db250YWluZXJcIixcbiAgICAgICAgICAgIGpzb25sYWJlbCA6IFwiR1BFZGl0b3JNYXBCb3hGaWx0ZXJUaXRsZUpzb25cIixcbiAgICAgICAgICAgIGpzb25kaXNwbGF5IDogXCJHUEVkaXRvck1hcEJveEZpbHRlckRpc3BsYXlKc29uXCIsXG4gICAgICAgICAgICBjb250YWluZXJ0b29sc2VkaXQgOiBcIkdQRWRpdG9yTWFwQm94RmlsdGVyVG9vbHNFZGl0aW9uQ29udGFpbmVyXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveEZpbHRlckNvbnRhaW5lclwiPlxuICAgICAqICA8ZGl2IGNsYXNzID1cIkdQRWRpdG9yTWFwQm94RmlsdGVySnNvbm9udGFpbmVyXCI+XG4gICAgICogICAgIDxsYWJlbCBjbGFzcz1cIkdQRWRpdG9yTWFwQm94RmlsdGVyVGl0bGVKc29uXCI+SlNPTiBGaWx0cmVzIDo8L2xhYmVsPlxuICAgICAqICAgICA8cHJlIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hGaWx0ZXJEaXNwbGF5SnNvblwiPi4uLjwvcHJlPlxuICAgICAqICA8L2Rpdj5cbiAgICAgKiAgPGRpdiBjbGFzcyA9XCJHUEVkaXRvck1hcEJveFN0eWxlVG9vbHNFZGl0aW9uQ29udGFpbmVyXCI+PC9kaXY+XG4gICAgICogPC9kaXY+XG4gICAgICovXG4gICAgX2luaXRDb250YWluZXIgKCkge1xuICAgICAgICAvLyBjb250ZXh0ZVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIF9mb3VuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgX2ZpbHRlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLm9iaikpOyAvLyBvbiBtYW5pcHVsZSB1bmUgY29waWUgICFcblxuICAgICAgICAvLyBGSVhNRSB0YWcgZmlsdGVyIGVzdCBvYnNlbGV0ZSAhXG4gICAgICAgIC8vIG9uIGRvaXQgdXRpbGlzZXIgbGVzIGV4cHJlc3Npb25zIGRhbnMgXCJwYWludFwiIG91IFwibGF5b3V0XCIgIVxuICAgICAgICBpZiAoX2ZpbHRlci5maWx0ZXIpIHtcbiAgICAgICAgICAgIF9mb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoX2ZpbHRlci5maWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ0YWcgJ2ZpbHRlcicgaXMgZW1wdHkgIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICB2YXIganNvbiA9IG51bGw7XG4gICAgICAgIGlmIChfZm91bmQpIHtcbiAgICAgICAgICAgIGpzb24gPSBKU09OLnN0cmluZ2lmeShfZmlsdGVyLmZpbHRlciwgbnVsbCwgNCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGl2SnNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdkpzb24uY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcmpzb247XG5cbiAgICAgICAgdmFyIGxhYmVsSnNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWxKc29uLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5qc29ubGFiZWw7XG4gICAgICAgIGxhYmVsSnNvbi5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIGRpdkpzb24uYXBwZW5kQ2hpbGQobGFiZWxKc29uKTtcblxuICAgICAgICB2YXIgcHJlSnNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgIHByZUpzb24uY2xhc3NOYW1lID0gdGhpcy5uYW1lLmpzb25kaXNwbGF5O1xuICAgICAgICBwcmVKc29uLmlubmVySFRNTCA9IGpzb247XG4gICAgICAgIGlmIChwcmVKc29uLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHByZUpzb24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29scy5lZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25FZGl0SnNvbkZpbHRlck1hcEJveChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmVKc29uLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICBwcmVKc29uLmF0dGFjaEV2ZW50KFwib25jbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRWRpdEpzb25GaWx0ZXJNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2SnNvbi5hcHBlbmRDaGlsZChwcmVKc29uKTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRpdkpzb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgdmFyIGRpdkVkaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZGl2RWRpdC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVydG9vbHNlZGl0O1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRpdkVkaXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQWRkIGVsZW1lbnQgaW50byB0YXJnZXQgRE9NXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBMZWdlbmQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGQgKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIG9yIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJkaXNwbGF5KClcIiwgZGlzcGxheSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiZmxleFwiIDogXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcImZsZXhcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgdG8gZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybS4uLlxuICAgICAqXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBvcHRpb24gb2JqZWN0IGludG8gJ2UudGFyZ2V0LmRhdGEnICFcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIGlkIGVkaXRvciBpbnRvICdlLnRhcmdldC5lZGl0b3JJRCcgIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIEZpbHRlciNlZGl0b3I6c3R5bGU6b25lZGl0anNvblxuICAgICAqL1xuICAgIG9uRWRpdEpzb25GaWx0ZXJNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25FZGl0SnNvbkZpbHRlck1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3IuZmlsdGVyLm9uZWRpdGpzb24sIGUpO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Filter.js\n"); /***/ }), @@ -2381,7 +2381,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var even /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getLogger(\"editor-group\");\n\n/**\n * @classdesc\n *\n * MapBox group management\n *\n * @constructor\n * @alias ol.style.editor.Group\n * @param {Object} options - options for function call.\n * @example\n * var group = new Group ({\n * title : \"MyGroup\",\n * collapse : true, // plier/deplier\n * target : ...\n * });\n * group.add();\n * group.add();\n */\nvar Group = /*#__PURE__*/function () {\n function Group(options) {\n _classCallCheck(this, Group);\n logger.trace(\"[constructor] Group\", options);\n\n // options\n this.options = options || {\n // default...\n };\n if (!(this instanceof Group)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Group, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.title) {\n // cf. summary\n this.options.title = \"Détails du groupe...\";\n }\n\n // plier par defaut\n if (typeof this.options.collapse === \"undefined\") {\n this.options.collapse = true;\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxGroupTarget\",\n container: \"GPEditorMapBoxGroupContainer\",\n details: \"GPEditorMapBoxGroupDetails\",\n summary: \"GPEditorMapBoxGroupSummary\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
...
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // FIXME pas compatible IE !\n // https://caniuse.com/#search=details\n // cf. https://css-tricks.com/quick-reminder-that-details-summary-is-the-easiest-way-ever-to-make-an-accordion/\n var details = document.createElement(\"details\");\n details.className = this.name.details;\n details.open = !this.options.collapse;\n div.appendChild(details);\n var summary = document.createElement(\"summary\");\n summary.className = this.name.summary;\n summary.innerHTML = this.options.title;\n details.appendChild(summary);\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n }\n\n /**\n * Set display container (DOM)\n *\n * @param {Boolean} display - show/hidden container\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n var nodes = this.container.childNodes;\n if (nodes.length) {\n // retourne le noeud \"details\" !\n return nodes[0];\n }\n // sinon le container principal\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form\n *\n * NOT USED !\n * @param {Object} e - HTMLElement\n * @private\n * @fires Group#editor:group:oncollapse\n */\n }, {\n key: \"onCollapseGroupMapBox\",\n value: function onCollapseGroupMapBox(e) {\n logger.trace(\"onCollapseGroupMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].group.oncollapse, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Group);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9Hcm91cC5qcz8wNGQ1Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkdyb3VwIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInRyYWNlIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJ0YXJnZXQiLCJ0aXRsZSIsImNvbGxhcHNlIiwiY29udGFpbmVyIiwibmFtZSIsImRldGFpbHMiLCJzdW1tYXJ5IiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwib3BlbiIsImFwcGVuZENoaWxkIiwiaW5uZXJIVE1MIiwiYWRkIiwiZ2V0RWxlbWVudEJ5SWQiLCJub2RlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkaXNwbGF5Iiwic3R5bGUiLCJnZXRDb250YWluZXIiLCJub2RlcyIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJvbkNvbGxhcHNlR3JvdXBNYXBCb3giLCJlIiwiZWRpdG9ySUQiLCJkYXRhIiwiRXZlbnRCdXMiLCJkaXNwYXRjaCIsIkV2ZW50RWRpdG9yIiwiZ3JvdXAiLCJvbmNvbGxhcHNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ3lCO0FBRTNELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGNBQWMsQ0FBQzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSxJQWlCTUMsS0FBSztFQUVQLFNBQUFBLE1BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLEtBQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FB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Q0E7RUFQSTtJQUFBTixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBMkIsc0JBQXVCQyxDQUFDLEVBQUU7TUFDdEJ4QyxNQUFNLENBQUNNLEtBQUssQ0FBQyx1QkFBdUIsRUFBRWtDLENBQUMsQ0FBQztNQUN4Q0EsQ0FBQyxDQUFDQyxRQUFRLEdBQUcsSUFBSSxDQUFDNUIsRUFBRTtNQUNwQjJCLENBQUMsQ0FBQ0UsSUFBSSxHQUFHLElBQUksQ0FBQ3RDLE9BQU87TUFDckJ1QyxpREFBUSxDQUFDQyxRQUFRLENBQUNDLDhDQUFXLENBQUNDLEtBQUssQ0FBQ0MsVUFBVSxFQUFFUCxDQUFDLENBQUM7SUFDdEQ7RUFBQztBQUFBO0FBRUo7QUFFY3JDLG9FQUFLIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRWRpdG9yL0dyb3VwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJlZGl0b3ItZ3JvdXBcIik7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICpcbiAqIE1hcEJveCBncm91cCBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLkdyb3VwXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZ3JvdXAgPSBuZXcgR3JvdXAgKHtcbiAqICAgICAgdGl0bGUgOiBcIk15R3JvdXBcIixcbiAqICAgICAgY29sbGFwc2UgOiB0cnVlLCAvLyBwbGllci9kZXBsaWVyXG4gKiAgICAgIHRhcmdldCA6IC4uLlxuICogICB9KTtcbiAqICAgZ3JvdXAuYWRkKCk7XG4gKiAgIGdyb3VwLmFkZCgpO1xuICovXG5jbGFzcyBHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIEdyb3VwXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdyb3VwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkVSUk9SIENMQVNTX0NPTlNUUlVDVE9SXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIHRoaXMuX2luaXRDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pbml0aWFsaXplICgpIHtcbiAgICAgICAgLy8gdW5pcXVlIGVkaXRvciBpZCAob3B0aW9uYWwhKVxuICAgICAgICB0aGlzLmlkID0gdGhpcy5vcHRpb25zLmlkIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBjZi4gYWRkKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRpdGxlKSB7XG4gICAgICAgICAgICAvLyBjZi4gc3VtbWFyeVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gXCJEw6l0YWlscyBkdSBncm91cGUuLi5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBsaWVyIHBhciBkZWZhdXRcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuY29sbGFwc2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hHcm91cFRhcmdldFwiLFxuICAgICAgICAgICAgY29udGFpbmVyIDogXCJHUEVkaXRvck1hcEJveEdyb3VwQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBkZXRhaWxzIDogXCJHUEVkaXRvck1hcEJveEdyb3VwRGV0YWlsc1wiLFxuICAgICAgICAgICAgc3VtbWFyeSA6IFwiR1BFZGl0b3JNYXBCb3hHcm91cFN1bW1hcnlcIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyYXBoaWNhbCByZW5kZXJpbmcgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94R3JvdXBDb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICAvLyBGSVhNRSBwYXMgY29tcGF0aWJsZSBJRSAhXG4gICAgICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI3NlYXJjaD1kZXRhaWxzXG4gICAgICAgIC8vIGNmLiBodHRwczovL2Nzcy10cmlja3MuY29tL3F1aWNrLXJlbWluZGVyLXRoYXQtZGV0YWlscy1zdW1tYXJ5LWlzLXRoZS1lYXNpZXN0LXdheS1ldmVyLXRvLW1ha2UtYW4tYWNjb3JkaW9uL1xuICAgICAgICB2YXIgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkZXRhaWxzXCIpO1xuICAgICAgICBkZXRhaWxzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5kZXRhaWxzO1xuICAgICAgICBkZXRhaWxzLm9wZW4gPSAhdGhpcy5vcHRpb25zLmNvbGxhcHNlO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGV0YWlscyk7XG5cbiAgICAgICAgdmFyIHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3VtbWFyeVwiKTtcbiAgICAgICAgc3VtbWFyeS5jbGFzc05hbWUgPSB0aGlzLm5hbWUuc3VtbWFyeTtcbiAgICAgICAgc3VtbWFyeS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIGRldGFpbHMuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7XG5cbiAgICAgICAgLy8gbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQWRkIGVsZW1lbnQgaW50byB0YXJnZXQgRE9NXG4gICAgICovXG4gICAgYWRkICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgZGl2LmlkID0gdGhpcy5uYW1lLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0gfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xuICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIChET00pXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzaG93L2hpZGRlbiBjb250YWluZXJcbiAgICAgKi9cbiAgICBkaXNwbGF5IChkaXNwbGF5KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAoZGlzcGxheSkgPyBcImZsZXhcIiA6IFwibm9uZVwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjb250YWluZXIgKERPTSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtET01FbGVtZW50fSBET00gZWxlbWVudFxuICAgICAqL1xuICAgIGdldENvbnRhaW5lciAoKSB7XG4gICAgICAgIHZhciBub2RlcyA9IHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXM7XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHJldG91cm5lIGxlIG5vZXVkIFwiZGV0YWlsc1wiICFcbiAgICAgICAgICAgIHJldHVybiBub2Rlc1swXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzaW5vbiBsZSBjb250YWluZXIgcHJpbmNpcGFsXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIHRvIGRvbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm1cbiAgICAgKlxuICAgICAqIE5PVCBVU0VEICFcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgR3JvdXAjZWRpdG9yOmdyb3VwOm9uY29sbGFwc2VcbiAgICAgKi9cbiAgICBvbkNvbGxhcHNlR3JvdXBNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25Db2xsYXBzZUdyb3VwTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5ncm91cC5vbmNvbGxhcHNlLCBlKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdyb3VwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Group.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getLogger(\"editor-group\");\n\n/**\n * @classdesc\n *\n * MapBox group management\n *\n * @constructor\n * @alias ol.style.editor.Group\n * @param {Object} options - options for function call.\n * @example\n * var group = new Group ({\n * title : \"MyGroup\",\n * collapse : true, // plier/deplier\n * target : ...\n * });\n * group.add();\n * group.add();\n */\nvar Group = /*#__PURE__*/function () {\n function Group(options) {\n _classCallCheck(this, Group);\n logger.trace(\"[constructor] Group\", options);\n\n // options\n this.options = options || {\n // default...\n };\n if (!(this instanceof Group)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Group, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.title) {\n // cf. summary\n this.options.title = \"Détails du groupe...\";\n }\n\n // plier par defaut\n if (typeof this.options.collapse === \"undefined\") {\n this.options.collapse = true;\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxGroupTarget\",\n container: \"GPEditorMapBoxGroupContainer\",\n details: \"GPEditorMapBoxGroupDetails\",\n summary: \"GPEditorMapBoxGroupSummary\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
...
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // FIXME pas compatible IE !\n // https://caniuse.com/#search=details\n // cf. https://css-tricks.com/quick-reminder-that-details-summary-is-the-easiest-way-ever-to-make-an-accordion/\n var details = document.createElement(\"details\");\n details.className = this.name.details;\n details.open = !this.options.collapse;\n div.appendChild(details);\n var summary = document.createElement(\"summary\");\n summary.className = this.name.summary;\n summary.innerHTML = this.options.title;\n details.appendChild(summary);\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n }\n\n /**\n * Set display container (DOM)\n *\n * @param {Boolean} display - show/hidden container\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n var nodes = this.container.childNodes;\n if (nodes.length) {\n // retourne le noeud \"details\" !\n return nodes[0];\n }\n // sinon le container principal\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form\n *\n * NOT USED !\n * @param {Object} e - HTMLElement\n * @private\n * @fires Group#editor:group:oncollapse\n */\n }, {\n key: \"onCollapseGroupMapBox\",\n value: function onCollapseGroupMapBox(e) {\n logger.trace(\"onCollapseGroupMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].group.oncollapse, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Group);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9Hcm91cC5qcz8wNGQ1Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkdyb3VwIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInRyYWNlIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJ0YXJnZXQiLCJ0aXRsZSIsImNvbGxhcHNlIiwiY29udGFpbmVyIiwibmFtZSIsImRldGFpbHMiLCJzdW1tYXJ5IiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwib3BlbiIsImFwcGVuZENoaWxkIiwiaW5uZXJIVE1MIiwiYWRkIiwiZ2V0RWxlbWVudEJ5SWQiLCJub2RlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkaXNwbGF5Iiwic3R5bGUiLCJnZXRDb250YWluZXIiLCJub2RlcyIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJvbkNvbGxhcHNlR3JvdXBNYXBCb3giLCJlIiwiZWRpdG9ySUQiLCJkYXRhIiwiRXZlbnRCdXMiLCJkaXNwYXRjaCIsIkV2ZW50RWRpdG9yIiwiZ3JvdXAiLCJvbmNvbGxhcHNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ3lCO0FBRTNELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGNBQWMsQ0FBQzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSxJQWlCTUMsS0FBSztFQUVQLFNBQUFBLE1BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLEtBQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FB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Q0E7RUFQSTtJQUFBTixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBMkIsc0JBQXVCQyxDQUFDLEVBQUU7TUFDdEJ4QyxNQUFNLENBQUNNLEtBQUssQ0FBQyx1QkFBdUIsRUFBRWtDLENBQUMsQ0FBQztNQUN4Q0EsQ0FBQyxDQUFDQyxRQUFRLEdBQUcsSUFBSSxDQUFDNUIsRUFBRTtNQUNwQjJCLENBQUMsQ0FBQ0UsSUFBSSxHQUFHLElBQUksQ0FBQ3RDLE9BQU87TUFDckJ1QyxpREFBUSxDQUFDQyxRQUFRLENBQUNDLDhDQUFXLENBQUNDLEtBQUssQ0FBQ0MsVUFBVSxFQUFFUCxDQUFDLENBQUM7SUFDdEQ7RUFBQztBQUFBO0FBRUo7QUFFY3JDLG9FQUFLIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRWRpdG9yL0dyb3VwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJlZGl0b3ItZ3JvdXBcIik7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICpcbiAqIE1hcEJveCBncm91cCBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLkdyb3VwXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZ3JvdXAgPSBuZXcgR3JvdXAgKHtcbiAqICAgICAgdGl0bGUgOiBcIk15R3JvdXBcIixcbiAqICAgICAgY29sbGFwc2UgOiB0cnVlLCAvLyBwbGllci9kZXBsaWVyXG4gKiAgICAgIHRhcmdldCA6IC4uLlxuICogICB9KTtcbiAqICAgZ3JvdXAuYWRkKCk7XG4gKiAgIGdyb3VwLmFkZCgpO1xuICovXG5jbGFzcyBHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIEdyb3VwXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdyb3VwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkVSUk9SIENMQVNTX0NPTlNUUlVDVE9SXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIHRoaXMuX2luaXRDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pbml0aWFsaXplICgpIHtcbiAgICAgICAgLy8gdW5pcXVlIGVkaXRvciBpZCAob3B0aW9uYWwhKVxuICAgICAgICB0aGlzLmlkID0gdGhpcy5vcHRpb25zLmlkIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBjZi4gYWRkKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRpdGxlKSB7XG4gICAgICAgICAgICAvLyBjZi4gc3VtbWFyeVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gXCJEw6l0YWlscyBkdSBncm91cGUuLi5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBsaWVyIHBhciBkZWZhdXRcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuY29sbGFwc2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hHcm91cFRhcmdldFwiLFxuICAgICAgICAgICAgY29udGFpbmVyIDogXCJHUEVkaXRvck1hcEJveEdyb3VwQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBkZXRhaWxzIDogXCJHUEVkaXRvck1hcEJveEdyb3VwRGV0YWlsc1wiLFxuICAgICAgICAgICAgc3VtbWFyeSA6IFwiR1BFZGl0b3JNYXBCb3hHcm91cFN1bW1hcnlcIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyYXBoaWNhbCByZW5kZXJpbmcgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94R3JvdXBDb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICAvLyBGSVhNRSBwYXMgY29tcGF0aWJsZSBJRSAhXG4gICAgICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI3NlYXJjaD1kZXRhaWxzXG4gICAgICAgIC8vIGNmLiBodHRwczovL2Nzcy10cmlja3MuY29tL3F1aWNrLXJlbWluZGVyLXRoYXQtZGV0YWlscy1zdW1tYXJ5LWlzLXRoZS1lYXNpZXN0LXdheS1ldmVyLXRvLW1ha2UtYW4tYWNjb3JkaW9uL1xuICAgICAgICB2YXIgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkZXRhaWxzXCIpO1xuICAgICAgICBkZXRhaWxzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5kZXRhaWxzO1xuICAgICAgICBkZXRhaWxzLm9wZW4gPSAhdGhpcy5vcHRpb25zLmNvbGxhcHNlO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGV0YWlscyk7XG5cbiAgICAgICAgdmFyIHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3VtbWFyeVwiKTtcbiAgICAgICAgc3VtbWFyeS5jbGFzc05hbWUgPSB0aGlzLm5hbWUuc3VtbWFyeTtcbiAgICAgICAgc3VtbWFyeS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIGRldGFpbHMuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7XG5cbiAgICAgICAgLy8gbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQWRkIGVsZW1lbnQgaW50byB0YXJnZXQgRE9NXG4gICAgICovXG4gICAgYWRkICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgZGl2LmlkID0gdGhpcy5uYW1lLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0gfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xuICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIChET00pXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzaG93L2hpZGRlbiBjb250YWluZXJcbiAgICAgKi9cbiAgICBkaXNwbGF5IChkaXNwbGF5KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAoZGlzcGxheSkgPyBcImZsZXhcIiA6IFwibm9uZVwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjb250YWluZXIgKERPTSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtET01FbGVtZW50fSBET00gZWxlbWVudFxuICAgICAqL1xuICAgIGdldENvbnRhaW5lciAoKSB7XG4gICAgICAgIHZhciBub2RlcyA9IHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXM7XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHJldG91cm5lIGxlIG5vZXVkIFwiZGV0YWlsc1wiICFcbiAgICAgICAgICAgIHJldHVybiBub2Rlc1swXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzaW5vbiBsZSBjb250YWluZXIgcHJpbmNpcGFsXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIHRvIGRvbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm1cbiAgICAgKlxuICAgICAqIE5PVCBVU0VEICFcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgR3JvdXAjZWRpdG9yOmdyb3VwOm9uY29sbGFwc2VcbiAgICAgKi9cbiAgICBvbkNvbGxhcHNlR3JvdXBNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25Db2xsYXBzZUdyb3VwTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5ncm91cC5vbmNvbGxhcHNlLCBlKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdyb3VwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Group.js\n"); /***/ }), @@ -2393,7 +2393,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var even /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Style__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Style */ \"./src/OpenLayers/Controls/Editor/Style.js\");\n/* harmony import */ var _Legend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Legend */ \"./src/OpenLayers/Controls/Editor/Legend.js\");\n/* harmony import */ var _Filter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Filter */ \"./src/OpenLayers/Controls/Editor/Filter.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getLogger(\"editor-layer\");\n\n/**\n * @classdesc\n *\n * MapBox filter management\n *\n * @constructor\n * @alias ol.style.editor.Layer\n * @param {Object} options - options for function call.\n * @example\n * var layers = new Layer ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * tools : {\n * \"visibility\" : true, // afficher l'icone de visibilité\n * \"icon\" : {\n * \"image\" : true, // afficher l'icone \"oeil\" (defaut) ou une checkbox\n * \"anchor\" : \"start\" | \"end\" // afficher l'icone au debut ou à la fin (defaut)\n * },\n * \"type\" : true, // afficher l'icone du type de geometrie\n * \"pin\" : true, // afficher l'icone de puce\n * \"remove\" : false, // TODO afficher l'icone de suppression\n * \"clone\" : false // TODO afficher l'icone de duplication\n * },\n * obj : {\n * \"id\": \"ocs - vegetation\", // MANDATORY\n * \"type\": \"fill\", // OPTIONAL\n * \"source\": \"pyramide_proto\", // OPTIONAL\n * \"source-layer\": \"ocs_vegetation_surf\" // OPTIONAL\n * }\n * });\n * layers.addLegend(oLegend);\n * layers.slotLegend();\n * layers.addStyle(oStyle);\n * layers.addFilter(oFilter);\n * layers.add();\n * layers.active(false);\n * layers.visibility(false);\n * layers.display(false);\n * layers.collapse();\n * EventBus.addEventListener(\"editor:layer:onclickvisibility\", function (e) {\n * // e.target.data : options !\n * // e.target.editorID : id or null\n * }, this);\n */\nvar Layer = /*#__PURE__*/function () {\n function Layer(options) {\n _classCallCheck(this, Layer);\n logger.trace(\"[constructor] Layer\", options);\n\n // options\n this.options = options || {};\n if (!(this instanceof Layer)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n // ################################################################### //\n // ##################### private methods ############################# //\n // ################################################################### //\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Layer, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null; // null si le layer n'appartient pas à un editeur !\n\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.position) {\n this.options.position = 0;\n }\n var _toolsDefault = {\n visibility: true,\n icon: {\n image: true,\n anchor: \"end\"\n },\n type: true,\n pin: true,\n remove: false,\n // TODO\n clone: false // TODO\n };\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n var _objDefault = {\n id: \"\",\n type: \"\",\n // icone sur le type de geometrie\n source: \"\",\n \"source-layer\": \"\"\n };\n if (!this.options.obj) {\n this.options.obj = _objDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].mergeParams(this.options.obj, _objDefault, false);\n\n // legende intégrée\n this.bSlotLegend = false;\n\n // obj\n this.oFilter = null;\n this.oStyle = null;\n this.oLegend = null;\n\n // dom\n this.container = null;\n this.DomVisibility = null;\n this.DomToggle = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxLayerTarget\",\n container: \"GPEditorMapBoxLayerContainer\",\n containerlegend: \"GPEditorMapBoxLayerLegendContainer\",\n containertitle: \"GPEditorMapBoxLayerTitleContainer\",\n imagelabelinput: \"GPEditorMapBoxLayerImageInput\",\n imagelabel: \"GPEditorMapBoxLayerImageLabel\",\n typeimg: \"GPEditorMapBoxLayerTypeImage\",\n titleinput: \"GPEditorMapBoxLayerTitleInput\",\n titlelabel: \"GPEditorMapBoxLayerTitleLabel\",\n containertools: \"GPEditorMapBoxToolsContainer\",\n visibilityinput: \"GPEditorMapBoxToolsVisibilityInput\",\n visibilitylabel: \"GPEditorMapBoxToolsVisibilityLabel\",\n visibilityinputdisable: \"GPEditorMapBoxToolsVisibilityInputDisable\",\n visibilitylabeldisable: \"GPEditorMapBoxToolsVisibilityLabelDisable\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n * // >> Titre 1 |OOO| <- menu tools : visibility, clone, remove\n * // >> Titre 2 |OXX| <- affichage configurable (cf. options.tools)\n * // Event : clic sur le titre -> ex. affiche le menu des styles / filtres\n * // : clic visibility, clone, remove\n * // DOM :\n *
\n *
\n * \n * \n * \n * \n *
\n *
\n * \n * \n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var obj = this.options.obj;\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // title\n var divTitle = document.createElement(\"div\");\n divTitle.id = this.name.containertitle + \"-\" + this.options.position;\n divTitle.className = this.name.containertitle;\n\n // puce\n if (this.options.tools.pin) {\n // Optionnel !\n // input\n var inputImage = document.createElement(\"input\");\n inputImage.id = this.name.imagelabelinput + \"-\" + this.options.position;\n inputImage.className = this.name.imagelabelinput;\n inputImage.type = \"checkbox\";\n divTitle.appendChild(inputImage);\n // puce\n var labelImage = document.createElement(\"label\");\n labelImage.className = this.name.imagelabel;\n labelImage.htmlFor = inputImage.id;\n if (labelImage.addEventListener) {\n labelImage.addEventListener(\"click\", function (e) {\n self.onClickLayerMapBox(e);\n });\n } else if (labelImage.attachEvent) {\n labelImage.attachEvent(\"onclick\", function (e) {\n self.onClickLayerMapBox(e);\n });\n }\n divTitle.appendChild(labelImage);\n }\n\n // tools :\n // visibility, (remove, clone)\n var _addTools = function _addTools() {\n var divTools = document.createElement(\"div\");\n divTools.id = this.name.containertools + \"-\" + this.options.position;\n divTools.className = this.name.containertools;\n\n // visibility\n if (this.options.tools.visibility) {\n var inputTools = document.createElement(\"input\");\n inputTools.id = this.name.visibilityinput + \"-\" + this.options.position;\n inputTools.className = this.options.tools.icon.image ? this.name.visibilityinput : this.name.visibilityinputdisable;\n inputTools.type = \"checkbox\";\n inputTools.checked = \"checked\"; // par défaut, à modifier via visibility(true|false) !\n\n // event for visibility change\n if (inputTools.addEventListener) {\n inputTools.addEventListener(\"click\", function (e) {\n self.onVisibilityLayerMapBox(e);\n });\n } else if (inputTools.attachEvent) {\n // internet explorer\n inputTools.attachEvent(\"onclick\", function (e) {\n self.onVisibilityLayerMapBox(e);\n });\n }\n divTools.appendChild(inputTools);\n // enregistrement utile pour la méthode : visibility()\n this.DomVisibility = inputTools;\n var labelTools = document.createElement(\"label\");\n labelTools.htmlFor = this.name.visibilityinput + \"-\" + this.options.position;\n labelTools.id = this.name.visibilitylabel + \"-\" + this.options.position;\n labelTools.className = this.options.tools.icon.image ? this.name.visibilitylabel : this.name.visibilitylabeldisable;\n labelTools.title = \"Afficher/masquer la couche\";\n divTools.appendChild(labelTools);\n div.appendChild(divTools);\n }\n\n // clone\n if (this.options.tools.clone) {\n // TODO...\n logger.warn(\"Dom for tools clone, it's not yet implemented !\");\n }\n\n // remove\n if (this.options.tools.remove) {\n // TODO...\n logger.warn(\"Dom for tools remove, it's not yet implemented !\");\n }\n };\n\n // ajout des outils au debut du composant\n if (this.options.tools.icon.anchor === \"start\") {\n _addTools.apply(this);\n }\n\n // type\n if (this.options.tools.type && obj.type) {\n // Optionnel !\n var imgType = document.createElement(\"img\");\n imgType.className = this.name.typeimg;\n // FIXME il faudrait faire la difference entre :\n // - icone uniquement : SYMBOL-ICON\n // - texte uniquement : SYMBOL-TEXT\n // - les 2 : SYMBOL\n // Mais il nous faut les styles complets (paint & layout)\n // pour determiner les 3 types !\n switch (obj.type.toUpperCase()) {\n case \"SYMBOL-ICON\":\n // not used !\n imgType.style[\"background-position\"] = \"0px 0\";\n break;\n case \"SYMBOL-TEXT\":\n // not used !\n imgType.style[\"background-position\"] = \"-194px 0\";\n break;\n case \"SYMBOL\":\n imgType.style[\"background-position\"] = \"-84px 0\";\n break;\n case \"LINE\":\n imgType.style[\"background-position\"] = \"-28px 0\";\n break;\n case \"FILL\":\n imgType.style[\"background-position\"] = \"-56px 0\";\n break;\n case \"BACKGROUND\":\n imgType.style[\"background-position\"] = \"-140px 0\";\n break;\n case \"CIRCLE\":\n imgType.style[\"background-position\"] = \"-168px 0\";\n break;\n default:\n // type inconnu ou non pris en charge ou par defaut\n imgType.style[\"background-position\"] = \"-112px 0\";\n }\n divTitle.appendChild(imgType);\n }\n\n // container legend (empty)\n var divLegend = document.createElement(\"div\");\n divLegend.id = this.name.containerlegend + \"-\" + this.options.position;\n divLegend.className = this.name.containerlegend;\n divTitle.appendChild(divLegend);\n\n // input\n var inputTitle = document.createElement(\"input\");\n inputTitle.id = this.name.titleinput + \"-\" + this.options.position;\n inputTitle.className = this.name.titleinput;\n inputTitle.type = \"checkbox\";\n divTitle.appendChild(inputTitle);\n\n // label for\n var labelTitle = document.createElement(\"label\");\n labelTitle.className = this.name.titlelabel;\n labelTitle.htmlFor = inputTitle.id;\n labelTitle.innerHTML = obj[\"id\"] || obj[\"source-layer\"] || obj[\"source\"];\n labelTitle.title = obj[\"source-layer\"] || obj[\"source\"] || obj[\"id\"];\n if (labelTitle.addEventListener) {\n labelTitle.addEventListener(\"click\", function (e) {\n self.onClickLayerMapBox(e);\n });\n } else if (labelTitle.attachEvent) {\n labelTitle.attachEvent(\"onclick\", function (e) {\n self.onClickLayerMapBox(e);\n });\n }\n divTitle.appendChild(labelTitle);\n // enregistrement utile pour la méthode : collapse()\n this.DomToggle = labelTitle;\n div.appendChild(divTitle);\n\n // ajout des outils au fin du composant\n if (this.options.tools.icon.anchor === \"end\") {\n _addTools.apply(this);\n }\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Layer instance\n */\n }, {\n key: \"add\",\n value: function add() {\n logger.trace(\"add()\");\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Add style in the submenu\n *\n * @param {Object} style - style object\n */\n }, {\n key: \"addStyle\",\n value: function addStyle(style) {\n logger.trace(\"addStyle()\", style);\n if (style && _typeof(style) === \"object\" && style instanceof _Style__WEBPACK_IMPORTED_MODULE_2__[\"default\"]) {\n this.oStyle = style;\n this.oStyle.display(false); // par defaut !\n }\n }\n\n /**\n * Add filter in the submenu\n *\n * @param {Object} filter - filter object\n */\n }, {\n key: \"addFilter\",\n value: function addFilter(filter) {\n logger.trace(\"addFilter()\", filter);\n if (filter && _typeof(filter) === \"object\" && filter instanceof _Filter__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n this.oFilter = filter;\n this.oFilter.display(false); // par defaut !\n }\n }\n\n /**\n * Add Legend in the submenu\n *\n * @param {Object} legend - legend object\n */\n }, {\n key: \"addLegend\",\n value: function addLegend(legend) {\n logger.trace(\"addLegend()\", legend);\n if (legend && _typeof(legend) === \"object\" && legend instanceof _Legend__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n this.oLegend = legend;\n this.oLegend.display(false); // par defaut !\n }\n }\n\n /**\n * Integrate Legend to the layer container\n */\n }, {\n key: \"slotLegend\",\n value: function slotLegend() {\n // cas particulier :\n // on souhaite intégrer une partie de la legende dans le container du layer.\n var legend = this.oLegend;\n if (legend) {\n // FIXME c'est pourri...\n var node = null;\n var nodesLvl1 = this.container.childNodes;\n if (nodesLvl1.length) {\n // selon où se situe l'icone de visibilité : au debut ou à la fin...\n var idx = this.options.tools.icon.anchor === \"start\" ? 1 : 0;\n var nodesLvl2 = nodesLvl1[idx].childNodes;\n // on recherche le container de la legende\n for (var i = 0; i < nodesLvl2.length; i++) {\n var curnode = nodesLvl2[i];\n if (curnode.id.indexOf(this.name.containerlegend) !== -1) {\n node = curnode;\n }\n }\n }\n if (node) {\n var render = legend.getRenderContainer();\n if (render) {\n node.appendChild(render);\n // legende intégrée\n this.bSlotLegend = true;\n }\n }\n }\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Set visibility or get\n *\n * @param {Boolean} display - set visibility or undefined to get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"visibility\",\n value: function visibility(display) {\n logger.trace(\"visibility()\", display);\n if (!this.options.tools.visibility) {\n return;\n }\n if (typeof display !== \"undefined\") {\n this.DomVisibility.checked = display ? \"checked\" : \"\";\n }\n return this.DomVisibility.checked;\n }\n\n /**\n * Collapse a layer panel (event)\n */\n }, {\n key: \"collapse\",\n value: function collapse() {\n logger.trace(\"collapse()\");\n this.DomToggle.click();\n }\n\n /**\n * Click on visibility icon (event)\n */\n }, {\n key: \"visible\",\n value: function visible() {\n logger.trace(\"visible()\");\n if (!this.options.tools.visibility) {\n return;\n }\n this.DomVisibility.click();\n }\n\n /**\n * Set collapse or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n var checked = document.getElementById(this.DomToggle.htmlFor).checked;\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"inline-flex\" : \"none\";\n if (this.oStyle) {\n this.oStyle.display(_display && checked);\n }\n if (this.oFilter) {\n this.oFilter.display(_display && checked);\n }\n if (this.oLegend) {\n this.oLegend.display(_display && checked);\n }\n }\n return checked;\n }\n\n /**\n * Set disabled/enabled status or get\n *\n * @param {Boolean} active - disable/enable layer interaction or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"active\",\n value: function active(_active) {\n logger.trace(\"active()\", _active);\n if (typeof _active !== \"undefined\") {\n this.container.className = _active ? this.name.container : this.name.container + \" disabled\";\n }\n return this.container.className === this.name.container;\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n }, {\n key: \"onClickLayerMapBox\",\n value: function onClickLayerMapBox(e) {\n logger.trace(\"onClickLayerMapBox\", e);\n var id = e.target.htmlFor.substring(e.target.htmlFor.indexOf(\"-\"));\n var checked = document.getElementById(e.target.htmlFor).checked;\n\n // gestion des inputs\n if (e.target.htmlFor === this.name.imagelabelinput + id) {\n document.getElementById(this.name.titleinput + id).checked = !checked;\n }\n if (e.target.htmlFor === this.name.titleinput + id) {\n // si options.pin:false, ce DOM n'existe pas !\n if (document.getElementById(this.name.imagelabelinput + id)) {\n document.getElementById(this.name.imagelabelinput + id).checked = !checked;\n }\n }\n\n // ouverture du panneau des styles / filtres\n if (this.oStyle) {\n this.oStyle.display(!checked);\n }\n if (this.oFilter) {\n this.oFilter.display(!checked);\n }\n // attention,\n // si la legende est non editable, elle ne se trouve pas dans le sous menu !\n if (this.oLegend && this.oLegend.isEditable()) {\n this.oLegend.display(!checked);\n }\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Layer#editor:layer:onclickvisibility\n */\n }, {\n key: \"onVisibilityLayerMapBox\",\n value: function onVisibilityLayerMapBox(e) {\n logger.trace(\"onVisibilityLayerMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].layer.onclickvisibility, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Layer#editor:layer:onclickclone\n */\n }, {\n key: \"onCloneLayerMapBox\",\n value: function onCloneLayerMapBox(e) {\n logger.trace(\"onCloneLayerMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].layer.onclickclone, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Layer#editor:layer:onclickremove\n */\n }, {\n key: \"onRemoveLayerMapBox\",\n value: function onRemoveLayerMapBox(e) {\n logger.trace(\"onRemoveLayerMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].layer.onclickremove, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Layer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9MYXllci5qcz9mNjZmIl0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkxheWVyIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInRyYWNlIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsIl90b29sc0RlZmF1bHQiLCJ2aXNpYmlsaXR5IiwiaWNvbiIsImltYWdlIiwiYW5jaG9yIiwidHlwZSIsInBpbiIsInJlbW92ZSIsImNsb25lIiwidG9vbHMiLCJVdGlscyIsIm1lcmdlUGFyYW1zIiwiX29iakRlZmF1bHQiLCJzb3VyY2UiLCJvYmoiLCJiU2xvdExlZ2VuZCIsIm9GaWx0ZXIiLCJvU3R5bGUiLCJvTGVnZW5kIiwiY29udGFpbmVyIiwiRG9tVmlzaWJpbGl0eSIsIkRvbVRvZ2dsZSIsIm5hbWUiLCJjb250YWluZXJsZWdlbmQiLCJjb250YWluZXJ0aXRsZSIsImltYWdlbGFiZWxpbnB1dCIsImltYWdlbGFiZWwiLCJ0eXBlaW1nIiwidGl0bGVpbnB1dCIsInRpdGxlbGFiZWwiLCJjb250YWluZXJ0b29scyIsInZpc2liaWxpdHlpbnB1dCIsInZpc2liaWxpdHlsYWJlbCIsInZpc2liaWxpdHlpbnB1dGRpc2FibGUiLCJ2aXNpYmlsaXR5bGFiZWxkaXNhYmxlIiwic2VsZiIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImRpdlRpdGxlIiwiaW5wdXRJbWFnZSIsImFwcGVuZENoaWxkIiwibGFiZWxJbWFnZSIsImh0bWxGb3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsIm9uQ2xpY2tMYXllck1hcEJveCIsImF0dGFjaEV2ZW50IiwiX2FkZFRvb2xzIiwiZGl2VG9vbHMiLCJpbnB1dFRvb2xzIiwiY2hlY2tlZCIsIm9uVmlzaWJpbGl0eUxheWVyTWFwQm94IiwibGFiZWxUb29scyIsInRpdGxlIiwid2FybiIsImFwcGx5IiwiaW1nVHlwZSIsInRvVXBwZXJDYXNlIiwic3R5bGUiLCJkaXZMZWdlbmQiLCJpbnB1dFRpdGxlIiwibGFiZWxUaXRsZSIsImlubmVySFRNTCIsImFkZCIsImdldEVsZW1lbnRCeUlkIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYWRkU3R5bGUiLCJfdHlwZW9mIiwiU3R5bGUiLCJkaXNwbGF5IiwiYWRkRmlsdGVyIiwiZmlsdGVyIiwiRmlsdGVyIiwiYWRkTGVnZW5kIiwibGVnZW5kIiwiTGVnZW5kIiwic2xvdExlZ2VuZCIsIm5vZGVzTHZsMSIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJpZHgiLCJub2Rlc0x2bDIiLCJpIiwiY3Vybm9kZSIsImluZGV4T2YiLCJyZW5kZXIiLCJnZXRSZW5kZXJDb250YWluZXIiLCJjb2xsYXBzZSIsImNsaWNrIiwidmlzaWJsZSIsImFjdGl2ZSIsImdldENvbnRhaW5lciIsInN1YnN0cmluZyIsImlzRWRpdGFibGUiLCJlZGl0b3JJRCIsImRhdGEiLCJFdmVudEJ1cyIsImRpc3BhdGNoIiwiRXZlbnRFZGl0b3IiLCJsYXllciIsIm9uY2xpY2t2aXNpYmlsaXR5Iiwib25DbG9uZUxheWVyTWFwQm94Iiwib25jbGlja2Nsb25lIiwib25SZW1vdmVMYXllck1hcEJveCIsIm9uY2xpY2tyZW1vdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ047QUFDRTtBQUNBO0FBQ1k7QUFDaUI7QUFFM0QsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsY0FBYyxDQUFDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0MsUUFBUSxDQUFDQyw4Q0FBVyxDQUFDQyxLQUFLLENBQUNHLFlBQVksRUFBRTVELENBQUMsQ0FBQztJQUN4RDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFuRCxHQUFBO0lBQUFDLEtBQUEsRUFVQSxTQUFBK0csb0JBQXFCN0QsQ0FBQyxFQUFFO01BQ3BCOUQsTUFBTSxDQUFDTSxLQUFLLENBQUMscUJBQXFCLEVBQUV3RCxDQUFDLENBQUM7TUFDdENBLENBQUMsQ0FBQ29ELFFBQVEsR0FBRyxJQUFJLENBQUNyRyxFQUFFO01BQ3BCaUQsQ0FBQyxDQUFDcUQsSUFBSSxHQUFHLElBQUksQ0FBQy9HLE9BQU87TUFDckJnSCxpREFBUSxDQUFDQyxRQUFRLENBQUNDLDhDQUFXLENBQUNDLEtBQUssQ0FBQ0ssYUFBYSxFQUFFOUQsQ0FBQyxDQUFDO0lBQ3pEO0VBQUM7QUFBQTtBQUVKO0FBRWMzRCxvRUFBSyIsImZpbGUiOiIuL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9MYXllci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEJ1cyBmcm9tIFwiZXZlbnRidXNqc1wiO1xuaW1wb3J0IEV2ZW50RWRpdG9yIGZyb20gXCIuL0V2ZW50XCI7XG5pbXBvcnQgU3R5bGUgZnJvbSBcIi4vU3R5bGVcIjtcbmltcG9ydCBMZWdlbmQgZnJvbSBcIi4vTGVnZW5kXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCIuL0ZpbHRlclwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJlZGl0b3ItbGF5ZXJcIik7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICpcbiAqIE1hcEJveCBmaWx0ZXIgbWFuYWdlbWVudFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnN0eWxlLmVkaXRvci5MYXllclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGxheWVycyA9IG5ldyBMYXllciAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHBvc2l0aW9uIDogMSwgLy8gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gKHVuaXF1ZSAhKVxuICogICAgICB0b29scyA6IHtcbiAqICAgICAgICAgIFwidmlzaWJpbGl0eVwiIDogdHJ1ZSwgLy8gYWZmaWNoZXIgbCdpY29uZSBkZSB2aXNpYmlsaXTDqVxuICogICAgICAgICAgXCJpY29uXCIgOiB7XG4gKiAgICAgICAgICAgICAgXCJpbWFnZVwiIDogdHJ1ZSwgLy8gYWZmaWNoZXIgbCdpY29uZSBcIm9laWxcIiAoZGVmYXV0KSBvdSB1bmUgY2hlY2tib3hcbiAqICAgICAgICAgICAgICBcImFuY2hvclwiIDogXCJzdGFydFwiIHwgXCJlbmRcIiAgLy8gYWZmaWNoZXIgbCdpY29uZSBhdSBkZWJ1dCBvdSDDoCBsYSBmaW4gKGRlZmF1dClcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcInR5cGVcIiA6IHRydWUsICAgICAgIC8vIGFmZmljaGVyIGwnaWNvbmUgZHUgdHlwZSBkZSBnZW9tZXRyaWVcbiAqICAgICAgICAgIFwicGluXCIgOiB0cnVlLCAgICAgICAgLy8gYWZmaWNoZXIgbCdpY29uZSBkZSBwdWNlXG4gKiAgICAgICAgICBcInJlbW92ZVwiIDogZmFsc2UsICAgIC8vIFRPRE8gYWZmaWNoZXIgbCdpY29uZSBkZSBzdXBwcmVzc2lvblxuICogICAgICAgICAgXCJjbG9uZVwiIDogZmFsc2UgICAgICAvLyBUT0RPIGFmZmljaGVyIGwnaWNvbmUgZGUgZHVwbGljYXRpb25cbiAqICAgICAgfSxcbiAqICAgICAgb2JqIDoge1xuICogICAgICAgICAgXCJpZFwiOiBcIm9jcyAtIHZlZ2V0YXRpb25cIiwgLy8gTUFOREFUT1JZXG4gKiAgICAgICAgICBcInR5cGVcIjogXCJmaWxsXCIsIC8vIE9QVElPTkFMXG4gKiAgICAgICAgICBcInNvdXJjZVwiOiBcInB5cmFtaWRlX3Byb3RvXCIsIC8vIE9QVElPTkFMXG4gKiAgICAgICAgICBcInNvdXJjZS1sYXllclwiOiBcIm9jc192ZWdldGF0aW9uX3N1cmZcIiAvLyBPUFRJT05BTFxuICogICAgICB9XG4gKiAgIH0pO1xuICogIGxheWVycy5hZGRMZWdlbmQob0xlZ2VuZCk7XG4gKiAgbGF5ZXJzLnNsb3RMZWdlbmQoKTtcbiAqICBsYXllcnMuYWRkU3R5bGUob1N0eWxlKTtcbiAqICBsYXllcnMuYWRkRmlsdGVyKG9GaWx0ZXIpO1xuICogIGxheWVycy5hZGQoKTtcbiAqICBsYXllcnMuYWN0aXZlKGZhbHNlKTtcbiAqICBsYXllcnMudmlzaWJpbGl0eShmYWxzZSk7XG4gKiAgbGF5ZXJzLmRpc3BsYXkoZmFsc2UpO1xuICogIGxheWVycy5jb2xsYXBzZSgpO1xuICogIEV2ZW50QnVzLmFkZEV2ZW50TGlzdGVuZXIoXCJlZGl0b3I6bGF5ZXI6b25jbGlja3Zpc2liaWxpdHlcIiwgZnVuY3Rpb24gKGUpIHtcbiAqICAgICAvLyBlLnRhcmdldC5kYXRhIDogb3B0aW9ucyAhXG4gKiAgICAgLy8gZS50YXJnZXQuZWRpdG9ySUQgOiBpZCBvciBudWxsXG4gKiAgIH0sIHRoaXMpO1xuICovXG5jbGFzcyBMYXllciB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIExheWVyXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGF5ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHJpdmF0ZSBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDsgLy8gbnVsbCBzaSBsZSBsYXllciBuJ2FwcGFydGllbnQgcGFzIMOgIHVuIGVkaXRldXIgIVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gY2YuIGFkZCgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfdG9vbHNEZWZhdWx0ID0ge1xuICAgICAgICAgICAgdmlzaWJpbGl0eSA6IHRydWUsXG4gICAgICAgICAgICBpY29uIDoge1xuICAgICAgICAgICAgICAgIGltYWdlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhbmNob3IgOiBcImVuZFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZSA6IHRydWUsXG4gICAgICAgICAgICBwaW4gOiB0cnVlLFxuICAgICAgICAgICAgcmVtb3ZlIDogZmFsc2UsIC8vIFRPRE9cbiAgICAgICAgICAgIGNsb25lIDogZmFsc2UgLy8gVE9ET1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbHMgPSBfdG9vbHNEZWZhdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMubWVyZ2VQYXJhbXModGhpcy5vcHRpb25zLnRvb2xzLCBfdG9vbHNEZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAgICAgdmFyIF9vYmpEZWZhdWx0ID0ge1xuICAgICAgICAgICAgaWQgOiBcIlwiLFxuICAgICAgICAgICAgdHlwZSA6IFwiXCIsIC8vIGljb25lIHN1ciBsZSB0eXBlIGRlIGdlb21ldHJpZVxuICAgICAgICAgICAgc291cmNlIDogXCJcIixcbiAgICAgICAgICAgIFwic291cmNlLWxheWVyXCIgOiBcIlwiXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub2JqKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub2JqID0gX29iakRlZmF1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy5tZXJnZVBhcmFtcyh0aGlzLm9wdGlvbnMub2JqLCBfb2JqRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIC8vIGxlZ2VuZGUgaW50w6lncsOpZVxuICAgICAgICB0aGlzLmJTbG90TGVnZW5kID0gZmFsc2U7XG5cbiAgICAgICAgLy8gb2JqXG4gICAgICAgIHRoaXMub0ZpbHRlciA9IG51bGw7XG4gICAgICAgIHRoaXMub1N0eWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vTGVnZW5kID0gbnVsbDtcblxuICAgICAgICAvLyBkb21cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICB0aGlzLkRvbVZpc2liaWxpdHkgPSBudWxsO1xuICAgICAgICB0aGlzLkRvbVRvZ2dsZSA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllclRhcmdldFwiLFxuICAgICAgICAgICAgY29udGFpbmVyIDogXCJHUEVkaXRvck1hcEJveExheWVyQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJsZWdlbmQgOiBcIkdQRWRpdG9yTWFwQm94TGF5ZXJMZWdlbmRDb250YWluZXJcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRpdGxlIDogXCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVDb250YWluZXJcIixcbiAgICAgICAgICAgIGltYWdlbGFiZWxpbnB1dCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllckltYWdlSW5wdXRcIixcbiAgICAgICAgICAgIGltYWdlbGFiZWwgOiBcIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUxhYmVsXCIsXG4gICAgICAgICAgICB0eXBlaW1nIDogXCJHUEVkaXRvck1hcEJveExheWVyVHlwZUltYWdlXCIsXG4gICAgICAgICAgICB0aXRsZWlucHV0IDogXCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVJbnB1dFwiLFxuICAgICAgICAgICAgdGl0bGVsYWJlbCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlTGFiZWxcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzIDogXCJHUEVkaXRvck1hcEJveFRvb2xzQ29udGFpbmVyXCIsXG4gICAgICAgICAgICB2aXNpYmlsaXR5aW5wdXQgOiBcIkdQRWRpdG9yTWFwQm94VG9vbHNWaXNpYmlsaXR5SW5wdXRcIixcbiAgICAgICAgICAgIHZpc2liaWxpdHlsYWJlbCA6IFwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlMYWJlbFwiLFxuICAgICAgICAgICAgdmlzaWJpbGl0eWlucHV0ZGlzYWJsZSA6IFwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dERpc2FibGVcIixcbiAgICAgICAgICAgIHZpc2liaWxpdHlsYWJlbGRpc2FibGUgOiBcIkdQRWRpdG9yTWFwQm94VG9vbHNWaXNpYmlsaXR5TGFiZWxEaXNhYmxlXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vID4+IFRpdHJlIDEgICAgICAgICAgfE9PT3wgPC0gbWVudSB0b29scyA6IHZpc2liaWxpdHksIGNsb25lLCByZW1vdmVcbiAgICAgKiAvLyA+PiBUaXRyZSAyICAgICAgICAgIHxPWFh8IDwtIGFmZmljaGFnZSBjb25maWd1cmFibGUgKGNmLiBvcHRpb25zLnRvb2xzKVxuICAgICAqIC8vIEV2ZW50IDogY2xpYyBzdXIgbGUgdGl0cmUgLT4gZXguIGFmZmljaGUgbGUgbWVudSBkZXMgc3R5bGVzIC8gZmlsdHJlc1xuICAgICAqIC8vICAgICAgIDogY2xpYyB2aXNpYmlsaXR5LCBjbG9uZSwgcmVtb3ZlXG4gICAgICogLy8gRE9NIDpcbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyQ29udGFpbmVyXCI+XG4gICAgICogICAgICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUNvbnRhaW5lci00NVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlQ29udGFpbmVyXCI+XG4gICAgICogICAgICAgICAgICAgIDxpbnB1dCBpZD1cIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUlucHV0LTQ1XCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVySW1hZ2VJbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiPlxuICAgICAqICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVySW1hZ2VMYWJlbFwiIGZvcj1cIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUlucHV0LTQ1XCI+PC9sYWJlbD5cbiAgICAgKiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlSW5wdXQtNDVcIiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUlucHV0XCIgdHlwZT1cImNoZWNrYm94XCI+XG4gICAgICogICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUxhYmVsXCIgZm9yPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlSW5wdXQtNDVcIiB0aXRsZT1cIi4uLlwiPi4uLjwvbGFiZWw+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94VG9vbHNDb250YWluZXItNDVcIiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94VG9vbHNDb250YWluZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dC00NVwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dFwiPlxuICAgICAqICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dC00NVwiIGlkPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlMYWJlbC00NVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlMYWJlbFwiIHRpdGxlPVwiQWZmaWNoZXIvbWFzcXVlciBsYSBjb3VjaGVcIj48L2xhYmVsPlxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9kaXY+XG4gICAgICovXG4gICAgX2luaXRDb250YWluZXIgKCkge1xuICAgICAgICAvLyBjb250ZXh0ZVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9iaiA9IHRoaXMub3B0aW9ucy5vYmo7XG5cbiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVyO1xuXG4gICAgICAgIC8vIHRpdGxlXG4gICAgICAgIHZhciBkaXZUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdlRpdGxlLmlkID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRpdGxlICsgXCItXCIgKyB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIGRpdlRpdGxlLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0aXRsZTtcblxuICAgICAgICAvLyBwdWNlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMucGluKSB7IC8vIE9wdGlvbm5lbCAhXG4gICAgICAgICAgICAvLyBpbnB1dFxuICAgICAgICAgICAgdmFyIGlucHV0SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICBpbnB1dEltYWdlLmlkID0gdGhpcy5uYW1lLmltYWdlbGFiZWxpbnB1dCArIFwiLVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICAgICAgaW5wdXRJbWFnZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUuaW1hZ2VsYWJlbGlucHV0O1xuICAgICAgICAgICAgaW5wdXRJbWFnZS50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICAgICAgZGl2VGl0bGUuYXBwZW5kQ2hpbGQoaW5wdXRJbWFnZSk7XG4gICAgICAgICAgICAvLyBwdWNlXG4gICAgICAgICAgICB2YXIgbGFiZWxJbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxhYmVsSW1hZ2UuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmltYWdlbGFiZWw7XG4gICAgICAgICAgICBsYWJlbEltYWdlLmh0bWxGb3IgPSBpbnB1dEltYWdlLmlkO1xuICAgICAgICAgICAgaWYgKGxhYmVsSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGxhYmVsSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja0xheWVyTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYWJlbEltYWdlLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbGFiZWxJbWFnZS5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrTGF5ZXJNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXZUaXRsZS5hcHBlbmRDaGlsZChsYWJlbEltYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvb2xzIDpcbiAgICAgICAgLy8gdmlzaWJpbGl0eSwgKHJlbW92ZSwgY2xvbmUpXG4gICAgICAgIHZhciBfYWRkVG9vbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGl2VG9vbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZGl2VG9vbHMuaWQgPSB0aGlzLm5hbWUuY29udGFpbmVydG9vbHMgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgIGRpdlRvb2xzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0b29scztcblxuICAgICAgICAgICAgLy8gdmlzaWJpbGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0VG9vbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgaW5wdXRUb29scy5pZCA9IHRoaXMubmFtZS52aXNpYmlsaXR5aW5wdXQgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBpbnB1dFRvb2xzLmNsYXNzTmFtZSA9ICh0aGlzLm9wdGlvbnMudG9vbHMuaWNvbi5pbWFnZSkgPyB0aGlzLm5hbWUudmlzaWJpbGl0eWlucHV0IDogdGhpcy5uYW1lLnZpc2liaWxpdHlpbnB1dGRpc2FibGU7XG4gICAgICAgICAgICAgICAgaW5wdXRUb29scy50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICAgICAgICAgIGlucHV0VG9vbHMuY2hlY2tlZCA9IFwiY2hlY2tlZFwiOyAvLyBwYXIgZMOpZmF1dCwgw6AgbW9kaWZpZXIgdmlhIHZpc2liaWxpdHkodHJ1ZXxmYWxzZSkgIVxuXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQgZm9yIHZpc2liaWxpdHkgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VG9vbHMuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFRvb2xzLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vblZpc2liaWxpdHlMYXllck1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFRvb2xzLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGludGVybmV0IGV4cGxvcmVyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VG9vbHMuYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVmlzaWJpbGl0eUxheWVyTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGl2VG9vbHMuYXBwZW5kQ2hpbGQoaW5wdXRUb29scyk7XG4gICAgICAgICAgICAgICAgLy8gZW5yZWdpc3RyZW1lbnQgdXRpbGUgcG91ciBsYSBtw6l0aG9kZSA6IHZpc2liaWxpdHkoKVxuICAgICAgICAgICAgICAgIHRoaXMuRG9tVmlzaWJpbGl0eSA9IGlucHV0VG9vbHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGFiZWxUb29scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgICAgICBsYWJlbFRvb2xzLmh0bWxGb3IgPSB0aGlzLm5hbWUudmlzaWJpbGl0eWlucHV0ICsgXCItXCIgKyB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgICAgICAgICAgbGFiZWxUb29scy5pZCA9IHRoaXMubmFtZS52aXNpYmlsaXR5bGFiZWwgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBsYWJlbFRvb2xzLmNsYXNzTmFtZSA9ICh0aGlzLm9wdGlvbnMudG9vbHMuaWNvbi5pbWFnZSkgPyB0aGlzLm5hbWUudmlzaWJpbGl0eWxhYmVsIDogdGhpcy5uYW1lLnZpc2liaWxpdHlsYWJlbGRpc2FibGU7XG4gICAgICAgICAgICAgICAgbGFiZWxUb29scy50aXRsZSA9IFwiQWZmaWNoZXIvbWFzcXVlciBsYSBjb3VjaGVcIjtcbiAgICAgICAgICAgICAgICBkaXZUb29scy5hcHBlbmRDaGlsZChsYWJlbFRvb2xzKTtcblxuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkaXZUb29scyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNsb25lXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmNsb25lKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETy4uLlxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRG9tIGZvciB0b29scyBjbG9uZSwgaXQncyBub3QgeWV0IGltcGxlbWVudGVkICFcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5yZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPLi4uXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJEb20gZm9yIHRvb2xzIHJlbW92ZSwgaXQncyBub3QgeWV0IGltcGxlbWVudGVkICFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gYWpvdXQgZGVzIG91dGlscyBhdSBkZWJ1dCBkdSBjb21wb3NhbnRcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5pY29uLmFuY2hvciA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICBfYWRkVG9vbHMuYXBwbHkodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0eXBlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMudHlwZSAmJiBvYmoudHlwZSkgeyAvLyBPcHRpb25uZWwgIVxuICAgICAgICAgICAgdmFyIGltZ1R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgaW1nVHlwZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUudHlwZWltZztcbiAgICAgICAgICAgIC8vIEZJWE1FIGlsIGZhdWRyYWl0IGZhaXJlIGxhIGRpZmZlcmVuY2UgZW50cmUgOlxuICAgICAgICAgICAgLy8gLSBpY29uZSB1bmlxdWVtZW50IDogU1lNQk9MLUlDT05cbiAgICAgICAgICAgIC8vIC0gdGV4dGUgdW5pcXVlbWVudCA6IFNZTUJPTC1URVhUXG4gICAgICAgICAgICAvLyAtIGxlcyAyIDogU1lNQk9MXG4gICAgICAgICAgICAvLyBNYWlzIGlsIG5vdXMgZmF1dCBsZXMgc3R5bGVzIGNvbXBsZXRzIChwYWludCAmIGxheW91dClcbiAgICAgICAgICAgIC8vIHBvdXIgZGV0ZXJtaW5lciBsZXMgMyB0eXBlcyAhXG4gICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiU1lNQk9MLUlDT05cIjogLy8gbm90IHVzZWQgIVxuICAgICAgICAgICAgICAgICAgICBpbWdUeXBlLnN0eWxlW1wiYmFja2dyb3VuZC1wb3NpdGlvblwiXSA9IFwiMHB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNZTUJPTC1URVhUXCI6IC8vIG5vdCB1c2VkICFcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0xOTRweCAwXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTWU1CT0xcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi04NHB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkxJTkVcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0yOHB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZJTExcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi01NnB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0xNDBweCAwXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDSVJDTEVcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0xNjhweCAwXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaW5jb25udSBvdSBub24gcHJpcyBlbiBjaGFyZ2Ugb3UgcGFyIGRlZmF1dFxuICAgICAgICAgICAgICAgICAgICBpbWdUeXBlLnN0eWxlW1wiYmFja2dyb3VuZC1wb3NpdGlvblwiXSA9IFwiLTExMnB4IDBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpdlRpdGxlLmFwcGVuZENoaWxkKGltZ1R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udGFpbmVyIGxlZ2VuZCAoZW1wdHkpXG4gICAgICAgIHZhciBkaXZMZWdlbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZMZWdlbmQuaWQgPSB0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kICsgXCItXCIgKyB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIGRpdkxlZ2VuZC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kO1xuICAgICAgICBkaXZUaXRsZS5hcHBlbmRDaGlsZChkaXZMZWdlbmQpO1xuXG4gICAgICAgIC8vIGlucHV0XG4gICAgICAgIHZhciBpbnB1dFRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dFRpdGxlLmlkID0gdGhpcy5uYW1lLnRpdGxlaW5wdXQgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgaW5wdXRUaXRsZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUudGl0bGVpbnB1dDtcbiAgICAgICAgaW5wdXRUaXRsZS50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICBkaXZUaXRsZS5hcHBlbmRDaGlsZChpbnB1dFRpdGxlKTtcblxuICAgICAgICAvLyBsYWJlbCBmb3JcbiAgICAgICAgdmFyIGxhYmVsVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgIGxhYmVsVGl0bGUuY2xhc3NOYW1lID0gdGhpcy5uYW1lLnRpdGxlbGFiZWw7XG4gICAgICAgIGxhYmVsVGl0bGUuaHRtbEZvciA9IGlucHV0VGl0bGUuaWQ7XG4gICAgICAgIGxhYmVsVGl0bGUuaW5uZXJIVE1MID0gb2JqW1wiaWRcIl0gfHwgb2JqW1wic291cmNlLWxheWVyXCJdIHx8IG9ialtcInNvdXJjZVwiXTtcbiAgICAgICAgbGFiZWxUaXRsZS50aXRsZSA9IG9ialtcInNvdXJjZS1sYXllclwiXSB8fCBvYmpbXCJzb3VyY2VcIl0gfHwgb2JqW1wiaWRcIl07XG4gICAgICAgIGlmIChsYWJlbFRpdGxlLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxhYmVsVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrTGF5ZXJNYXBCb3goZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsYWJlbFRpdGxlLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICBsYWJlbFRpdGxlLmF0dGFjaEV2ZW50KFwib25jbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYub25DbGlja0xheWVyTWFwQm94KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2VGl0bGUuYXBwZW5kQ2hpbGQobGFiZWxUaXRsZSk7XG4gICAgICAgIC8vIGVucmVnaXN0cmVtZW50IHV0aWxlIHBvdXIgbGEgbcOpdGhvZGUgOiBjb2xsYXBzZSgpXG4gICAgICAgIHRoaXMuRG9tVG9nZ2xlID0gbGFiZWxUaXRsZTtcblxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGl2VGl0bGUpO1xuXG4gICAgICAgIC8vIGFqb3V0IGRlcyBvdXRpbHMgYXUgZmluIGR1IGNvbXBvc2FudFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmljb24uYW5jaG9yID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICBfYWRkVG9vbHMuYXBwbHkodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWluIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRpdjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiBBZGQgZWxlbWVudCBpbnRvIHRhcmdldCBET01cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIExheWVyIGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkICgpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiYWRkKClcIik7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdi5pZCA9IHRoaXMubmFtZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgc3R5bGUgaW4gdGhlIHN1Ym1lbnVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSAtIHN0eWxlIG9iamVjdFxuICAgICAqL1xuICAgIGFkZFN0eWxlIChzdHlsZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJhZGRTdHlsZSgpXCIsIHN0eWxlKTtcbiAgICAgICAgaWYgKHN0eWxlICYmIHR5cGVvZiBzdHlsZSA9PT0gXCJvYmplY3RcIiAmJiBzdHlsZSBpbnN0YW5jZW9mIFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9TdHlsZSA9IHN0eWxlO1xuICAgICAgICAgICAgdGhpcy5vU3R5bGUuZGlzcGxheShmYWxzZSk7IC8vIHBhciBkZWZhdXQgIVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGZpbHRlciBpbiB0aGUgc3VibWVudVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZpbHRlciAtIGZpbHRlciBvYmplY3RcbiAgICAgKi9cbiAgICBhZGRGaWx0ZXIgKGZpbHRlcikge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJhZGRGaWx0ZXIoKVwiLCBmaWx0ZXIpO1xuICAgICAgICBpZiAoZmlsdGVyICYmIHR5cGVvZiBmaWx0ZXIgPT09IFwib2JqZWN0XCIgJiYgZmlsdGVyIGluc3RhbmNlb2YgRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9GaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgICAgICB0aGlzLm9GaWx0ZXIuZGlzcGxheShmYWxzZSk7IC8vIHBhciBkZWZhdXQgIVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIExlZ2VuZCBpbiB0aGUgc3VibWVudVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlZ2VuZCAtIGxlZ2VuZCBvYmplY3RcbiAgICAgKi9cbiAgICBhZGRMZWdlbmQgKGxlZ2VuZCkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJhZGRMZWdlbmQoKVwiLCBsZWdlbmQpO1xuICAgICAgICBpZiAobGVnZW5kICYmIHR5cGVvZiBsZWdlbmQgPT09IFwib2JqZWN0XCIgJiYgbGVnZW5kIGluc3RhbmNlb2YgTGVnZW5kKSB7XG4gICAgICAgICAgICB0aGlzLm9MZWdlbmQgPSBsZWdlbmQ7XG4gICAgICAgICAgICB0aGlzLm9MZWdlbmQuZGlzcGxheShmYWxzZSk7IC8vIHBhciBkZWZhdXQgIVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZWdyYXRlIExlZ2VuZCB0byB0aGUgbGF5ZXIgY29udGFpbmVyXG4gICAgICovXG4gICAgc2xvdExlZ2VuZCAoKSB7XG4gICAgICAgIC8vIGNhcyBwYXJ0aWN1bGllciA6XG4gICAgICAgIC8vIG9uIHNvdWhhaXRlIGludMOpZ3JlciB1bmUgcGFydGllIGRlIGxhIGxlZ2VuZGUgZGFucyBsZSBjb250YWluZXIgZHUgbGF5ZXIuXG4gICAgICAgIHZhciBsZWdlbmQgPSB0aGlzLm9MZWdlbmQ7XG4gICAgICAgIGlmIChsZWdlbmQpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FIGMnZXN0IHBvdXJyaS4uLlxuICAgICAgICAgICAgdmFyIG5vZGUgPSBudWxsO1xuICAgICAgICAgICAgdmFyIG5vZGVzTHZsMSA9IHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICBpZiAobm9kZXNMdmwxLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHNlbG9uIG/DuSBzZSBzaXR1ZSBsJ2ljb25lIGRlIHZpc2liaWxpdMOpIDogYXUgZGVidXQgb3Ugw6AgbGEgZmluLi4uXG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9ICh0aGlzLm9wdGlvbnMudG9vbHMuaWNvbi5hbmNob3IgPT09IFwic3RhcnRcIikgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZXNMdmwyID0gbm9kZXNMdmwxW2lkeF0uY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAvLyBvbiByZWNoZXJjaGUgbGUgY29udGFpbmVyIGRlIGxhIGxlZ2VuZGVcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzTHZsMi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Vybm9kZSA9IG5vZGVzTHZsMltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cm5vZGUuaWQuaW5kZXhPZih0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjdXJub2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVuZGVyID0gbGVnZW5kLmdldFJlbmRlckNvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIGlmIChyZW5kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChyZW5kZXIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZWdlbmRlIGludMOpZ3LDqWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iU2xvdExlZ2VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogU2V0IHZpc2liaWxpdHkgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzZXQgdmlzaWJpbGl0eSBvciB1bmRlZmluZWQgdG8gZ2V0IHN0YXR1c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICB2aXNpYmlsaXR5IChkaXNwbGF5KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcInZpc2liaWxpdHkoKVwiLCBkaXNwbGF5KTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5Eb21WaXNpYmlsaXR5LmNoZWNrZWQgPSAoZGlzcGxheSkgPyBcImNoZWNrZWRcIiA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuRG9tVmlzaWJpbGl0eS5jaGVja2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ29sbGFwc2UgYSBsYXllciBwYW5lbCAoZXZlbnQpXG4gICAgKi9cbiAgICBjb2xsYXBzZSAoKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcImNvbGxhcHNlKClcIik7XG4gICAgICAgIHRoaXMuRG9tVG9nZ2xlLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBDbGljayBvbiB2aXNpYmlsaXR5IGljb24gKGV2ZW50KVxuICAgICovXG4gICAgdmlzaWJsZSAoKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcInZpc2libGUoKVwiKTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuRG9tVmlzaWJpbGl0eS5jbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBjb2xsYXBzZSBvciBnZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzcGxheSAtIHNob3cvaGlkZGVuIGNvbnRhaW5lciBvciBnZXQgc3RhdHVzXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZS9mYWxzZVxuICAgICAqL1xuICAgIGRpc3BsYXkgKGRpc3BsYXkpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiZGlzcGxheSgpXCIsIGRpc3BsYXkpO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRG9tVG9nZ2xlLmh0bWxGb3IpLmNoZWNrZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiaW5saW5lLWZsZXhcIiA6IFwibm9uZVwiO1xuICAgICAgICAgICAgaWYgKHRoaXMub1N0eWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vU3R5bGUuZGlzcGxheShkaXNwbGF5ICYmIGNoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub0ZpbHRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMub0ZpbHRlci5kaXNwbGF5KGRpc3BsYXkgJiYgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5vTGVnZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vTGVnZW5kLmRpc3BsYXkoZGlzcGxheSAmJiBjaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2tlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGlzYWJsZWQvZW5hYmxlZCBzdGF0dXMgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIGRpc2FibGUvZW5hYmxlIGxheWVyIGludGVyYWN0aW9uIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgYWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiYWN0aXZlKClcIiwgYWN0aXZlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3RpdmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IChhY3RpdmUpXG4gICAgICAgICAgICAgICAgPyB0aGlzLm5hbWUuY29udGFpbmVyXG4gICAgICAgICAgICAgICAgOiB0aGlzLm5hbWUuY29udGFpbmVyICsgXCIgZGlzYWJsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9PT0gdGhpcy5uYW1lLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgdG8gZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25DbGlja0xheWVyTWFwQm94IChlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIm9uQ2xpY2tMYXllck1hcEJveFwiLCBlKTtcblxuICAgICAgICB2YXIgaWQgPSBlLnRhcmdldC5odG1sRm9yLnN1YnN0cmluZyhlLnRhcmdldC5odG1sRm9yLmluZGV4T2YoXCItXCIpKTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLnRhcmdldC5odG1sRm9yKS5jaGVja2VkO1xuXG4gICAgICAgIC8vIGdlc3Rpb24gZGVzIGlucHV0c1xuICAgICAgICBpZiAoZS50YXJnZXQuaHRtbEZvciA9PT0gdGhpcy5uYW1lLmltYWdlbGFiZWxpbnB1dCArIGlkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGl0bGVpbnB1dCArIGlkKS5jaGVja2VkID0gIWNoZWNrZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUudGFyZ2V0Lmh0bWxGb3IgPT09IHRoaXMubmFtZS50aXRsZWlucHV0ICsgaWQpIHtcbiAgICAgICAgICAgIC8vIHNpIG9wdGlvbnMucGluOmZhbHNlLCBjZSBET00gbidleGlzdGUgcGFzICFcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUuaW1hZ2VsYWJlbGlucHV0ICsgaWQpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLmltYWdlbGFiZWxpbnB1dCArIGlkKS5jaGVja2VkID0gIWNoZWNrZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXZlcnR1cmUgZHUgcGFubmVhdSBkZXMgc3R5bGVzIC8gZmlsdHJlc1xuICAgICAgICBpZiAodGhpcy5vU3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMub1N0eWxlLmRpc3BsYXkoIWNoZWNrZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9GaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub0ZpbHRlci5kaXNwbGF5KCFjaGVja2VkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhdHRlbnRpb24sXG4gICAgICAgIC8vIHNpIGxhIGxlZ2VuZGUgZXN0IG5vbiBlZGl0YWJsZSwgZWxsZSBuZSBzZSB0cm91dmUgcGFzIGRhbnMgbGUgc291cyBtZW51ICFcbiAgICAgICAgaWYgKHRoaXMub0xlZ2VuZCAmJiB0aGlzLm9MZWdlbmQuaXNFZGl0YWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9MZWdlbmQuZGlzcGxheSghY2hlY2tlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBMYXllciNlZGl0b3I6bGF5ZXI6b25jbGlja3Zpc2liaWxpdHlcbiAgICAgKi9cbiAgICBvblZpc2liaWxpdHlMYXllck1hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvblZpc2liaWxpdHlMYXllck1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3IubGF5ZXIub25jbGlja3Zpc2liaWxpdHksIGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybS4uLlxuICAgICAqXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBvcHRpb24gb2JqZWN0IGludG8gJ2UudGFyZ2V0LmRhdGEnICFcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIGlkIGVkaXRvciBpbnRvICdlLnRhcmdldC5lZGl0b3JJRCcgIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIExheWVyI2VkaXRvcjpsYXllcjpvbmNsaWNrY2xvbmVcbiAgICAgKi9cbiAgICBvbkNsb25lTGF5ZXJNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DbG9uZUxheWVyTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5sYXllci5vbmNsaWNrY2xvbmUsIGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybS4uLlxuICAgICAqXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBvcHRpb24gb2JqZWN0IGludG8gJ2UudGFyZ2V0LmRhdGEnICFcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIGlkIGVkaXRvciBpbnRvICdlLnRhcmdldC5lZGl0b3JJRCcgIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIExheWVyI2VkaXRvcjpsYXllcjpvbmNsaWNrcmVtb3ZlXG4gICAgICovXG4gICAgb25SZW1vdmVMYXllck1hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvblJlbW92ZUxheWVyTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5sYXllci5vbmNsaWNrcmVtb3ZlLCBlKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Layer.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Style__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Style */ \"./src/OpenLayers/Controls/Editor/Style.js\");\n/* harmony import */ var _Legend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Legend */ \"./src/OpenLayers/Controls/Editor/Legend.js\");\n/* harmony import */ var _Filter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Filter */ \"./src/OpenLayers/Controls/Editor/Filter.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getLogger(\"editor-layer\");\n\n/**\n * @classdesc\n *\n * MapBox filter management\n *\n * @constructor\n * @alias ol.style.editor.Layer\n * @param {Object} options - options for function call.\n * @example\n * var layers = new Layer ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * tools : {\n * \"visibility\" : true, // afficher l'icone de visibilité\n * \"icon\" : {\n * \"image\" : true, // afficher l'icone \"oeil\" (defaut) ou une checkbox\n * \"anchor\" : \"start\" | \"end\" // afficher l'icone au debut ou à la fin (defaut)\n * },\n * \"type\" : true, // afficher l'icone du type de geometrie\n * \"pin\" : true, // afficher l'icone de puce\n * \"remove\" : false, // TODO afficher l'icone de suppression\n * \"clone\" : false // TODO afficher l'icone de duplication\n * },\n * obj : {\n * \"id\": \"ocs - vegetation\", // MANDATORY\n * \"type\": \"fill\", // OPTIONAL\n * \"source\": \"pyramide_proto\", // OPTIONAL\n * \"source-layer\": \"ocs_vegetation_surf\" // OPTIONAL\n * }\n * });\n * layers.addLegend(oLegend);\n * layers.slotLegend();\n * layers.addStyle(oStyle);\n * layers.addFilter(oFilter);\n * layers.add();\n * layers.active(false);\n * layers.visibility(false);\n * layers.display(false);\n * layers.collapse();\n * EventBus.addEventListener(\"editor:layer:onclickvisibility\", function (e) {\n * // e.target.data : options !\n * // e.target.editorID : id or null\n * }, this);\n */\nvar Layer = /*#__PURE__*/function () {\n function Layer(options) {\n _classCallCheck(this, Layer);\n logger.trace(\"[constructor] Layer\", options);\n\n // options\n this.options = options || {};\n if (!(this instanceof Layer)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n // ################################################################### //\n // ##################### private methods ############################# //\n // ################################################################### //\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Layer, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null; // null si le layer n'appartient pas à un editeur !\n\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.position) {\n this.options.position = 0;\n }\n var _toolsDefault = {\n visibility: true,\n icon: {\n image: true,\n anchor: \"end\"\n },\n type: true,\n pin: true,\n remove: false,\n // TODO\n clone: false // TODO\n };\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n var _objDefault = {\n id: \"\",\n type: \"\",\n // icone sur le type de geometrie\n source: \"\",\n \"source-layer\": \"\"\n };\n if (!this.options.obj) {\n this.options.obj = _objDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].mergeParams(this.options.obj, _objDefault, false);\n\n // legende intégrée\n this.bSlotLegend = false;\n\n // obj\n this.oFilter = null;\n this.oStyle = null;\n this.oLegend = null;\n\n // dom\n this.container = null;\n this.DomVisibility = null;\n this.DomToggle = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxLayerTarget\",\n container: \"GPEditorMapBoxLayerContainer\",\n containerlegend: \"GPEditorMapBoxLayerLegendContainer\",\n containertitle: \"GPEditorMapBoxLayerTitleContainer\",\n imagelabelinput: \"GPEditorMapBoxLayerImageInput\",\n imagelabel: \"GPEditorMapBoxLayerImageLabel\",\n typeimg: \"GPEditorMapBoxLayerTypeImage\",\n titleinput: \"GPEditorMapBoxLayerTitleInput\",\n titlelabel: \"GPEditorMapBoxLayerTitleLabel\",\n containertools: \"GPEditorMapBoxToolsContainer\",\n visibilityinput: \"GPEditorMapBoxToolsVisibilityInput\",\n visibilitylabel: \"GPEditorMapBoxToolsVisibilityLabel\",\n visibilityinputdisable: \"GPEditorMapBoxToolsVisibilityInputDisable\",\n visibilitylabeldisable: \"GPEditorMapBoxToolsVisibilityLabelDisable\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n * // >> Titre 1 |OOO| <- menu tools : visibility, clone, remove\n * // >> Titre 2 |OXX| <- affichage configurable (cf. options.tools)\n * // Event : clic sur le titre -> ex. affiche le menu des styles / filtres\n * // : clic visibility, clone, remove\n * // DOM :\n *
\n *
\n * \n * \n * \n * \n *
\n *
\n * \n * \n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var obj = this.options.obj;\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // title\n var divTitle = document.createElement(\"div\");\n divTitle.id = this.name.containertitle + \"-\" + this.options.position;\n divTitle.className = this.name.containertitle;\n\n // puce\n if (this.options.tools.pin) {\n // Optionnel !\n // input\n var inputImage = document.createElement(\"input\");\n inputImage.id = this.name.imagelabelinput + \"-\" + this.options.position;\n inputImage.className = this.name.imagelabelinput;\n inputImage.type = \"checkbox\";\n divTitle.appendChild(inputImage);\n // puce\n var labelImage = document.createElement(\"label\");\n labelImage.className = this.name.imagelabel;\n labelImage.htmlFor = inputImage.id;\n if (labelImage.addEventListener) {\n labelImage.addEventListener(\"click\", function (e) {\n self.onClickLayerMapBox(e);\n });\n } else if (labelImage.attachEvent) {\n labelImage.attachEvent(\"onclick\", function (e) {\n self.onClickLayerMapBox(e);\n });\n }\n divTitle.appendChild(labelImage);\n }\n\n // tools :\n // visibility, (remove, clone)\n var _addTools = function _addTools() {\n var divTools = document.createElement(\"div\");\n divTools.id = this.name.containertools + \"-\" + this.options.position;\n divTools.className = this.name.containertools;\n\n // visibility\n if (this.options.tools.visibility) {\n var inputTools = document.createElement(\"input\");\n inputTools.id = this.name.visibilityinput + \"-\" + this.options.position;\n inputTools.className = this.options.tools.icon.image ? this.name.visibilityinput : this.name.visibilityinputdisable;\n inputTools.type = \"checkbox\";\n inputTools.checked = \"checked\"; // par défaut, à modifier via visibility(true|false) !\n\n // event for visibility change\n if (inputTools.addEventListener) {\n inputTools.addEventListener(\"click\", function (e) {\n self.onVisibilityLayerMapBox(e);\n });\n } else if (inputTools.attachEvent) {\n // internet explorer\n inputTools.attachEvent(\"onclick\", function (e) {\n self.onVisibilityLayerMapBox(e);\n });\n }\n divTools.appendChild(inputTools);\n // enregistrement utile pour la méthode : visibility()\n this.DomVisibility = inputTools;\n var labelTools = document.createElement(\"label\");\n labelTools.htmlFor = this.name.visibilityinput + \"-\" + this.options.position;\n labelTools.id = this.name.visibilitylabel + \"-\" + this.options.position;\n labelTools.className = this.options.tools.icon.image ? this.name.visibilitylabel : this.name.visibilitylabeldisable;\n labelTools.title = \"Afficher/masquer la couche\";\n divTools.appendChild(labelTools);\n div.appendChild(divTools);\n }\n\n // clone\n if (this.options.tools.clone) {\n // TODO...\n logger.warn(\"Dom for tools clone, it's not yet implemented !\");\n }\n\n // remove\n if (this.options.tools.remove) {\n // TODO...\n logger.warn(\"Dom for tools remove, it's not yet implemented !\");\n }\n };\n\n // ajout des outils au debut du composant\n if (this.options.tools.icon.anchor === \"start\") {\n _addTools.apply(this);\n }\n\n // type\n if (this.options.tools.type && obj.type) {\n // Optionnel !\n var imgType = document.createElement(\"img\");\n imgType.className = this.name.typeimg;\n // FIXME il faudrait faire la difference entre :\n // - icone uniquement : SYMBOL-ICON\n // - texte uniquement : SYMBOL-TEXT\n // - les 2 : SYMBOL\n // Mais il nous faut les styles complets (paint & layout)\n // pour determiner les 3 types !\n switch (obj.type.toUpperCase()) {\n case \"SYMBOL-ICON\":\n // not used !\n imgType.style[\"background-position\"] = \"0px 0\";\n break;\n case \"SYMBOL-TEXT\":\n // not used !\n imgType.style[\"background-position\"] = \"-194px 0\";\n break;\n case \"SYMBOL\":\n imgType.style[\"background-position\"] = \"-84px 0\";\n break;\n case \"LINE\":\n imgType.style[\"background-position\"] = \"-28px 0\";\n break;\n case \"FILL\":\n imgType.style[\"background-position\"] = \"-56px 0\";\n break;\n case \"BACKGROUND\":\n imgType.style[\"background-position\"] = \"-140px 0\";\n break;\n case \"CIRCLE\":\n imgType.style[\"background-position\"] = \"-168px 0\";\n break;\n default:\n // type inconnu ou non pris en charge ou par defaut\n imgType.style[\"background-position\"] = \"-112px 0\";\n }\n divTitle.appendChild(imgType);\n }\n\n // container legend (empty)\n var divLegend = document.createElement(\"div\");\n divLegend.id = this.name.containerlegend + \"-\" + this.options.position;\n divLegend.className = this.name.containerlegend;\n divTitle.appendChild(divLegend);\n\n // input\n var inputTitle = document.createElement(\"input\");\n inputTitle.id = this.name.titleinput + \"-\" + this.options.position;\n inputTitle.className = this.name.titleinput;\n inputTitle.type = \"checkbox\";\n divTitle.appendChild(inputTitle);\n\n // label for\n var labelTitle = document.createElement(\"label\");\n labelTitle.className = this.name.titlelabel;\n labelTitle.htmlFor = inputTitle.id;\n labelTitle.innerHTML = obj[\"id\"] || obj[\"source-layer\"] || obj[\"source\"];\n labelTitle.title = obj[\"source-layer\"] || obj[\"source\"] || obj[\"id\"];\n if (labelTitle.addEventListener) {\n labelTitle.addEventListener(\"click\", function (e) {\n self.onClickLayerMapBox(e);\n });\n } else if (labelTitle.attachEvent) {\n labelTitle.attachEvent(\"onclick\", function (e) {\n self.onClickLayerMapBox(e);\n });\n }\n divTitle.appendChild(labelTitle);\n // enregistrement utile pour la méthode : collapse()\n this.DomToggle = labelTitle;\n div.appendChild(divTitle);\n\n // ajout des outils au fin du composant\n if (this.options.tools.icon.anchor === \"end\") {\n _addTools.apply(this);\n }\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Layer instance\n */\n }, {\n key: \"add\",\n value: function add() {\n logger.trace(\"add()\");\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Add style in the submenu\n *\n * @param {Object} style - style object\n */\n }, {\n key: \"addStyle\",\n value: function addStyle(style) {\n logger.trace(\"addStyle()\", style);\n if (style && _typeof(style) === \"object\" && style instanceof _Style__WEBPACK_IMPORTED_MODULE_2__[\"default\"]) {\n this.oStyle = style;\n this.oStyle.display(false); // par defaut !\n }\n }\n\n /**\n * Add filter in the submenu\n *\n * @param {Object} filter - filter object\n */\n }, {\n key: \"addFilter\",\n value: function addFilter(filter) {\n logger.trace(\"addFilter()\", filter);\n if (filter && _typeof(filter) === \"object\" && filter instanceof _Filter__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n this.oFilter = filter;\n this.oFilter.display(false); // par defaut !\n }\n }\n\n /**\n * Add Legend in the submenu\n *\n * @param {Object} legend - legend object\n */\n }, {\n key: \"addLegend\",\n value: function addLegend(legend) {\n logger.trace(\"addLegend()\", legend);\n if (legend && _typeof(legend) === \"object\" && legend instanceof _Legend__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n this.oLegend = legend;\n this.oLegend.display(false); // par defaut !\n }\n }\n\n /**\n * Integrate Legend to the layer container\n */\n }, {\n key: \"slotLegend\",\n value: function slotLegend() {\n // cas particulier :\n // on souhaite intégrer une partie de la legende dans le container du layer.\n var legend = this.oLegend;\n if (legend) {\n // FIXME c'est pourri...\n var node = null;\n var nodesLvl1 = this.container.childNodes;\n if (nodesLvl1.length) {\n // selon où se situe l'icone de visibilité : au debut ou à la fin...\n var idx = this.options.tools.icon.anchor === \"start\" ? 1 : 0;\n var nodesLvl2 = nodesLvl1[idx].childNodes;\n // on recherche le container de la legende\n for (var i = 0; i < nodesLvl2.length; i++) {\n var curnode = nodesLvl2[i];\n if (curnode.id.indexOf(this.name.containerlegend) !== -1) {\n node = curnode;\n }\n }\n }\n if (node) {\n var render = legend.getRenderContainer();\n if (render) {\n node.appendChild(render);\n // legende intégrée\n this.bSlotLegend = true;\n }\n }\n }\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Set visibility or get\n *\n * @param {Boolean} display - set visibility or undefined to get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"visibility\",\n value: function visibility(display) {\n logger.trace(\"visibility()\", display);\n if (!this.options.tools.visibility) {\n return;\n }\n if (typeof display !== \"undefined\") {\n this.DomVisibility.checked = display ? \"checked\" : \"\";\n }\n return this.DomVisibility.checked;\n }\n\n /**\n * Collapse a layer panel (event)\n */\n }, {\n key: \"collapse\",\n value: function collapse() {\n logger.trace(\"collapse()\");\n this.DomToggle.click();\n }\n\n /**\n * Click on visibility icon (event)\n */\n }, {\n key: \"visible\",\n value: function visible() {\n logger.trace(\"visible()\");\n if (!this.options.tools.visibility) {\n return;\n }\n this.DomVisibility.click();\n }\n\n /**\n * Set collapse or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n var checked = document.getElementById(this.DomToggle.htmlFor).checked;\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"inline-flex\" : \"none\";\n if (this.oStyle) {\n this.oStyle.display(_display && checked);\n }\n if (this.oFilter) {\n this.oFilter.display(_display && checked);\n }\n if (this.oLegend) {\n this.oLegend.display(_display && checked);\n }\n }\n return checked;\n }\n\n /**\n * Set disabled/enabled status or get\n *\n * @param {Boolean} active - disable/enable layer interaction or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"active\",\n value: function active(_active) {\n logger.trace(\"active()\", _active);\n if (typeof _active !== \"undefined\") {\n this.container.className = _active ? this.name.container : this.name.container + \" disabled\";\n }\n return this.container.className === this.name.container;\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n }, {\n key: \"onClickLayerMapBox\",\n value: function onClickLayerMapBox(e) {\n logger.trace(\"onClickLayerMapBox\", e);\n var id = e.target.htmlFor.substring(e.target.htmlFor.indexOf(\"-\"));\n var checked = document.getElementById(e.target.htmlFor).checked;\n\n // gestion des inputs\n if (e.target.htmlFor === this.name.imagelabelinput + id) {\n document.getElementById(this.name.titleinput + id).checked = !checked;\n }\n if (e.target.htmlFor === this.name.titleinput + id) {\n // si options.pin:false, ce DOM n'existe pas !\n if (document.getElementById(this.name.imagelabelinput + id)) {\n document.getElementById(this.name.imagelabelinput + id).checked = !checked;\n }\n }\n\n // ouverture du panneau des styles / filtres\n if (this.oStyle) {\n this.oStyle.display(!checked);\n }\n if (this.oFilter) {\n this.oFilter.display(!checked);\n }\n // attention,\n // si la legende est non editable, elle ne se trouve pas dans le sous menu !\n if (this.oLegend && this.oLegend.isEditable()) {\n this.oLegend.display(!checked);\n }\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Layer#editor:layer:onclickvisibility\n */\n }, {\n key: \"onVisibilityLayerMapBox\",\n value: function onVisibilityLayerMapBox(e) {\n logger.trace(\"onVisibilityLayerMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].layer.onclickvisibility, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Layer#editor:layer:onclickclone\n */\n }, {\n key: \"onCloneLayerMapBox\",\n value: function onCloneLayerMapBox(e) {\n logger.trace(\"onCloneLayerMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].layer.onclickclone, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Layer#editor:layer:onclickremove\n */\n }, {\n key: \"onRemoveLayerMapBox\",\n value: function onRemoveLayerMapBox(e) {\n logger.trace(\"onRemoveLayerMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].layer.onclickremove, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Layer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9MYXllci5qcz9mNjZmIl0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkxheWVyIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInRyYWNlIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsIl90b29sc0RlZmF1bHQiLCJ2aXNpYmlsaXR5IiwiaWNvbiIsImltYWdlIiwiYW5jaG9yIiwidHlwZSIsInBpbiIsInJlbW92ZSIsImNsb25lIiwidG9vbHMiLCJVdGlscyIsIm1lcmdlUGFyYW1zIiwiX29iakRlZmF1bHQiLCJzb3VyY2UiLCJvYmoiLCJiU2xvdExlZ2VuZCIsIm9GaWx0ZXIiLCJvU3R5bGUiLCJvTGVnZW5kIiwiY29udGFpbmVyIiwiRG9tVmlzaWJpbGl0eSIsIkRvbVRvZ2dsZSIsIm5hbWUiLCJjb250YWluZXJsZWdlbmQiLCJjb250YWluZXJ0aXRsZSIsImltYWdlbGFiZWxpbnB1dCIsImltYWdlbGFiZWwiLCJ0eXBlaW1nIiwidGl0bGVpbnB1dCIsInRpdGxlbGFiZWwiLCJjb250YWluZXJ0b29scyIsInZpc2liaWxpdHlpbnB1dCIsInZpc2liaWxpdHlsYWJlbCIsInZpc2liaWxpdHlpbnB1dGRpc2FibGUiLCJ2aXNpYmlsaXR5bGFiZWxkaXNhYmxlIiwic2VsZiIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImRpdlRpdGxlIiwiaW5wdXRJbWFnZSIsImFwcGVuZENoaWxkIiwibGFiZWxJbWFnZSIsImh0bWxGb3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsIm9uQ2xpY2tMYXllck1hcEJveCIsImF0dGFjaEV2ZW50IiwiX2FkZFRvb2xzIiwiZGl2VG9vbHMiLCJpbnB1dFRvb2xzIiwiY2hlY2tlZCIsIm9uVmlzaWJpbGl0eUxheWVyTWFwQm94IiwibGFiZWxUb29scyIsInRpdGxlIiwid2FybiIsImFwcGx5IiwiaW1nVHlwZSIsInRvVXBwZXJDYXNlIiwic3R5bGUiLCJkaXZMZWdlbmQiLCJpbnB1dFRpdGxlIiwibGFiZWxUaXRsZSIsImlubmVySFRNTCIsImFkZCIsImdldEVsZW1lbnRCeUlkIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYWRkU3R5bGUiLCJfdHlwZW9mIiwiU3R5bGUiLCJkaXNwbGF5IiwiYWRkRmlsdGVyIiwiZmlsdGVyIiwiRmlsdGVyIiwiYWRkTGVnZW5kIiwibGVnZW5kIiwiTGVnZW5kIiwic2xvdExlZ2VuZCIsIm5vZGVzTHZsMSIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJpZHgiLCJub2Rlc0x2bDIiLCJpIiwiY3Vybm9kZSIsImluZGV4T2YiLCJyZW5kZXIiLCJnZXRSZW5kZXJDb250YWluZXIiLCJjb2xsYXBzZSIsImNsaWNrIiwidmlzaWJsZSIsImFjdGl2ZSIsImdldENvbnRhaW5lciIsInN1YnN0cmluZyIsImlzRWRpdGFibGUiLCJlZGl0b3JJRCIsImRhdGEiLCJFdmVudEJ1cyIsImRpc3BhdGNoIiwiRXZlbnRFZGl0b3IiLCJsYXllciIsIm9uY2xpY2t2aXNpYmlsaXR5Iiwib25DbG9uZUxheWVyTWFwQm94Iiwib25jbGlja2Nsb25lIiwib25SZW1vdmVMYXllck1hcEJveCIsIm9uY2xpY2tyZW1vdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ047QUFDRTtBQUNBO0FBQ1k7QUFDaUI7QUFFM0QsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsY0FBYyxDQUFDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0MsUUFBUSxDQUFDQyw4Q0FBVyxDQUFDQyxLQUFLLENBQUNHLFlBQVksRUFBRTVELENBQUMsQ0FBQztJQUN4RDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFuRCxHQUFBO0lBQUFDLEtBQUEsRUFVQSxTQUFBK0csb0JBQXFCN0QsQ0FBQyxFQUFFO01BQ3BCOUQsTUFBTSxDQUFDTSxLQUFLLENBQUMscUJBQXFCLEVBQUV3RCxDQUFDLENBQUM7TUFDdENBLENBQUMsQ0FBQ29ELFFBQVEsR0FBRyxJQUFJLENBQUNyRyxFQUFFO01BQ3BCaUQsQ0FBQyxDQUFDcUQsSUFBSSxHQUFHLElBQUksQ0FBQy9HLE9BQU87TUFDckJnSCxpREFBUSxDQUFDQyxRQUFRLENBQUNDLDhDQUFXLENBQUNDLEtBQUssQ0FBQ0ssYUFBYSxFQUFFOUQsQ0FBQyxDQUFDO0lBQ3pEO0VBQUM7QUFBQTtBQUVKO0FBRWMzRCxvRUFBSyIsImZpbGUiOiIuL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9MYXllci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEJ1cyBmcm9tIFwiZXZlbnRidXNqc1wiO1xuaW1wb3J0IEV2ZW50RWRpdG9yIGZyb20gXCIuL0V2ZW50XCI7XG5pbXBvcnQgU3R5bGUgZnJvbSBcIi4vU3R5bGVcIjtcbmltcG9ydCBMZWdlbmQgZnJvbSBcIi4vTGVnZW5kXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCIuL0ZpbHRlclwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJlZGl0b3ItbGF5ZXJcIik7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICpcbiAqIE1hcEJveCBmaWx0ZXIgbWFuYWdlbWVudFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnN0eWxlLmVkaXRvci5MYXllclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGxheWVycyA9IG5ldyBMYXllciAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHBvc2l0aW9uIDogMSwgLy8gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gKHVuaXF1ZSAhKVxuICogICAgICB0b29scyA6IHtcbiAqICAgICAgICAgIFwidmlzaWJpbGl0eVwiIDogdHJ1ZSwgLy8gYWZmaWNoZXIgbCdpY29uZSBkZSB2aXNpYmlsaXTDqVxuICogICAgICAgICAgXCJpY29uXCIgOiB7XG4gKiAgICAgICAgICAgICAgXCJpbWFnZVwiIDogdHJ1ZSwgLy8gYWZmaWNoZXIgbCdpY29uZSBcIm9laWxcIiAoZGVmYXV0KSBvdSB1bmUgY2hlY2tib3hcbiAqICAgICAgICAgICAgICBcImFuY2hvclwiIDogXCJzdGFydFwiIHwgXCJlbmRcIiAgLy8gYWZmaWNoZXIgbCdpY29uZSBhdSBkZWJ1dCBvdSDDoCBsYSBmaW4gKGRlZmF1dClcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcInR5cGVcIiA6IHRydWUsICAgICAgIC8vIGFmZmljaGVyIGwnaWNvbmUgZHUgdHlwZSBkZSBnZW9tZXRyaWVcbiAqICAgICAgICAgIFwicGluXCIgOiB0cnVlLCAgICAgICAgLy8gYWZmaWNoZXIgbCdpY29uZSBkZSBwdWNlXG4gKiAgICAgICAgICBcInJlbW92ZVwiIDogZmFsc2UsICAgIC8vIFRPRE8gYWZmaWNoZXIgbCdpY29uZSBkZSBzdXBwcmVzc2lvblxuICogICAgICAgICAgXCJjbG9uZVwiIDogZmFsc2UgICAgICAvLyBUT0RPIGFmZmljaGVyIGwnaWNvbmUgZGUgZHVwbGljYXRpb25cbiAqICAgICAgfSxcbiAqICAgICAgb2JqIDoge1xuICogICAgICAgICAgXCJpZFwiOiBcIm9jcyAtIHZlZ2V0YXRpb25cIiwgLy8gTUFOREFUT1JZXG4gKiAgICAgICAgICBcInR5cGVcIjogXCJmaWxsXCIsIC8vIE9QVElPTkFMXG4gKiAgICAgICAgICBcInNvdXJjZVwiOiBcInB5cmFtaWRlX3Byb3RvXCIsIC8vIE9QVElPTkFMXG4gKiAgICAgICAgICBcInNvdXJjZS1sYXllclwiOiBcIm9jc192ZWdldGF0aW9uX3N1cmZcIiAvLyBPUFRJT05BTFxuICogICAgICB9XG4gKiAgIH0pO1xuICogIGxheWVycy5hZGRMZWdlbmQob0xlZ2VuZCk7XG4gKiAgbGF5ZXJzLnNsb3RMZWdlbmQoKTtcbiAqICBsYXllcnMuYWRkU3R5bGUob1N0eWxlKTtcbiAqICBsYXllcnMuYWRkRmlsdGVyKG9GaWx0ZXIpO1xuICogIGxheWVycy5hZGQoKTtcbiAqICBsYXllcnMuYWN0aXZlKGZhbHNlKTtcbiAqICBsYXllcnMudmlzaWJpbGl0eShmYWxzZSk7XG4gKiAgbGF5ZXJzLmRpc3BsYXkoZmFsc2UpO1xuICogIGxheWVycy5jb2xsYXBzZSgpO1xuICogIEV2ZW50QnVzLmFkZEV2ZW50TGlzdGVuZXIoXCJlZGl0b3I6bGF5ZXI6b25jbGlja3Zpc2liaWxpdHlcIiwgZnVuY3Rpb24gKGUpIHtcbiAqICAgICAvLyBlLnRhcmdldC5kYXRhIDogb3B0aW9ucyAhXG4gKiAgICAgLy8gZS50YXJnZXQuZWRpdG9ySUQgOiBpZCBvciBudWxsXG4gKiAgIH0sIHRoaXMpO1xuICovXG5jbGFzcyBMYXllciB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIExheWVyXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGF5ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHJpdmF0ZSBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDsgLy8gbnVsbCBzaSBsZSBsYXllciBuJ2FwcGFydGllbnQgcGFzIMOgIHVuIGVkaXRldXIgIVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gY2YuIGFkZCgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfdG9vbHNEZWZhdWx0ID0ge1xuICAgICAgICAgICAgdmlzaWJpbGl0eSA6IHRydWUsXG4gICAgICAgICAgICBpY29uIDoge1xuICAgICAgICAgICAgICAgIGltYWdlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhbmNob3IgOiBcImVuZFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZSA6IHRydWUsXG4gICAgICAgICAgICBwaW4gOiB0cnVlLFxuICAgICAgICAgICAgcmVtb3ZlIDogZmFsc2UsIC8vIFRPRE9cbiAgICAgICAgICAgIGNsb25lIDogZmFsc2UgLy8gVE9ET1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbHMgPSBfdG9vbHNEZWZhdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMubWVyZ2VQYXJhbXModGhpcy5vcHRpb25zLnRvb2xzLCBfdG9vbHNEZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAgICAgdmFyIF9vYmpEZWZhdWx0ID0ge1xuICAgICAgICAgICAgaWQgOiBcIlwiLFxuICAgICAgICAgICAgdHlwZSA6IFwiXCIsIC8vIGljb25lIHN1ciBsZSB0eXBlIGRlIGdlb21ldHJpZVxuICAgICAgICAgICAgc291cmNlIDogXCJcIixcbiAgICAgICAgICAgIFwic291cmNlLWxheWVyXCIgOiBcIlwiXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub2JqKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub2JqID0gX29iakRlZmF1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy5tZXJnZVBhcmFtcyh0aGlzLm9wdGlvbnMub2JqLCBfb2JqRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIC8vIGxlZ2VuZGUgaW50w6lncsOpZVxuICAgICAgICB0aGlzLmJTbG90TGVnZW5kID0gZmFsc2U7XG5cbiAgICAgICAgLy8gb2JqXG4gICAgICAgIHRoaXMub0ZpbHRlciA9IG51bGw7XG4gICAgICAgIHRoaXMub1N0eWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vTGVnZW5kID0gbnVsbDtcblxuICAgICAgICAvLyBkb21cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICB0aGlzLkRvbVZpc2liaWxpdHkgPSBudWxsO1xuICAgICAgICB0aGlzLkRvbVRvZ2dsZSA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllclRhcmdldFwiLFxuICAgICAgICAgICAgY29udGFpbmVyIDogXCJHUEVkaXRvck1hcEJveExheWVyQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJsZWdlbmQgOiBcIkdQRWRpdG9yTWFwQm94TGF5ZXJMZWdlbmRDb250YWluZXJcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRpdGxlIDogXCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVDb250YWluZXJcIixcbiAgICAgICAgICAgIGltYWdlbGFiZWxpbnB1dCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllckltYWdlSW5wdXRcIixcbiAgICAgICAgICAgIGltYWdlbGFiZWwgOiBcIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUxhYmVsXCIsXG4gICAgICAgICAgICB0eXBlaW1nIDogXCJHUEVkaXRvck1hcEJveExheWVyVHlwZUltYWdlXCIsXG4gICAgICAgICAgICB0aXRsZWlucHV0IDogXCJHUEVkaXRvck1hcEJveExheWVyVGl0bGVJbnB1dFwiLFxuICAgICAgICAgICAgdGl0bGVsYWJlbCA6IFwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlTGFiZWxcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzIDogXCJHUEVkaXRvck1hcEJveFRvb2xzQ29udGFpbmVyXCIsXG4gICAgICAgICAgICB2aXNpYmlsaXR5aW5wdXQgOiBcIkdQRWRpdG9yTWFwQm94VG9vbHNWaXNpYmlsaXR5SW5wdXRcIixcbiAgICAgICAgICAgIHZpc2liaWxpdHlsYWJlbCA6IFwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlMYWJlbFwiLFxuICAgICAgICAgICAgdmlzaWJpbGl0eWlucHV0ZGlzYWJsZSA6IFwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dERpc2FibGVcIixcbiAgICAgICAgICAgIHZpc2liaWxpdHlsYWJlbGRpc2FibGUgOiBcIkdQRWRpdG9yTWFwQm94VG9vbHNWaXNpYmlsaXR5TGFiZWxEaXNhYmxlXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vID4+IFRpdHJlIDEgICAgICAgICAgfE9PT3wgPC0gbWVudSB0b29scyA6IHZpc2liaWxpdHksIGNsb25lLCByZW1vdmVcbiAgICAgKiAvLyA+PiBUaXRyZSAyICAgICAgICAgIHxPWFh8IDwtIGFmZmljaGFnZSBjb25maWd1cmFibGUgKGNmLiBvcHRpb25zLnRvb2xzKVxuICAgICAqIC8vIEV2ZW50IDogY2xpYyBzdXIgbGUgdGl0cmUgLT4gZXguIGFmZmljaGUgbGUgbWVudSBkZXMgc3R5bGVzIC8gZmlsdHJlc1xuICAgICAqIC8vICAgICAgIDogY2xpYyB2aXNpYmlsaXR5LCBjbG9uZSwgcmVtb3ZlXG4gICAgICogLy8gRE9NIDpcbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVyQ29udGFpbmVyXCI+XG4gICAgICogICAgICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUNvbnRhaW5lci00NVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlQ29udGFpbmVyXCI+XG4gICAgICogICAgICAgICAgICAgIDxpbnB1dCBpZD1cIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUlucHV0LTQ1XCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVySW1hZ2VJbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiPlxuICAgICAqICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJHUEVkaXRvck1hcEJveExheWVySW1hZ2VMYWJlbFwiIGZvcj1cIkdQRWRpdG9yTWFwQm94TGF5ZXJJbWFnZUlucHV0LTQ1XCI+PC9sYWJlbD5cbiAgICAgKiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlSW5wdXQtNDVcIiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUlucHV0XCIgdHlwZT1cImNoZWNrYm94XCI+XG4gICAgICogICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGF5ZXJUaXRsZUxhYmVsXCIgZm9yPVwiR1BFZGl0b3JNYXBCb3hMYXllclRpdGxlSW5wdXQtNDVcIiB0aXRsZT1cIi4uLlwiPi4uLjwvbGFiZWw+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94VG9vbHNDb250YWluZXItNDVcIiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94VG9vbHNDb250YWluZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dC00NVwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dFwiPlxuICAgICAqICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlJbnB1dC00NVwiIGlkPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlMYWJlbC00NVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUb29sc1Zpc2liaWxpdHlMYWJlbFwiIHRpdGxlPVwiQWZmaWNoZXIvbWFzcXVlciBsYSBjb3VjaGVcIj48L2xhYmVsPlxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9kaXY+XG4gICAgICovXG4gICAgX2luaXRDb250YWluZXIgKCkge1xuICAgICAgICAvLyBjb250ZXh0ZVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9iaiA9IHRoaXMub3B0aW9ucy5vYmo7XG5cbiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVyO1xuXG4gICAgICAgIC8vIHRpdGxlXG4gICAgICAgIHZhciBkaXZUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdlRpdGxlLmlkID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRpdGxlICsgXCItXCIgKyB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIGRpdlRpdGxlLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0aXRsZTtcblxuICAgICAgICAvLyBwdWNlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMucGluKSB7IC8vIE9wdGlvbm5lbCAhXG4gICAgICAgICAgICAvLyBpbnB1dFxuICAgICAgICAgICAgdmFyIGlucHV0SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICBpbnB1dEltYWdlLmlkID0gdGhpcy5uYW1lLmltYWdlbGFiZWxpbnB1dCArIFwiLVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICAgICAgaW5wdXRJbWFnZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUuaW1hZ2VsYWJlbGlucHV0O1xuICAgICAgICAgICAgaW5wdXRJbWFnZS50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICAgICAgZGl2VGl0bGUuYXBwZW5kQ2hpbGQoaW5wdXRJbWFnZSk7XG4gICAgICAgICAgICAvLyBwdWNlXG4gICAgICAgICAgICB2YXIgbGFiZWxJbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxhYmVsSW1hZ2UuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmltYWdlbGFiZWw7XG4gICAgICAgICAgICBsYWJlbEltYWdlLmh0bWxGb3IgPSBpbnB1dEltYWdlLmlkO1xuICAgICAgICAgICAgaWYgKGxhYmVsSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGxhYmVsSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja0xheWVyTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYWJlbEltYWdlLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbGFiZWxJbWFnZS5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrTGF5ZXJNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXZUaXRsZS5hcHBlbmRDaGlsZChsYWJlbEltYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvb2xzIDpcbiAgICAgICAgLy8gdmlzaWJpbGl0eSwgKHJlbW92ZSwgY2xvbmUpXG4gICAgICAgIHZhciBfYWRkVG9vbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGl2VG9vbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZGl2VG9vbHMuaWQgPSB0aGlzLm5hbWUuY29udGFpbmVydG9vbHMgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgIGRpdlRvb2xzLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0b29scztcblxuICAgICAgICAgICAgLy8gdmlzaWJpbGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0VG9vbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgaW5wdXRUb29scy5pZCA9IHRoaXMubmFtZS52aXNpYmlsaXR5aW5wdXQgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBpbnB1dFRvb2xzLmNsYXNzTmFtZSA9ICh0aGlzLm9wdGlvbnMudG9vbHMuaWNvbi5pbWFnZSkgPyB0aGlzLm5hbWUudmlzaWJpbGl0eWlucHV0IDogdGhpcy5uYW1lLnZpc2liaWxpdHlpbnB1dGRpc2FibGU7XG4gICAgICAgICAgICAgICAgaW5wdXRUb29scy50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICAgICAgICAgIGlucHV0VG9vbHMuY2hlY2tlZCA9IFwiY2hlY2tlZFwiOyAvLyBwYXIgZMOpZmF1dCwgw6AgbW9kaWZpZXIgdmlhIHZpc2liaWxpdHkodHJ1ZXxmYWxzZSkgIVxuXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQgZm9yIHZpc2liaWxpdHkgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VG9vbHMuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFRvb2xzLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vblZpc2liaWxpdHlMYXllck1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFRvb2xzLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGludGVybmV0IGV4cGxvcmVyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VG9vbHMuYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVmlzaWJpbGl0eUxheWVyTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGl2VG9vbHMuYXBwZW5kQ2hpbGQoaW5wdXRUb29scyk7XG4gICAgICAgICAgICAgICAgLy8gZW5yZWdpc3RyZW1lbnQgdXRpbGUgcG91ciBsYSBtw6l0aG9kZSA6IHZpc2liaWxpdHkoKVxuICAgICAgICAgICAgICAgIHRoaXMuRG9tVmlzaWJpbGl0eSA9IGlucHV0VG9vbHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGFiZWxUb29scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgICAgICBsYWJlbFRvb2xzLmh0bWxGb3IgPSB0aGlzLm5hbWUudmlzaWJpbGl0eWlucHV0ICsgXCItXCIgKyB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgICAgICAgICAgbGFiZWxUb29scy5pZCA9IHRoaXMubmFtZS52aXNpYmlsaXR5bGFiZWwgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBsYWJlbFRvb2xzLmNsYXNzTmFtZSA9ICh0aGlzLm9wdGlvbnMudG9vbHMuaWNvbi5pbWFnZSkgPyB0aGlzLm5hbWUudmlzaWJpbGl0eWxhYmVsIDogdGhpcy5uYW1lLnZpc2liaWxpdHlsYWJlbGRpc2FibGU7XG4gICAgICAgICAgICAgICAgbGFiZWxUb29scy50aXRsZSA9IFwiQWZmaWNoZXIvbWFzcXVlciBsYSBjb3VjaGVcIjtcbiAgICAgICAgICAgICAgICBkaXZUb29scy5hcHBlbmRDaGlsZChsYWJlbFRvb2xzKTtcblxuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkaXZUb29scyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNsb25lXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmNsb25lKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETy4uLlxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRG9tIGZvciB0b29scyBjbG9uZSwgaXQncyBub3QgeWV0IGltcGxlbWVudGVkICFcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5yZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPLi4uXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJEb20gZm9yIHRvb2xzIHJlbW92ZSwgaXQncyBub3QgeWV0IGltcGxlbWVudGVkICFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gYWpvdXQgZGVzIG91dGlscyBhdSBkZWJ1dCBkdSBjb21wb3NhbnRcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5pY29uLmFuY2hvciA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICBfYWRkVG9vbHMuYXBwbHkodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0eXBlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMudHlwZSAmJiBvYmoudHlwZSkgeyAvLyBPcHRpb25uZWwgIVxuICAgICAgICAgICAgdmFyIGltZ1R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgaW1nVHlwZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUudHlwZWltZztcbiAgICAgICAgICAgIC8vIEZJWE1FIGlsIGZhdWRyYWl0IGZhaXJlIGxhIGRpZmZlcmVuY2UgZW50cmUgOlxuICAgICAgICAgICAgLy8gLSBpY29uZSB1bmlxdWVtZW50IDogU1lNQk9MLUlDT05cbiAgICAgICAgICAgIC8vIC0gdGV4dGUgdW5pcXVlbWVudCA6IFNZTUJPTC1URVhUXG4gICAgICAgICAgICAvLyAtIGxlcyAyIDogU1lNQk9MXG4gICAgICAgICAgICAvLyBNYWlzIGlsIG5vdXMgZmF1dCBsZXMgc3R5bGVzIGNvbXBsZXRzIChwYWludCAmIGxheW91dClcbiAgICAgICAgICAgIC8vIHBvdXIgZGV0ZXJtaW5lciBsZXMgMyB0eXBlcyAhXG4gICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiU1lNQk9MLUlDT05cIjogLy8gbm90IHVzZWQgIVxuICAgICAgICAgICAgICAgICAgICBpbWdUeXBlLnN0eWxlW1wiYmFja2dyb3VuZC1wb3NpdGlvblwiXSA9IFwiMHB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNZTUJPTC1URVhUXCI6IC8vIG5vdCB1c2VkICFcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0xOTRweCAwXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTWU1CT0xcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi04NHB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkxJTkVcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0yOHB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZJTExcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi01NnB4IDBcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0xNDBweCAwXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDSVJDTEVcIjpcbiAgICAgICAgICAgICAgICAgICAgaW1nVHlwZS5zdHlsZVtcImJhY2tncm91bmQtcG9zaXRpb25cIl0gPSBcIi0xNjhweCAwXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaW5jb25udSBvdSBub24gcHJpcyBlbiBjaGFyZ2Ugb3UgcGFyIGRlZmF1dFxuICAgICAgICAgICAgICAgICAgICBpbWdUeXBlLnN0eWxlW1wiYmFja2dyb3VuZC1wb3NpdGlvblwiXSA9IFwiLTExMnB4IDBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpdlRpdGxlLmFwcGVuZENoaWxkKGltZ1R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udGFpbmVyIGxlZ2VuZCAoZW1wdHkpXG4gICAgICAgIHZhciBkaXZMZWdlbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZMZWdlbmQuaWQgPSB0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kICsgXCItXCIgKyB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIGRpdkxlZ2VuZC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kO1xuICAgICAgICBkaXZUaXRsZS5hcHBlbmRDaGlsZChkaXZMZWdlbmQpO1xuXG4gICAgICAgIC8vIGlucHV0XG4gICAgICAgIHZhciBpbnB1dFRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dFRpdGxlLmlkID0gdGhpcy5uYW1lLnRpdGxlaW5wdXQgKyBcIi1cIiArIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgaW5wdXRUaXRsZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUudGl0bGVpbnB1dDtcbiAgICAgICAgaW5wdXRUaXRsZS50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICBkaXZUaXRsZS5hcHBlbmRDaGlsZChpbnB1dFRpdGxlKTtcblxuICAgICAgICAvLyBsYWJlbCBmb3JcbiAgICAgICAgdmFyIGxhYmVsVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgIGxhYmVsVGl0bGUuY2xhc3NOYW1lID0gdGhpcy5uYW1lLnRpdGxlbGFiZWw7XG4gICAgICAgIGxhYmVsVGl0bGUuaHRtbEZvciA9IGlucHV0VGl0bGUuaWQ7XG4gICAgICAgIGxhYmVsVGl0bGUuaW5uZXJIVE1MID0gb2JqW1wiaWRcIl0gfHwgb2JqW1wic291cmNlLWxheWVyXCJdIHx8IG9ialtcInNvdXJjZVwiXTtcbiAgICAgICAgbGFiZWxUaXRsZS50aXRsZSA9IG9ialtcInNvdXJjZS1sYXllclwiXSB8fCBvYmpbXCJzb3VyY2VcIl0gfHwgb2JqW1wiaWRcIl07XG4gICAgICAgIGlmIChsYWJlbFRpdGxlLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxhYmVsVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrTGF5ZXJNYXBCb3goZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsYWJlbFRpdGxlLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICBsYWJlbFRpdGxlLmF0dGFjaEV2ZW50KFwib25jbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYub25DbGlja0xheWVyTWFwQm94KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2VGl0bGUuYXBwZW5kQ2hpbGQobGFiZWxUaXRsZSk7XG4gICAgICAgIC8vIGVucmVnaXN0cmVtZW50IHV0aWxlIHBvdXIgbGEgbcOpdGhvZGUgOiBjb2xsYXBzZSgpXG4gICAgICAgIHRoaXMuRG9tVG9nZ2xlID0gbGFiZWxUaXRsZTtcblxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGl2VGl0bGUpO1xuXG4gICAgICAgIC8vIGFqb3V0IGRlcyBvdXRpbHMgYXUgZmluIGR1IGNvbXBvc2FudFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLmljb24uYW5jaG9yID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICBfYWRkVG9vbHMuYXBwbHkodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWluIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRpdjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiBBZGQgZWxlbWVudCBpbnRvIHRhcmdldCBET01cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIExheWVyIGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkICgpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiYWRkKClcIik7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdi5pZCA9IHRoaXMubmFtZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgc3R5bGUgaW4gdGhlIHN1Ym1lbnVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSAtIHN0eWxlIG9iamVjdFxuICAgICAqL1xuICAgIGFkZFN0eWxlIChzdHlsZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJhZGRTdHlsZSgpXCIsIHN0eWxlKTtcbiAgICAgICAgaWYgKHN0eWxlICYmIHR5cGVvZiBzdHlsZSA9PT0gXCJvYmplY3RcIiAmJiBzdHlsZSBpbnN0YW5jZW9mIFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9TdHlsZSA9IHN0eWxlO1xuICAgICAgICAgICAgdGhpcy5vU3R5bGUuZGlzcGxheShmYWxzZSk7IC8vIHBhciBkZWZhdXQgIVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGZpbHRlciBpbiB0aGUgc3VibWVudVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZpbHRlciAtIGZpbHRlciBvYmplY3RcbiAgICAgKi9cbiAgICBhZGRGaWx0ZXIgKGZpbHRlcikge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJhZGRGaWx0ZXIoKVwiLCBmaWx0ZXIpO1xuICAgICAgICBpZiAoZmlsdGVyICYmIHR5cGVvZiBmaWx0ZXIgPT09IFwib2JqZWN0XCIgJiYgZmlsdGVyIGluc3RhbmNlb2YgRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9GaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgICAgICB0aGlzLm9GaWx0ZXIuZGlzcGxheShmYWxzZSk7IC8vIHBhciBkZWZhdXQgIVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIExlZ2VuZCBpbiB0aGUgc3VibWVudVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlZ2VuZCAtIGxlZ2VuZCBvYmplY3RcbiAgICAgKi9cbiAgICBhZGRMZWdlbmQgKGxlZ2VuZCkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJhZGRMZWdlbmQoKVwiLCBsZWdlbmQpO1xuICAgICAgICBpZiAobGVnZW5kICYmIHR5cGVvZiBsZWdlbmQgPT09IFwib2JqZWN0XCIgJiYgbGVnZW5kIGluc3RhbmNlb2YgTGVnZW5kKSB7XG4gICAgICAgICAgICB0aGlzLm9MZWdlbmQgPSBsZWdlbmQ7XG4gICAgICAgICAgICB0aGlzLm9MZWdlbmQuZGlzcGxheShmYWxzZSk7IC8vIHBhciBkZWZhdXQgIVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZWdyYXRlIExlZ2VuZCB0byB0aGUgbGF5ZXIgY29udGFpbmVyXG4gICAgICovXG4gICAgc2xvdExlZ2VuZCAoKSB7XG4gICAgICAgIC8vIGNhcyBwYXJ0aWN1bGllciA6XG4gICAgICAgIC8vIG9uIHNvdWhhaXRlIGludMOpZ3JlciB1bmUgcGFydGllIGRlIGxhIGxlZ2VuZGUgZGFucyBsZSBjb250YWluZXIgZHUgbGF5ZXIuXG4gICAgICAgIHZhciBsZWdlbmQgPSB0aGlzLm9MZWdlbmQ7XG4gICAgICAgIGlmIChsZWdlbmQpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FIGMnZXN0IHBvdXJyaS4uLlxuICAgICAgICAgICAgdmFyIG5vZGUgPSBudWxsO1xuICAgICAgICAgICAgdmFyIG5vZGVzTHZsMSA9IHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICBpZiAobm9kZXNMdmwxLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHNlbG9uIG/DuSBzZSBzaXR1ZSBsJ2ljb25lIGRlIHZpc2liaWxpdMOpIDogYXUgZGVidXQgb3Ugw6AgbGEgZmluLi4uXG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9ICh0aGlzLm9wdGlvbnMudG9vbHMuaWNvbi5hbmNob3IgPT09IFwic3RhcnRcIikgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZXNMdmwyID0gbm9kZXNMdmwxW2lkeF0uY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAvLyBvbiByZWNoZXJjaGUgbGUgY29udGFpbmVyIGRlIGxhIGxlZ2VuZGVcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzTHZsMi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Vybm9kZSA9IG5vZGVzTHZsMltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cm5vZGUuaWQuaW5kZXhPZih0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjdXJub2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVuZGVyID0gbGVnZW5kLmdldFJlbmRlckNvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIGlmIChyZW5kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChyZW5kZXIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZWdlbmRlIGludMOpZ3LDqWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iU2xvdExlZ2VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogU2V0IHZpc2liaWxpdHkgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzZXQgdmlzaWJpbGl0eSBvciB1bmRlZmluZWQgdG8gZ2V0IHN0YXR1c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICB2aXNpYmlsaXR5IChkaXNwbGF5KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcInZpc2liaWxpdHkoKVwiLCBkaXNwbGF5KTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5Eb21WaXNpYmlsaXR5LmNoZWNrZWQgPSAoZGlzcGxheSkgPyBcImNoZWNrZWRcIiA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuRG9tVmlzaWJpbGl0eS5jaGVja2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ29sbGFwc2UgYSBsYXllciBwYW5lbCAoZXZlbnQpXG4gICAgKi9cbiAgICBjb2xsYXBzZSAoKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcImNvbGxhcHNlKClcIik7XG4gICAgICAgIHRoaXMuRG9tVG9nZ2xlLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBDbGljayBvbiB2aXNpYmlsaXR5IGljb24gKGV2ZW50KVxuICAgICovXG4gICAgdmlzaWJsZSAoKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcInZpc2libGUoKVwiKTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuRG9tVmlzaWJpbGl0eS5jbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBjb2xsYXBzZSBvciBnZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzcGxheSAtIHNob3cvaGlkZGVuIGNvbnRhaW5lciBvciBnZXQgc3RhdHVzXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZS9mYWxzZVxuICAgICAqL1xuICAgIGRpc3BsYXkgKGRpc3BsYXkpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiZGlzcGxheSgpXCIsIGRpc3BsYXkpO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRG9tVG9nZ2xlLmh0bWxGb3IpLmNoZWNrZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiaW5saW5lLWZsZXhcIiA6IFwibm9uZVwiO1xuICAgICAgICAgICAgaWYgKHRoaXMub1N0eWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vU3R5bGUuZGlzcGxheShkaXNwbGF5ICYmIGNoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub0ZpbHRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMub0ZpbHRlci5kaXNwbGF5KGRpc3BsYXkgJiYgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5vTGVnZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vTGVnZW5kLmRpc3BsYXkoZGlzcGxheSAmJiBjaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2tlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGlzYWJsZWQvZW5hYmxlZCBzdGF0dXMgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIGRpc2FibGUvZW5hYmxlIGxheWVyIGludGVyYWN0aW9uIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgYWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiYWN0aXZlKClcIiwgYWN0aXZlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3RpdmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IChhY3RpdmUpXG4gICAgICAgICAgICAgICAgPyB0aGlzLm5hbWUuY29udGFpbmVyXG4gICAgICAgICAgICAgICAgOiB0aGlzLm5hbWUuY29udGFpbmVyICsgXCIgZGlzYWJsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9PT0gdGhpcy5uYW1lLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgdG8gZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25DbGlja0xheWVyTWFwQm94IChlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIm9uQ2xpY2tMYXllck1hcEJveFwiLCBlKTtcblxuICAgICAgICB2YXIgaWQgPSBlLnRhcmdldC5odG1sRm9yLnN1YnN0cmluZyhlLnRhcmdldC5odG1sRm9yLmluZGV4T2YoXCItXCIpKTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLnRhcmdldC5odG1sRm9yKS5jaGVja2VkO1xuXG4gICAgICAgIC8vIGdlc3Rpb24gZGVzIGlucHV0c1xuICAgICAgICBpZiAoZS50YXJnZXQuaHRtbEZvciA9PT0gdGhpcy5uYW1lLmltYWdlbGFiZWxpbnB1dCArIGlkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGl0bGVpbnB1dCArIGlkKS5jaGVja2VkID0gIWNoZWNrZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUudGFyZ2V0Lmh0bWxGb3IgPT09IHRoaXMubmFtZS50aXRsZWlucHV0ICsgaWQpIHtcbiAgICAgICAgICAgIC8vIHNpIG9wdGlvbnMucGluOmZhbHNlLCBjZSBET00gbidleGlzdGUgcGFzICFcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUuaW1hZ2VsYWJlbGlucHV0ICsgaWQpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLmltYWdlbGFiZWxpbnB1dCArIGlkKS5jaGVja2VkID0gIWNoZWNrZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXZlcnR1cmUgZHUgcGFubmVhdSBkZXMgc3R5bGVzIC8gZmlsdHJlc1xuICAgICAgICBpZiAodGhpcy5vU3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMub1N0eWxlLmRpc3BsYXkoIWNoZWNrZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9GaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub0ZpbHRlci5kaXNwbGF5KCFjaGVja2VkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhdHRlbnRpb24sXG4gICAgICAgIC8vIHNpIGxhIGxlZ2VuZGUgZXN0IG5vbiBlZGl0YWJsZSwgZWxsZSBuZSBzZSB0cm91dmUgcGFzIGRhbnMgbGUgc291cyBtZW51ICFcbiAgICAgICAgaWYgKHRoaXMub0xlZ2VuZCAmJiB0aGlzLm9MZWdlbmQuaXNFZGl0YWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9MZWdlbmQuZGlzcGxheSghY2hlY2tlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBMYXllciNlZGl0b3I6bGF5ZXI6b25jbGlja3Zpc2liaWxpdHlcbiAgICAgKi9cbiAgICBvblZpc2liaWxpdHlMYXllck1hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvblZpc2liaWxpdHlMYXllck1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3IubGF5ZXIub25jbGlja3Zpc2liaWxpdHksIGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybS4uLlxuICAgICAqXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBvcHRpb24gb2JqZWN0IGludG8gJ2UudGFyZ2V0LmRhdGEnICFcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIGlkIGVkaXRvciBpbnRvICdlLnRhcmdldC5lZGl0b3JJRCcgIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIExheWVyI2VkaXRvcjpsYXllcjpvbmNsaWNrY2xvbmVcbiAgICAgKi9cbiAgICBvbkNsb25lTGF5ZXJNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DbG9uZUxheWVyTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5sYXllci5vbmNsaWNrY2xvbmUsIGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybS4uLlxuICAgICAqXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBvcHRpb24gb2JqZWN0IGludG8gJ2UudGFyZ2V0LmRhdGEnICFcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIGlkIGVkaXRvciBpbnRvICdlLnRhcmdldC5lZGl0b3JJRCcgIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIExheWVyI2VkaXRvcjpsYXllcjpvbmNsaWNrcmVtb3ZlXG4gICAgICovXG4gICAgb25SZW1vdmVMYXllck1hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvblJlbW92ZUxheWVyTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5sYXllci5vbmNsaWNrcmVtb3ZlLCBlKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Layer.js\n"); /***/ }), @@ -2405,7 +2405,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var even /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/ColorUtils */ \"./src/Common/Utils/ColorUtils.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getLogger(\"editor-legend\");\n\n/**\n * @classdesc\n *\n * MapBox Legend management\n *\n * @constructor\n * @alias ol.style.editor.Legend\n * @param {Object} options - options for function call.\n * @param {Object} [options.target = null] - ...\n * @param {Number} [options.position = 0] - ...\n * @param {Number} [options.id = null] - (internal) ...\n * @param {Object} [options.sprites = null] - ...\n * @param {String} [options.sprites.url] - ...\n * @param {Object} [options.sprites.size] - {h:, w:} ...\n * @param {Object} [options.sprites.json] - ...\n * @param {Object} options.obj - ...\n * @param {String} [options.obj.title] - ...\n * @param {Boolean} [options.obj.editable = true] - ...\n * @param {Object} options.obj.paint - ...\n * @param {Object} options.obj.layout - ...\n * @example\n * var legend = new Legend ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * sprites : {\n * url : \"http://localhost/sprites.png\",\n * size : { w : 450, h : 550 },\n * json : {\n * icon-1 : {x:,y:,height:,width:,pixelRatio:},\n * icon-2 : {x:,y:,height:,width:,pixelRatio:}\n * }\n * },\n * obj : {\n * title : \"\",\n * editable : true, // tag non standard issue du style json dédié à l'edition\n * paint : {\"fill-color\": \"#2BB3E1\"},\n * layout : {visibility:\"none\"}\n * }\n * });\n * legend.add();\n * legend.display(true);\n * legend.isEditable();\n * legend.getRenderContainer();\n * legend.getToolsContainer();\n * legend.getContainer();\n */\nvar Legend = /*#__PURE__*/function () {\n function Legend(options) {\n _classCallCheck(this, Legend);\n logger.trace(\"[constructor] Legend\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n position: 0,\n sprites: null,\n obj: null\n };\n if (!(this instanceof Legend)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n // ################################################################### //\n // ########################## init methods ########################### //\n // ################################################################### //\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Legend, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n\n // permet d'avoir un identifiant de position dans la liste des layers\n if (!this.options.position) {\n this.options.position = 0;\n }\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition...\n this.options.obj = {\n title: \"vide...\",\n editable: true,\n paint: {\n \"fill-color\": \"#FFFFFF\"\n }\n };\n }\n\n // la legende est elle editable ?\n // le tag 'editable' est à placer dans le fichier de style (dans le layer)...\n var _editable = this.options.obj.editable;\n this.editable = typeof _editable !== \"undefined\" ? _editable : false;\n\n // liste des caractéristiques de la legende par defaut\n this.legendRender = {\n type: \"fill\",\n values: {\n width: 1,\n stroke: \"#FFFFFF\",\n color: \"#000000\",\n opacity: 1\n }\n };\n\n // DOM : pointer\n this.container = null;\n this.rendercontainer = null;\n this.toolscontainer = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxLegendTarget\",\n container: \"GPEditorMapBoxLegendContainer\",\n containerlegendrender: \"GPEditorMapBoxLegendRenderContainer\",\n legendrender: \"GPEditorMapBoxLegendRender\",\n legendeditable: \"GPEditorMapBoxLegendEditable\",\n legendtitle: \"GPEditorMapBoxLegendTitle\",\n containerlegendtools: \"GPEditorMapBoxLegendToolsContainer\"\n };\n\n // DOM : Label menu Edition\n this.labels = {\n \"line-color\": \"Couleur du trait\",\n \"line-width\": \"Epaisseur du trait\",\n \"line-opacity\": \"Opacité du trait\",\n \"fill-color\": \"Couleur de remplissage\",\n \"fill-opacity\": \"Opacité du remplissage\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n *
\n * test circle editable...\n *
\n *
...
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n var _obj = this.options.obj;\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // INFO\n // on recherche les informations dans le tag 'paint' en priorité, mais pour\n // les icones ou textes, les informations peuvent se trouver aussi dans le tag 'layout'...\n // on fusionnne paint et layout par facilité\n var style = Object.assign({}, _obj.paint, _obj.layout);\n\n // liste des properties mapbox\n // ex. fill-color\n var keys = Object.keys(style);\n if (keys.length === 0) {\n logger.info(\"tag 'paint' or 'layout' is empty !\");\n return;\n }\n\n // FIXME\n // - gestion de type plus complexe : texte avec/sans symbole ou symbole !\n // - pour les textes ou icones, les info peuvent être aussi dans le tag 'layout' !\n var params = {};\n var bFound = false;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n // recherche du type\n // ex. fill\n if (/fill-/.test(key) || /line-/.test(key) || /circle-/.test(key) || /background-/.test(key) || /text-/.test(key) || /icon-/.test(key)) {\n // style geré & trouvé\n bFound = true;\n var title = _obj.title || \"\";\n\n // INFO\n // le type texte ou icone est difficile à trouver car les 2 types cohabitent,\n // on le gère en symbole...\n var type = key.split(\"-\")[0];\n if (type === \"text\" || type === \"icon\") {\n type = \"symbol\";\n }\n this.legendRender = this._getProperties(type, style);\n params = {\n edit: this.editable,\n title: title,\n type: this.legendRender.type,\n values: this.legendRender.values\n };\n div.appendChild(this._createElementIconLegend(params));\n\n // on stoppe la recherche\n break;\n }\n }\n\n // legende avec un style indeterminé ou non géré !?\n if (!bFound) {\n // on prend la legende par defaut\n params = {\n edit: this.editable,\n title: \"\",\n type: this.legendRender.type,\n values: this.legendRender.values\n };\n div.appendChild(this._createElementIconLegend(params));\n logger.warn(\"legend type unknown, default legend used...\");\n }\n\n // ajout mode edition graphique de la legende\n this.toolscontainer = this._createElementEditionLegend(params);\n div.appendChild(this.toolscontainer);\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### private methods ############################# //\n // ################################################################### //\n /**\n * Get properties supported\n *\n * @param {Object} type - fill, line, circle, text, icon...\n * @param {Object} values - raw values from the JSON file\n * @returns {Object} - { type : (fill | line | circle | symbol), values : valuesSupported }\n *\n * @private\n * @example\n *\n * // TODO\n * // symbol with text (1) / symbol without text (2) / text (3)\n * // \"layout\":{\n * // \"icon-image\":\"{maki}-11\", \n * // \"text-font\":[\n * // \"Open Sans Semibold\",\n * // \"Arial Unicode MS Bold\"\n * // ],\n * // \"text-field\":\"{name_en}\", \n * // \"text-max-width\":9,\n * // \"text-padding\":2,\n * // \"text-offset\":[\n * // 0,\n * // 0.6\n * // ],\n * // \"text-anchor\":\"top\",\n * // \"text-size\":12\n * // },\n * // \"paint\":{\n * // \"text-color\":\"#666\",\n * // \"text-halo-color\":\"#ffffff\",\n * // \"text-halo-width\":1,\n * // \"text-halo-blur\":0.5\n * // },\n *\n */\n }, {\n key: \"_getProperties\",\n value: function _getProperties(type, values) {\n // cas particulier du symbole complexe\n // il existe plusieurs types pour un symbole :\n // - text\n // - icon\n // - icon with text\n if (type === \"symbol\") {\n var isTextValue = values[\"text-field\"];\n var isIconValue = values[\"icon-image\"];\n type = isTextValue && isIconValue ? \"icon\" : isTextValue ? \"text\" : isIconValue ? \"icon\" : \"unknow\";\n if (type === \"unknow\") {\n logger.warn(\"type unknow !?\");\n return;\n }\n }\n var valuesSupported = {};\n for (var key in values) {\n if (Object.hasOwnProperty.call(values, key)) {\n var val = values[key];\n if (Legend.PROPERTIES[type].includes(key)) {\n var prop = key.replace(type, \"\").slice(1);\n var value = this._getValue(val);\n if (value) {\n // cas particulier des sprites\n if (prop === \"pattern\" || prop === \"image\") {\n if (!this.options.sprites || !this.options.sprites.json || !this.options.sprites.json[value]) {\n var k = type + \":\" + prop;\n logger.warn(\"sprites mandatory for key \", k);\n break;\n }\n }\n valuesSupported[prop] = value;\n }\n } else {\n logger.warn(\"property not supported : \", key);\n }\n }\n }\n return {\n type: type,\n values: valuesSupported\n };\n }\n\n /**\n * Render thumbnail (SVG)\n *\n * @param {Object} type - fill, line, circle, text, ...\n * @param {Object} values - {\"color\":..., \"width\":..., \"stroke\":...., \"opacity\":...}\n * @returns {Boolean} true/false\n *\n * @private\n * @example\n * (...)\n */\n }, {\n key: \"_renderThumbnail\",\n value: function _renderThumbnail(type, values) {\n // div de rendu de la legende\n var div = this.rendercontainer;\n if (!div) {\n return false;\n }\n\n // SVG\n var svg = null;\n // facteur grossissement (x10) pour le trait\n var factor = 3;\n\n // valeur par defaut\n if (!values.color) {\n values.color = \"#FFFFFF\";\n }\n // en fonction du type, on y ajoute le style\n switch (type) {\n case \"text\":\n var styleText = \"font-size: 5em;font-weight: bold;\";\n svg = \"url(\\\"data:image/svg+xml;utf8, T \\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%opacity%\", values.opacity || 1).replace(\"%style%\", styleText);\n break;\n case \"icon\":\n if (values.image) {\n // FIXME on reste dans le paradigme d'utilisation du SVG...,\n // mais probleme de ratio de l'image !?\n svg = \"\".replace(\"%x%\", this.options.sprites.json[values.image].x).replace(\"%y%\", this.options.sprites.json[values.image].y).replace(/%w%/g, this.options.sprites.json[values.image].width).replace(/%h%/g, this.options.sprites.json[values.image].height).replace(\"%W%\", this.options.sprites.size.w).replace(\"%H%\", this.options.sprites.size.h).replace(\"%URL%\", this.options.sprites.url);\n div.innerHTML = svg;\n } else {\n var styleTextIcon = \"fill: transparent;stroke-width: 10;\";\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%style%\", styleTextIcon);\n }\n break;\n case \"line\":\n var lstrockedasharray = Array.isArray(values[\"dasharray\"]) ? values[\"dasharray\"].join(\" \") : 0;\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n // svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%stroke-opacity%\", values.opacity || 1).replace(\"%stroke-dasharray%\", lstrockedasharray).replace(\"%stroke-width%\", (values.width || 0) * factor);\n break;\n case \"circle\":\n var cstrockcolor = values[\"stroke-color\"] || \"#FFFFFF\";\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%opacity%\", values.opacity || 1).replace(\"%stroke-color%\", cstrockcolor.indexOf(\"rgb\") === 0 ? cstrockcolor : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(cstrockcolor, 1)).replace(\"%stroke-opacity%\", values[\"stroke-opacity\"] || 1).replace(\"%stroke-width%\", (values[\"stroke-width\"] || 0) * factor);\n break;\n case \"background\":\n case \"fill\":\n if (values.pattern) {\n svg = \"\".replace(\"%x%\", this.options.sprites.json[values.pattern].x).replace(\"%y%\", this.options.sprites.json[values.pattern].y).replace(/%w%/g, this.options.sprites.json[values.pattern].width).replace(/%h%/g, this.options.sprites.json[values.pattern].height).replace(\"%W%\", this.options.sprites.size.w).replace(\"%H%\", this.options.sprites.size.h).replace(\"%URL%\", this.options.sprites.url);\n div.innerHTML = svg;\n } else {\n var fstrokecolor = values[\"outline-color\"] || \"#FFFFFF\";\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%opacity%\", values.opacity || 1).replace(\"%stroke-color%\", fstrokecolor.indexOf(\"rgb\") === 0 ? fstrokecolor : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(fstrokecolor, 1));\n }\n break;\n default:\n logger.warn(\"type not found, no thumbnail...\");\n return false;\n }\n return true;\n }\n\n /**\n * Get value\n *\n * @param {*} value - value of a property (ex. \"#2BB3E1\")\n * @returns {*} return a verified value (ex. color\": \"#2BB3E1\")\n *\n * @private\n * @example\n * // type simple for fill, line or circle type with string :\n * // \"paint\": {\n * // \"fill-color\": \"#2BB3E1\"\n * // }\n *\n * // type simple for fill, line or circle type with array :\n * // \"paint\": {\n * // \"line-dasharray\": [2,10]\n * // }\n *\n * // TODO type complexe : not yet implemented !\n * // \"paint\": {\n * // \"fill-color\": [\n * // \"match\",\n * // [\"get\",\"symbo\"],\n * // \"ZONE_BOISEE\",\"#A7DA81\",\n * // \"ZONE_MANGROVE\",\"#7E8AB5\",\n * // \"#A7DA81\"\n * // ]\n * // }\n *\n * // other type complexe :\n * // \"paint\": {\n * // \"fill-color\": {\n * // \"base\": 1,\n * // \"stops\": [\n * // [\n * // 15.5,\n * // \"#f2eae2\"\n * // ],\n * // [\n * // 16,\n * // \"#dfdbd7\"\n * // ]\n * // ]\n * // }\n * // }\n */\n }, {\n key: \"_getValue\",\n value: function _getValue(value) {\n var result = null;\n if (typeof value === \"string\") {\n result = value;\n } else if (typeof value === \"number\") {\n result = value;\n } else if (Array.isArray(value)) {\n // cas d'un tableau de valeurs numériques : [1,2,3]\n var isNumber = true;\n value.forEach(function (v) {\n if (typeof v !== \"number\") {\n isNumber = false;\n }\n });\n if (isNumber) {\n result = value;\n }\n } else if (_typeof(value) === \"object\") {\n result = null;\n if (\"stops\" in value) {\n // on realise un ordre inversé sur les zooms\n value.stops.sort(function (a, b) {\n var numA = a[0];\n var numB = b[0];\n if (numA > numB) {\n return -1;\n }\n if (numA < numB) {\n return 1;\n }\n return 0;\n });\n // et, on prend le plus petit zoom\n var lastStopsValue = value.stops.slice(-1);\n result = lastStopsValue[0][1];\n }\n } else {\n logger.warn(\"value not supported !\");\n }\n return result;\n }\n\n // ################################################################### //\n // ######################### DOM methods ############################# //\n // ################################################################### //\n /**\n * Create a Graphical Legend Icon\n *\n * @param {Object} params - param\n * @param {String} params.title - title\n * @param {String} params.type - fill, line, circle, text, icon, ...\n * @param {String} params.values - {\"color\": \"#2BB3E1\", \"width\": 10, \"opacity\": 0.5, \"stroke\": \"#2BB3E1\"}\n * @param {Boolean} params.edit - editable with a colorPicker for only line, fill and circle legend !\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n *
");\">\n *
\n * vide...\n *
\n */\n }, {\n key: \"_createElementIconLegend\",\n value: function _createElementIconLegend(params) {\n // contexte\n var self = this;\n var container = document.createElement(\"div\");\n container.className = this.name.containerlegendrender;\n var div = this.rendercontainer = document.createElement(\"div\");\n div.className = this.name.legendrender;\n if (params.edit) {\n div.className += \" \";\n div.className += this.name.legendeditable;\n if (div.addEventListener) {\n div.addEventListener(\"click\", function (e) {\n self.onEditionLegendMapBox(e);\n });\n } else if (div.attachEvent) {\n div.attachEvent(\"onclick\", function (e) {\n self.onEditionLegendMapBox(e);\n });\n }\n }\n\n // type de legende\n var type = params.type;\n\n // TODO className\n // div.className += \" legend-not-implemented\";\n // ajout du style sur la div de rendu\n if (this._renderThumbnail(type, params.values)) {\n // className possibles :\n // \" legend-text\"\n // \" legend-icon\"\n // \" legend-background\"\n // \" legend-line\"\n // \" legend-line-not-editable\"\n // \" legend-circle\"\n // \" legend-circle-not-editable\"\n // \" legend-fill\"\n // \" legend-fill-not-editable\"\n div.className += params.edit ? \" legend-\" + type : \" legend-\" + type + \"-not-editable\";\n } else {\n div.className += \" legend-unknow\";\n }\n container.appendChild(div);\n var span = document.createElement(\"span\");\n span.className = this.name.legendtitle;\n span.innerHTML = params.title || \"\";\n container.appendChild(span);\n return container;\n }\n\n /**\n * Create a Graphical Legend Edition\n *\n * @param {Object} params - param\n * @param {String} params.type - fill, line, (TODO : circle, icon or text)\n * @param {String} params.values - {\"fill-color\": \"#2BB3E1\"}\n * @param {Boolean} params.edit - editable with a colorPicker for only line and fill legend !\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n */\n }, {\n key: \"_createElementEditionLegend\",\n value: function _createElementEditionLegend(params) {\n // contexte\n var self = this;\n var container = document.createElement(\"div\");\n container.className = this.name.containerlegendtools;\n\n // uniquement les elements editables !\n if (!params.edit) {\n return container;\n }\n\n // on ne traite que l'edition du mode 'traits' ou 'surfaciques'\n // mode 'line'\n switch (params.type) {\n case \"line\":\n createLineColor.call(self);\n createLineWidth.call(self);\n createLineOpacity.call(self);\n break;\n case \"background\":\n case \"fill\":\n createFillColor.call(self);\n createFillOpacity.call(self);\n break;\n default:\n break;\n }\n\n // couleur du trait\n function createLineColor() {\n var linecolor = document.createElement(\"div\");\n linecolor.className = \"legend-styling-div\";\n var lLineColor = document.createElement(\"label\");\n lLineColor.className = \"legend-line\";\n lLineColor.htmlFor = this.id ? \"line-color-\" + this.id : \"line-color\";\n lLineColor.innerHTML = this.labels[\"line-color\"];\n var inputLineColor = document.createElement(\"input\");\n inputLineColor.className = \"legend-styling\";\n inputLineColor.id = this.id ? \"line-color-\" + this.id : \"line-color\";\n inputLineColor.title = \"Selectionner une couleur de trait\";\n inputLineColor.type = \"color\";\n inputLineColor.value = params.values.color;\n inputLineColor.setAttribute(\"data-id\", \"line-color\");\n if (inputLineColor.addEventListener) {\n inputLineColor.addEventListener(\"change\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputLineColor.attachEvent) {\n inputLineColor.attachEvent(\"onchange\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n linecolor.appendChild(lLineColor);\n linecolor.appendChild(inputLineColor);\n container.appendChild(linecolor);\n }\n\n // epaisseur du trait\n function createLineWidth() {\n var linewidth = document.createElement(\"div\");\n linewidth.className = \"legend-styling-div\";\n var lLineWidth = document.createElement(\"label\");\n lLineWidth.className = \"legend-line\";\n lLineWidth.htmlFor = this.id ? \"line-width-\" + this.id : \"line-width\";\n lLineWidth.innerHTML = this.labels[\"line-width\"];\n var inputLineWidth = document.createElement(\"input\");\n inputLineWidth.className = \"legend-styling\";\n inputLineWidth.id = this.id ? \"line-width-\" + this.id : \"line-width\";\n inputLineWidth.title = params.values.width;\n inputLineWidth.type = \"range\";\n inputLineWidth.min = \"0\";\n inputLineWidth.max = \"10\";\n inputLineWidth.step = \"1\";\n inputLineWidth.defaultValue = params.values.width;\n inputLineWidth.setAttribute(\"data-id\", \"line-width\");\n if (inputLineWidth.addEventListener) {\n inputLineWidth.addEventListener(\"change\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n width: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputLineWidth.attachEvent) {\n inputLineWidth.attachEvent(\"onchange\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n width: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n linewidth.appendChild(lLineWidth);\n linewidth.appendChild(inputLineWidth);\n container.appendChild(linewidth);\n }\n\n // opacité du trait\n function createLineOpacity() {\n var lineopacity = document.createElement(\"div\");\n lineopacity.className = \"legend-styling-div\";\n var lLineOpacity = document.createElement(\"label\");\n lLineOpacity.className = \"legend-line\";\n lLineOpacity.htmlFor = this.id ? \"line-opacity-\" + this.id : \"line-opacity\";\n lLineOpacity.innerHTML = this.labels[\"line-opacity\"];\n var inputLineOpacity = document.createElement(\"input\");\n inputLineOpacity.className = \"legend-styling\";\n inputLineOpacity.id = this.id ? \"line-opacity-\" + this.id : \"line-opacity\";\n inputLineOpacity.title = params.values.opacity;\n inputLineOpacity.type = \"range\";\n inputLineOpacity.min = \"0\";\n inputLineOpacity.max = \"1\";\n inputLineOpacity.step = \"0.1\";\n inputLineOpacity.defaultValue = params.values.opacity;\n inputLineOpacity.setAttribute(\"data-id\", \"line-opacity\");\n if (inputLineOpacity.addEventListener) {\n inputLineOpacity.addEventListener(\"change\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputLineOpacity.attachEvent) {\n inputLineOpacity.attachEvent(\"onchange\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n lineopacity.appendChild(lLineOpacity);\n lineopacity.appendChild(inputLineOpacity);\n container.appendChild(lineopacity);\n }\n\n // couleur de remplissage\n function createFillColor() {\n var fillcolor = document.createElement(\"div\");\n fillcolor.className = \"legend-styling-div\";\n var lFillColor = document.createElement(\"label\");\n lFillColor.className = \"legend-fill\";\n lFillColor.htmlFor = this.id ? \"fill-color-\" + this.id : \"fill-color\";\n lFillColor.innerHTML = this.labels[\"fill-color\"];\n var inputFillColor = document.createElement(\"input\");\n inputFillColor.className = \"legend-styling\";\n inputFillColor.id = this.id ? \"fill-color-\" + this.id : \"fill-color\";\n inputFillColor.title = \"Selectionner une couleur de remplissage\";\n inputFillColor.type = \"color\";\n inputFillColor.value = params.values.color;\n inputFillColor.setAttribute(\"data-id\", \"fill-color\");\n if (inputFillColor.addEventListener) {\n inputFillColor.addEventListener(\"change\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputFillColor.attachEvent) {\n inputFillColor.attachEvent(\"onchange\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n fillcolor.appendChild(lFillColor);\n fillcolor.appendChild(inputFillColor);\n container.appendChild(fillcolor);\n }\n\n // opacité du remplissage\n function createFillOpacity() {\n var fillopacity = document.createElement(\"div\");\n fillopacity.className = \"legend-styling-div\";\n var lFillOpacity = document.createElement(\"label\");\n lFillOpacity.className = \"legend-fill\";\n lFillOpacity.htmlFor = this.id ? \"fill-opacity-\" + this.id : \"fill-opacity\";\n lFillOpacity.innerHTML = this.labels[\"fill-opacity\"];\n var inputFillOpacity = document.createElement(\"input\");\n inputFillOpacity.className = \"legend-styling\";\n inputFillOpacity.id = this.id ? \"fill-opacity-\" + this.id : \"fill-opacity\";\n inputFillOpacity.title = params.values.opacity;\n inputFillOpacity.type = \"range\";\n inputFillOpacity.min = \"0\";\n inputFillOpacity.max = \"1\";\n inputFillOpacity.step = \"0.1\";\n inputFillOpacity.defaultValue = params.values.opacity;\n inputFillOpacity.setAttribute(\"data-id\", \"fill-opacity\");\n if (inputFillOpacity.addEventListener) {\n inputFillOpacity.addEventListener(\"change\", function (e) {\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputFillOpacity.attachEvent) {\n inputFillOpacity.attachEvent(\"onchange\", function (e) {\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n fillopacity.appendChild(lFillOpacity);\n fillopacity.appendChild(inputFillOpacity);\n container.appendChild(fillopacity);\n }\n return container;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n *\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Is editable\n *\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"isEditable\",\n value: function isEditable() {\n return this.editable;\n }\n\n /**\n * Get container Legend Render (DOM)\n *\n * @returns {DOMElement} DOM element\n * @see Layer.prototype.slotLegend()\n * @example\n *
\n */\n }, {\n key: \"getRenderContainer\",\n value: function getRenderContainer() {\n return this.rendercontainer;\n }\n\n /**\n * Get container Legend Tools (DOM)\n *\n * @returns {DOMElement} DOM element\n * @see Layer.prototype.slotLegend()\n * @example\n *
...
\n */\n }, {\n key: \"getToolsContainer\",\n value: function getToolsContainer() {\n return this.toolscontainer;\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Legend#editor:legend:onclickedition\n */\n }, {\n key: \"onEditionLegendMapBox\",\n value: function onEditionLegendMapBox(e) {\n logger.trace(\"onEditionLegendMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].legend.onclickedition, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Legend#editor:legend:onchangevalue\n */\n }, {\n key: \"onChangeValueLegendMapBox\",\n value: function onChangeValueLegendMapBox(e) {\n logger.trace(\"onChangeValueLegendMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].legend.onchangevalue, e);\n }\n }]);\n}();\n;\n;\n\n// ################################################################### //\n// ########################## CONSTANTES ############################# //\n// ################################################################### //\n\n/**\n * List of supported properties\n */\nLegend.PROPERTIES = {\n line: [\"line-color\", \"line-dasharray\", \"line-opacity\", \"line-width\"],\n fill: [\"fill-color\", \"fill-opacity\", \"fill-outline-color\", \"fill-pattern\"],\n background: [\"background-color\", \"background-opacity\", \"background-pattern\"],\n circle: [\"circle-color\", \"circle-opacity\", \"circle-stroke-color\", \"circle-stroke-opacity\", \"circle-stroke-width\"],\n icon: [\"icon-color\", \"icon-image\", \"icon-opacity\", \"__icon-size\"],\n text: [\"__text-anchor\", \"text-color\", \"text-field\", \"__text-font\", \"__text-opacity\", \"__text-size\"]\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Legend);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9MZWdlbmQuanM/OWJiMSJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJMZWdlbmQiLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsInNwcml0ZXMiLCJvYmoiLCJUeXBlRXJyb3IiLCJfaW5pdGlhbGl6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJpZCIsInRpdGxlIiwiZWRpdGFibGUiLCJwYWludCIsIl9lZGl0YWJsZSIsImxlZ2VuZFJlbmRlciIsInR5cGUiLCJ2YWx1ZXMiLCJ3aWR0aCIsInN0cm9rZSIsImNvbG9yIiwib3BhY2l0eSIsImNvbnRhaW5lciIsInJlbmRlcmNvbnRhaW5lciIsInRvb2xzY29udGFpbmVyIiwibmFtZSIsImNvbnRhaW5lcmxlZ2VuZHJlbmRlciIsImxlZ2VuZHJlbmRlciIsImxlZ2VuZGVkaXRhYmxlIiwibGVnZW5kdGl0bGUiLCJjb250YWluZXJsZWdlbmR0b29scyIsImxhYmVscyIsIl9vYmoiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJzdHlsZSIsIk9iamVjdCIsImFzc2lnbiIsImxheW91dCIsImtleXMiLCJsZW5ndGgiLCJpbmZvIiwicGFyYW1zIiwiYkZvdW5kIiwiaSIsInRlc3QiLCJzcGxpdCIsIl9nZXRQcm9wZXJ0aWVzIiwiZWRpdCIsImFwcGVuZENoaWxkIiwiX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kIiwid2FybiIsIl9jcmVhdGVFbGVtZW50RWRpdGlvbkxlZ2VuZCIsImlzVGV4dFZhbHVlIiwiaXNJY29uVmFsdWUiLCJ2YWx1ZXNTdXBwb3J0ZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ2YWwiLCJQUk9QRVJUSUVTIiwiaW5jbHVkZXMiLCJwcm9wIiwicmVwbGFjZSIsInNsaWNlIiwiX2dldFZhbHVlIiwianNvbiIsImsiLCJfcmVuZGVyVGh1bWJuYWlsIiwic3ZnIiwiZmFjdG9yIiwic3R5bGVUZXh0IiwiaW5kZXhPZiIsIkNvbG9yIiwiaGV4VG9SZ2JhIiwiaW1hZ2UiLCJ4IiwieSIsImhlaWdodCIsInNpemUiLCJ3IiwiaCIsInVybCIsImlubmVySFRNTCIsInN0eWxlVGV4dEljb24iLCJsc3Ryb2NrZWRhc2hhcnJheSIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJjc3Ryb2NrY29sb3IiLCJwYXR0ZXJuIiwiZnN0cm9rZWNvbG9yIiwicmVzdWx0IiwiaXNOdW1iZXIiLCJmb3JFYWNoIiwidiIsIl90eXBlb2YiLCJzdG9wcyIsInNvcnQiLCJhIiwiYiIsIm51bUEiLCJudW1CIiwibGFzdFN0b3BzVmFsdWUiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJvbkVkaXRpb25MZWdlbmRNYXBCb3giLCJhdHRhY2hFdmVudCIsInNwYW4iLCJjcmVhdGVMaW5lQ29sb3IiLCJjcmVhdGVMaW5lV2lkdGgiLCJjcmVhdGVMaW5lT3BhY2l0eSIsImNyZWF0ZUZpbGxDb2xvciIsImNyZWF0ZUZpbGxPcGFjaXR5IiwibGluZWNvbG9yIiwibExpbmVDb2xvciIsImh0bWxGb3IiLCJpbnB1dExpbmVDb2xvciIsInNldEF0dHJpYnV0ZSIsIm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3giLCJsaW5ld2lkdGgiLCJsTGluZVdpZHRoIiwiaW5wdXRMaW5lV2lkdGgiLCJtaW4iLCJtYXgiLCJzdGVwIiwiZGVmYXVsdFZhbHVlIiwibGluZW9wYWNpdHkiLCJsTGluZU9wYWNpdHkiLCJpbnB1dExpbmVPcGFjaXR5IiwiZmlsbGNvbG9yIiwibEZpbGxDb2xvciIsImlucHV0RmlsbENvbG9yIiwiZmlsbG9wYWNpdHkiLCJsRmlsbE9wYWNpdHkiLCJpbnB1dEZpbGxPcGFjaXR5IiwiYWRkIiwiZ2V0RWxlbWVudEJ5SWQiLCJub2RlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkaXNwbGF5IiwiaXNFZGl0YWJsZSIsImdldFJlbmRlckNvbnRhaW5lciIsImdldFRvb2xzQ29udGFpbmVyIiwiZ2V0Q29udGFpbmVyIiwiZWRpdG9ySUQiLCJkYXRhIiwiRXZlbnRCdXMiLCJkaXNwYXRjaCIsIkV2ZW50RWRpdG9yIiwibGVnZW5kIiwib25jbGlja2VkaXRpb24iLCJvbmNoYW5nZXZhbHVlIiwibGluZSIsImZpbGwiLCJiYWNrZ3JvdW5kIiwiY2lyY2xlIiwiaWNvbiIsInRleHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ3lCO0FBQ047QUFFckQsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsZUFBZSxDQUFDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdDQSxJQThDTUMsTUFBTTtFQUVSLFNBQUFBLE9BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLE1BQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHNCQUFzQixFQUFFRixPQUFPLENBQUM7O0lBRTdDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtNQUNBRyxNQUFNLEVBQUcsSUFBSTtNQUNiQyxRQUFRLEVBQUcsQ0FBQztNQUNaQyxPQUFPLEVBQUcsSUFBSTtNQUNkQyxHQUFHLEVBQUc7SUFDVixDQUFDO0lBRUQsSUFBSSxFQUFFLElBQUksWUFBWVAsTUFBTSxDQUFDLEVBQUU7TUFDM0IsTUFBTSxJQUFJUSxTQUFTLENBQUMseUJBQXlCLENBQUM7SUFDbEQ7SUFFQSxJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0lBRWxCLElBQUksQ0FBQ0MsY0FBYyxDQUFDLENBQUM7RUFDekI7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEksT0FBQUMsWUFBQSxDQUFBWCxNQUFBO0lBQUFZLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUFKLFlBQUEsRUFBZTtNQUNYO01BQ0EsSUFBSSxDQUFDSyxFQUFFLEdBQUcsSUFBSSxDQUFDYixPQUFPLENBQUNhLEVBQUUsSUFBSSxJQUFJO01BRWpDLElBQUksQ0FBQyxJQUFJLENBQUNiLE9BQU8sQ0FBQ0csTUFBTSxFQUFFO1FBQ3RCO01BQUE7O01BR0o7TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDSCxPQUFPLENBQUNJLFFBQVEsRUFBRTtRQUN4QixJQUFJLENBQUNKLE9BQU8sQ0FBQ0ksUUFBUSxHQUFHLENBQUM7TUFDN0I7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDSixPQUFPLENBQUNNLEdBQUcsRUFBRTtRQUNuQjtRQUNBLElBQUksQ0FBQ04sT0FBTyxDQUFDTSxHQUFHLEdBQUc7VUFDZlEsS0FBSyxFQUFHLFNBQVM7VUFDakJDLFFBQVEsRUFBRyxJQUFJO1VBQ2ZDLEtBQUssRUFBRztZQUNKLFlBQVksRUFBRztVQUNuQjtRQUNKLENBQUM7TUFDTDs7TUFFQTtNQUNBO01BQ0EsSUFBSUMsU0FBUyxHQUFHLElBQUksQ0FBQ2pCLE9BQU8sQ0FBQ00sR0FBRyxDQUFDUyxRQUFRO01BQ3pDLElBQUksQ0FBQ0EsUUFBUSxHQUFJLE9BQU9FLFNBQVMsS0FBSyxXQUFXLEdBQUlBLFNBQVMsR0FBRyxLQUFLOztNQUV0RTtNQUNBLElBQUksQ0FBQ0MsWUFBWSxHQUFHO1FBQ2hCQyxJQUFJLEVBQUcsTUFBTTtRQUNiQyxNQUFNLEVBQUc7VUFDTEMsS0FBSyxFQUFHLENBQUM7VUFDVEMsTUFBTSxFQUFHLFNBQVM7VUFDbEJDLEtBQUssRUFBRyxTQUFTO1VBQ2pCQyxPQUFPLEVBQUc7UUFDZDtNQUNKLENBQUM7O01BRUQ7TUFDQSxJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJO01BQ3JCLElBQUksQ0FBQ0MsZUFBZSxHQUFHLElBQUk7TUFDM0IsSUFBSSxDQUFDQyxjQUFjLEdBQUcsSUFBSTs7TUFFMUI7TUFDQSxJQUFJLENBQUNDLElBQUksR0FBRztRQUNSekIsTUFBTSxFQUFHLDRCQUE0QjtRQUNyQ3NCLFNBQVMsRUFBRywrQkFBK0I7UUFDM0NJLHFCQUFxQixFQUFHLHFDQUFxQztRQUM3REMsWUFBWSxFQUFHLDRCQUE0QjtRQUMzQ0MsY0FBYyxFQUFHLDhCQUE4QjtRQUMvQ0MsV0FBVyxFQUFHLDJCQUEyQjtRQUN6Q0Msb0JBQW9CLEVBQUc7TUFDM0IsQ0FBQzs7TUFFRDtNQUNBLElBQUksQ0FBQ0MsTUFBTSxHQUFHO1FBQ1YsWUFBWSxFQUFHLGtCQUFrQjtRQUNqQyxZQUFZLEVBQUcsb0JBQW9CO1FBQ25DLGNBQWMsRUFBRyxrQkFBa0I7UUFDbkMsWUFBWSxFQUFHLHdCQUF3QjtRQUN2QyxjQUFjLEVBQUc7TUFDckIsQ0FBQztJQUNMOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFiSTtJQUFBdkIsR0FBQTtJQUFBQyxLQUFBLEVBY0EsU0FBQUgsZUFBQSxFQUFrQjtNQUNkLElBQUkwQixJQUFJLEdBQUcsSUFBSSxDQUFDbkMsT0FBTyxDQUFDTSxHQUFHO01BRTNCLElBQUk4QixHQUFHLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztNQUN2Q0YsR0FBRyxDQUFDRyxTQUFTLEdBQUcsSUFBSSxDQUFDWCxJQUFJLENBQUNILFNBQVM7O01BRW5DO01BQ0E7TUFDQTtNQUNBO01BQ0EsSUFBSWUsS0FBSyxHQUFHQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRVAsSUFBSSxDQUFDbkIsS0FBSyxFQUFFbUIsSUFBSSxDQUFDUSxNQUFNLENBQUM7O01BRXREO01BQ0E7TUFDQSxJQUFJQyxJQUFJLEdBQUdILE1BQU0sQ0FBQ0csSUFBSSxDQUFDSixLQUFLLENBQUM7TUFDN0IsSUFBSUksSUFBSSxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ25CakQsTUFBTSxDQUFDa0QsSUFBSSxDQUFDLG9DQUFvQyxDQUFDO1FBQ2pEO01BQ0o7O01BRUE7TUFDQTtNQUNBO01BQ0EsSUFBSUMsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUNmLElBQUlDLE1BQU0sR0FBRyxLQUFLO01BQ2xCLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHTCxJQUFJLENBQUNDLE1BQU0sRUFBRUksQ0FBQyxFQUFFLEVBQUU7UUFDbEMsSUFBSXRDLEdBQUcsR0FBR2lDLElBQUksQ0FBQ0ssQ0FBQyxDQUFDO1FBQ2pCO1FBQ0E7UUFDQSxJQUFJLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDdkMsR0FBRyxDQUFDLElBQ2pCLE9BQU8sQ0FBQ3VDLElBQUksQ0FBQ3ZDLEdBQUcsQ0FBQyxJQUNqQixTQUFTLENBQUN1QyxJQUFJLENBQUN2QyxHQUFHLENBQUMsSUFDbkIsYUFBYSxDQUFDdUMsSUFBSSxDQUFDdkMsR0FBRyxDQUFDLElBQ3ZCLE9BQU8sQ0FBQ3VDLElBQUksQ0FBQ3ZDLEdBQUcsQ0FBQyxJQUNqQixPQUFPLENBQUN1QyxJQUFJLENBQUN2QyxHQUFHLENBQUMsRUFBRTtVQUNuQjtVQUNBcUMsTUFBTSxHQUFHLElBQUk7VUFFYixJQUFJbEMsS0FBSyxHQUFHcUIsSUFBSSxDQUFDckIsS0FBSyxJQUFJLEVBQUU7O1VBRTVCO1VBQ0E7VUFDQTtVQUNBLElBQUlLLElBQUksR0FBR1IsR0FBRyxDQUFDd0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUM1QixJQUFJaEMsSUFBSSxLQUFLLE1BQU0sSUFBSUEsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNwQ0EsSUFBSSxHQUFHLFFBQVE7VUFDbkI7VUFFQSxJQUFJLENBQUNELFlBQVksR0FBRyxJQUFJLENBQUNrQyxjQUFjLENBQUNqQyxJQUFJLEVBQUVxQixLQUFLLENBQUM7VUFDcERPLE1BQU0sR0FBRztZQUNMTSxJQUFJLEVBQUcsSUFBSSxDQUFDdEMsUUFBUTtZQUNwQkQsS0FBSyxFQUFHQSxLQUFLO1lBQ2JLLElBQUksRUFBRyxJQUFJLENBQUNELFlBQVksQ0FBQ0MsSUFBSTtZQUM3QkMsTUFBTSxFQUFHLElBQUksQ0FBQ0YsWUFBWSxDQUFDRTtVQUMvQixDQUFDO1VBQ0RnQixHQUFHLENBQUNrQixXQUFXLENBQUMsSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQ1IsTUFBTSxDQUFDLENBQUM7O1VBRXREO1VBQ0E7UUFDSjtNQUNKOztNQUVBO01BQ0EsSUFBSSxDQUFDQyxNQUFNLEVBQUU7UUFDVDtRQUNBRCxNQUFNLEdBQUc7VUFDTE0sSUFBSSxFQUFHLElBQUksQ0FBQ3RDLFFBQVE7VUFDcEJELEtBQUssRUFBRyxFQUFFO1VBQ1ZLLElBQUksRUFBRyxJQUFJLENBQUNELFlBQVksQ0FBQ0MsSUFBSTtVQUM3QkMsTUFBTSxFQUFHLElBQUksQ0FBQ0YsWUFBWSxDQUFDRTtRQUMvQixDQUFDO1FBQ0RnQixHQUFHLENBQUNrQixXQUFXLENBQUMsSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQ1IsTUFBTSxDQUFDLENBQUM7UUFDdERuRCxNQUFNLENBQUM0RCxJQUFJLENBQUMsNkNBQTZDLENBQUM7TUFDOUQ7O01BRUE7TUFDQSxJQUFJLENBQUM3QixjQUFjLEdBQUcsSUFBSSxDQUFDOEIsMkJBQTJCLENBQUNWLE1BQU0sQ0FBQztNQUM5RFgsR0FBRyxDQUFDa0IsV0FBVyxDQUFDLElBQUksQ0FBQzNCLGNBQWMsQ0FBQzs7TUFFcEM7TUFDQSxJQUFJLENBQUNGLFNBQVMsR0FBR1csR0FBRztJQUN4Qjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFuQ0k7SUFBQXpCLEdBQUE7SUFBQUMsS0FBQSxFQW9DQSxTQUFBd0MsZUFBZ0JqQyxJQUFJLEVBQUVDLE1BQU0sRUFBRTtNQUMxQjtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0EsSUFBSUQsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUNuQixJQUFJdUMsV0FBVyxHQUFHdEMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJdUMsV0FBVyxHQUFHdkMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN0Q0QsSUFBSSxHQUFJdUMsV0FBVyxJQUFJQyxXQUFXLEdBQUksTUFBTSxHQUFJRCxXQUFXLEdBQUksTUFBTSxHQUFJQyxXQUFXLEdBQUksTUFBTSxHQUFHLFFBQVE7UUFDekcsSUFBSXhDLElBQUksS0FBSyxRQUFRLEVBQUU7VUFDbkJ2QixNQUFNLENBQUM0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUM7VUFDN0I7UUFDSjtNQUNKO01BRUEsSUFBSUksZUFBZSxHQUFHLENBQUMsQ0FBQztNQUN4QixLQUFLLElBQU1qRCxHQUFHLElBQUlTLE1BQU0sRUFBRTtRQUN0QixJQUFJcUIsTUFBTSxDQUFDb0IsY0FBYyxDQUFDQyxJQUFJLENBQUMxQyxNQUFNLEVBQUVULEdBQUcsQ0FBQyxFQUFFO1VBQ3pDLElBQU1vRCxHQUFHLEdBQUczQyxNQUFNLENBQUNULEdBQUcsQ0FBQztVQUN2QixJQUFJWixNQUFNLENBQUNpRSxVQUFVLENBQUM3QyxJQUFJLENBQUMsQ0FBQzhDLFFBQVEsQ0FBQ3RELEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLElBQUl1RCxJQUFJLEdBQUd2RCxHQUFHLENBQUN3RCxPQUFPLENBQUNoRCxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUNpRCxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUl4RCxLQUFLLEdBQUcsSUFBSSxDQUFDeUQsU0FBUyxDQUFDTixHQUFHLENBQUM7WUFDL0IsSUFBSW5ELEtBQUssRUFBRTtjQUNQO2NBQ0EsSUFBSXNELElBQUksS0FBSyxTQUFTLElBQUlBLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUNsRSxPQUFPLENBQUNLLE9BQU8sSUFDckIsQ0FBQyxJQUFJLENBQUNMLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDaUUsSUFBSSxJQUMxQixDQUFDLElBQUksQ0FBQ3RFLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDaUUsSUFBSSxDQUFDMUQsS0FBSyxDQUFDLEVBQUU7a0JBQ25DLElBQUkyRCxDQUFDLEdBQUdwRCxJQUFJLEdBQUcsR0FBRyxHQUFHK0MsSUFBSTtrQkFDekJ0RSxNQUFNLENBQUM0RCxJQUFJLENBQUMsNEJBQTRCLEVBQUVlLENBQUMsQ0FBQztrQkFDNUM7Z0JBQ0o7Y0FDSjtjQUNBWCxlQUFlLENBQUNNLElBQUksQ0FBQyxHQUFHdEQsS0FBSztZQUNqQztVQUNKLENBQUMsTUFBTTtZQUNIaEIsTUFBTSxDQUFDNEQsSUFBSSxDQUFDLDJCQUEyQixFQUFFN0MsR0FBRyxDQUFDO1VBQ2pEO1FBQ0o7TUFDSjtNQUVBLE9BQU87UUFDSFEsSUFBSSxFQUFHQSxJQUFJO1FBQ1hDLE1BQU0sRUFBR3dDO01BQ2IsQ0FBQztJQUNMOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFWSTtJQUFBakQsR0FBQTtJQUFBQyxLQUFBLEVBV0EsU0FBQTRELGlCQUFrQnJELElBQUksRUFBRUMsTUFBTSxFQUFFO01BQzVCO01BQ0EsSUFBSWdCLEdBQUcsR0FBRyxJQUFJLENBQUNWLGVBQWU7TUFFOUIsSUFBSSxDQUFDVSxHQUFHLEVBQUU7UUFDTixPQUFPLEtBQUs7TUFDaEI7O01BRUE7TUFDQSxJQUFJcUMsR0FBRyxHQUFHLElBQUk7TUFDZDtNQUNBLElBQUlDLE1BQU0sR0FBRyxDQUFDOztNQUVkO01BQ0EsSUFBSSxDQUFDdEQsTUFBTSxDQUFDRyxLQUFLLEVBQUU7UUFDZkgsTUFBTSxDQUFDRyxLQUFLLEdBQUcsU0FBUztNQUM1QjtNQUNBO01BQ0EsUUFBUUosSUFBSTtRQUNSLEtBQUssTUFBTTtVQUNQLElBQUl3RCxTQUFTLEdBQUcsbUNBQW1DO1VBQ25ERixHQUFHLEdBQUcsd1JBQXdSO1VBQzlSckMsR0FBRyxDQUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUdpQyxHQUFHLENBQ3hCTixPQUFPLENBQUMsU0FBUyxFQUFHL0MsTUFBTSxDQUFDRyxLQUFLLENBQUNxRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFJeEQsTUFBTSxDQUFDRyxLQUFLLEdBQUdzRCxnRUFBSyxDQUFDQyxTQUFTLENBQUMxRCxNQUFNLENBQUNHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN6RzRDLE9BQU8sQ0FBQyxXQUFXLEVBQUUvQyxNQUFNLENBQUNJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FDekMyQyxPQUFPLENBQUMsU0FBUyxFQUFFUSxTQUFTLENBQUM7VUFDbEM7UUFDSixLQUFLLE1BQU07VUFDUCxJQUFJdkQsTUFBTSxDQUFDMkQsS0FBSyxFQUFFO1lBQ2Q7WUFDQTtZQUNBTixHQUFHLEdBQUcsNE1BQTRNLENBQzdNTixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ25FLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDaUUsSUFBSSxDQUFDbEQsTUFBTSxDQUFDMkQsS0FBSyxDQUFDLENBQUNDLENBQUMsQ0FBQyxDQUN6RGIsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUNuRSxPQUFPLENBQUNLLE9BQU8sQ0FBQ2lFLElBQUksQ0FBQ2xELE1BQU0sQ0FBQzJELEtBQUssQ0FBQyxDQUFDRSxDQUFDLENBQUMsQ0FDekRkLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDbkUsT0FBTyxDQUFDSyxPQUFPLENBQUNpRSxJQUFJLENBQUNsRCxNQUFNLENBQUMyRCxLQUFLLENBQUMsQ0FBQzFELEtBQUssQ0FBQyxDQUM5RDhDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDbkUsT0FBTyxDQUFDSyxPQUFPLENBQUNpRSxJQUFJLENBQUNsRCxNQUFNLENBQUMyRCxLQUFLLENBQUMsQ0FBQ0csTUFBTSxDQUFDLENBQy9EZixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ25FLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDOEUsSUFBSSxDQUFDQyxDQUFDLENBQUMsQ0FDM0NqQixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ25FLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDOEUsSUFBSSxDQUFDRSxDQUFDLENBQUMsQ0FDM0NsQixPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQ25FLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDaUYsR0FBRyxDQUFDO1lBQy9DbEQsR0FBRyxDQUFDbUQsU0FBUyxHQUFHZCxHQUFHO1VBQ3ZCLENBQUMsTUFBTTtZQUNILElBQUllLGFBQWEsR0FBRyxxQ0FBcUM7WUFDekRmLEdBQUcsR0FBRyxzTkFBc047WUFDNU5yQyxHQUFHLENBQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBR2lDLEdBQUcsQ0FDeEJOLE9BQU8sQ0FBQyxTQUFTLEVBQUcvQyxNQUFNLENBQUNHLEtBQUssQ0FBQ3FELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUl4RCxNQUFNLENBQUNHLEtBQUssR0FBR3NELGdFQUFLLENBQUNDLFNBQVMsQ0FBQzFELE1BQU0sQ0FBQ0csS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3pHNEMsT0FBTyxDQUFDLFNBQVMsRUFBRXFCLGFBQWEsQ0FBQztVQUMxQztVQUNBO1FBQ0osS0FBSyxNQUFNO1VBQ1AsSUFBSUMsaUJBQWlCLEdBQUlDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDdkUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUlBLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQ3dFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1VBQ2hHbkIsR0FBRyxHQUFHLCtTQUErUztVQUNyVDtVQUNBckMsR0FBRyxDQUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUdpQyxHQUFHLENBQ3hCTixPQUFPLENBQUMsU0FBUyxFQUFHL0MsTUFBTSxDQUFDRyxLQUFLLENBQUNxRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFJeEQsTUFBTSxDQUFDRyxLQUFLLEdBQUdzRCxnRUFBSyxDQUFDQyxTQUFTLENBQUMxRCxNQUFNLENBQUNHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN6RzRDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRS9DLE1BQU0sQ0FBQ0ksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUNoRDJDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRXNCLGlCQUFpQixDQUFDLENBQ2hEdEIsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMvQyxNQUFNLENBQUNDLEtBQUssSUFBSSxDQUFDLElBQUlxRCxNQUFNLENBQUM7VUFDNUQ7UUFDSixLQUFLLFFBQVE7VUFDVCxJQUFJbUIsWUFBWSxHQUFHekUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLFNBQVM7VUFDdERxRCxHQUFHLEdBQUcsaVRBQWlUO1VBQ3ZUckMsR0FBRyxDQUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUdpQyxHQUFHLENBQ3hCTixPQUFPLENBQUMsU0FBUyxFQUFHL0MsTUFBTSxDQUFDRyxLQUFLLENBQUNxRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFJeEQsTUFBTSxDQUFDRyxLQUFLLEdBQUdzRCxnRUFBSyxDQUFDQyxTQUFTLENBQUMxRCxNQUFNLENBQUNHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN6RzRDLE9BQU8sQ0FBQyxXQUFXLEVBQUUvQyxNQUFNLENBQUNJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FDekMyQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUcwQixZQUFZLENBQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFJaUIsWUFBWSxHQUFHaEIsZ0VBQUssQ0FBQ0MsU0FBUyxDQUFDZSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDaEgxQixPQUFPLENBQUMsa0JBQWtCLEVBQUUvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDMUQrQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQy9DLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUlzRCxNQUFNLENBQUM7VUFDdEU7UUFDSixLQUFLLFlBQVk7UUFDakIsS0FBSyxNQUFNO1VBQ1AsSUFBSXRELE1BQU0sQ0FBQzBFLE9BQU8sRUFBRTtZQUNoQnJCLEdBQUcsR0FBRyw0TUFBNE0sQ0FDN01OLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDbkUsT0FBTyxDQUFDSyxPQUFPLENBQUNpRSxJQUFJLENBQUNsRCxNQUFNLENBQUMwRSxPQUFPLENBQUMsQ0FBQ2QsQ0FBQyxDQUFDLENBQzNEYixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ25FLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDaUUsSUFBSSxDQUFDbEQsTUFBTSxDQUFDMEUsT0FBTyxDQUFDLENBQUNiLENBQUMsQ0FBQyxDQUMzRGQsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUNuRSxPQUFPLENBQUNLLE9BQU8sQ0FBQ2lFLElBQUksQ0FBQ2xELE1BQU0sQ0FBQzBFLE9BQU8sQ0FBQyxDQUFDekUsS0FBSyxDQUFDLENBQ2hFOEMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUNuRSxPQUFPLENBQUNLLE9BQU8sQ0FBQ2lFLElBQUksQ0FBQ2xELE1BQU0sQ0FBQzBFLE9BQU8sQ0FBQyxDQUFDWixNQUFNLENBQUMsQ0FDakVmLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDbkUsT0FBTyxDQUFDSyxPQUFPLENBQUM4RSxJQUFJLENBQUNDLENBQUMsQ0FBQyxDQUMzQ2pCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDbkUsT0FBTyxDQUFDSyxPQUFPLENBQUM4RSxJQUFJLENBQUNFLENBQUMsQ0FBQyxDQUMzQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDbkUsT0FBTyxDQUFDSyxPQUFPLENBQUNpRixHQUFHLENBQUM7WUFDL0NsRCxHQUFHLENBQUNtRCxTQUFTLEdBQUdkLEdBQUc7VUFDdkIsQ0FBQyxNQUFNO1lBQ0gsSUFBSXNCLFlBQVksR0FBRzNFLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxTQUFTO1lBQ3ZEcUQsR0FBRyxHQUFHLDRSQUE0UjtZQUNsU3JDLEdBQUcsQ0FBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHaUMsR0FBRyxDQUN4Qk4sT0FBTyxDQUFDLFNBQVMsRUFBRy9DLE1BQU0sQ0FBQ0csS0FBSyxDQUFDcUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBSXhELE1BQU0sQ0FBQ0csS0FBSyxHQUFHc0QsZ0VBQUssQ0FBQ0MsU0FBUyxDQUFDMUQsTUFBTSxDQUFDRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDekc0QyxPQUFPLENBQUMsV0FBVyxFQUFFL0MsTUFBTSxDQUFDSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQ3pDMkMsT0FBTyxDQUFDLGdCQUFnQixFQUFHNEIsWUFBWSxDQUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBSW1CLFlBQVksR0FBR2xCLGdFQUFLLENBQUNDLFNBQVMsQ0FBQ2lCLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztVQUN6SDtVQUNBO1FBQ0o7VUFDSW5HLE1BQU0sQ0FBQzRELElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztVQUM5QyxPQUFPLEtBQUs7TUFDcEI7TUFFQSxPQUFPLElBQUk7SUFDZjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQTdDSTtJQUFBN0MsR0FBQTtJQUFBQyxLQUFBLEVBOENBLFNBQUF5RCxVQUFXekQsS0FBSyxFQUFFO01BQ2QsSUFBSW9GLE1BQU0sR0FBRyxJQUFJO01BQ2pCLElBQUksT0FBT3BGLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDM0JvRixNQUFNLEdBQUdwRixLQUFLO01BQ2xCLENBQUMsTUFBTSxJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDbENvRixNQUFNLEdBQUdwRixLQUFLO01BQ2xCLENBQUMsTUFBTSxJQUFJOEUsS0FBSyxDQUFDQyxPQUFPLENBQUMvRSxLQUFLLENBQUMsRUFBRTtRQUM3QjtRQUNBLElBQUlxRixRQUFRLEdBQUcsSUFBSTtRQUNuQnJGLEtBQUssQ0FBQ3NGLE9BQU8sQ0FBQyxVQUFBQyxDQUFDLEVBQUk7VUFDZixJQUFJLE9BQU9BLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDdkJGLFFBQVEsR0FBRyxLQUFLO1VBQ3BCO1FBQ0osQ0FBQyxDQUFDO1FBQ0YsSUFBSUEsUUFBUSxFQUFFO1VBQ1ZELE1BQU0sR0FBR3BGLEtBQUs7UUFDbEI7TUFDSixDQUFDLE1BQU0sSUFBSXdGLE9BQUEsQ0FBT3hGLEtBQUssTUFBSyxRQUFRLEVBQUU7UUFDbENvRixNQUFNLEdBQUcsSUFBSTtRQUNiLElBQUksT0FBTyxJQUFJcEYsS0FBSyxFQUFFO1VBQ2xCO1VBQ0FBLEtBQUssQ0FBQ3lGLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLFVBQUNDLENBQUMsRUFBRUMsQ0FBQyxFQUFLO1lBQ3ZCLElBQUlDLElBQUksR0FBR0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLElBQUlHLElBQUksR0FBR0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLElBQUlDLElBQUksR0FBR0MsSUFBSSxFQUFFO2NBQ2IsT0FBTyxDQUFDLENBQUM7WUFDYjtZQUNBLElBQUlELElBQUksR0FBR0MsSUFBSSxFQUFFO2NBQ2IsT0FBTyxDQUFDO1lBQ1o7WUFDQSxPQUFPLENBQUM7VUFDWixDQUFDLENBQUM7VUFDRjtVQUNBLElBQUlDLGNBQWMsR0FBRy9GLEtBQUssQ0FBQ3lGLEtBQUssQ0FBQ2pDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUMxQzRCLE1BQU0sR0FBR1csY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQztNQUNKLENBQUMsTUFBTTtRQUNIL0csTUFBTSxDQUFDNEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDO01BQ3hDO01BQ0EsT0FBT3dDLE1BQU07SUFDakI7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFsQkk7SUFBQXJGLEdBQUE7SUFBQUMsS0FBQSxFQW1CQSxTQUFBMkMseUJBQTBCUixNQUFNLEVBQUU7TUFDOUI7TUFDQSxJQUFJNkQsSUFBSSxHQUFHLElBQUk7TUFFZixJQUFJbkYsU0FBUyxHQUFHWSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDN0NiLFNBQVMsQ0FBQ2MsU0FBUyxHQUFHLElBQUksQ0FBQ1gsSUFBSSxDQUFDQyxxQkFBcUI7TUFFckQsSUFBSU8sR0FBRyxHQUFHLElBQUksQ0FBQ1YsZUFBZSxHQUFHVyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDOURGLEdBQUcsQ0FBQ0csU0FBUyxHQUFHLElBQUksQ0FBQ1gsSUFBSSxDQUFDRSxZQUFZO01BQ3RDLElBQUlpQixNQUFNLENBQUNNLElBQUksRUFBRTtRQUNiakIsR0FBRyxDQUFDRyxTQUFTLElBQUksR0FBRztRQUNwQkgsR0FBRyxDQUFDRyxTQUFTLElBQUksSUFBSSxDQUFDWCxJQUFJLENBQUNHLGNBQWM7UUFDekMsSUFBSUssR0FBRyxDQUFDeUUsZ0JBQWdCLEVBQUU7VUFDdEJ6RSxHQUFHLENBQUN5RSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsVUFBVUMsQ0FBQyxFQUFFO1lBQ3ZDRixJQUFJLENBQUNHLHFCQUFxQixDQUFDRCxDQUFDLENBQUM7VUFDakMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxNQUFNLElBQUkxRSxHQUFHLENBQUM0RSxXQUFXLEVBQUU7VUFDeEI1RSxHQUFHLENBQUM0RSxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVVGLENBQUMsRUFBRTtZQUNwQ0YsSUFBSSxDQUFDRyxxQkFBcUIsQ0FBQ0QsQ0FBQyxDQUFDO1VBQ2pDLENBQUMsQ0FBQztRQUNOO01BQ0o7O01BRUE7TUFDQSxJQUFJM0YsSUFBSSxHQUFHNEIsTUFBTSxDQUFDNUIsSUFBSTs7TUFFdEI7TUFDQTtNQUNBO01BQ0EsSUFBSSxJQUFJLENBQUNxRCxnQkFBZ0IsQ0FBQ3JELElBQUksRUFBRTRCLE1BQU0sQ0FBQzNCLE1BQU0sQ0FBQyxFQUFFO1FBQzVDO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0FnQixHQUFHLENBQUNHLFNBQVMsSUFBS1EsTUFBTSxDQUFDTSxJQUFJLEdBQUksVUFBVSxHQUFHbEMsSUFBSSxHQUFHLFVBQVUsR0FBR0EsSUFBSSxHQUFHLGVBQWU7TUFDNUYsQ0FBQyxNQUFNO1FBQ0hpQixHQUFHLENBQUNHLFNBQVMsSUFBSSxnQkFBZ0I7TUFDckM7TUFFQWQsU0FBUyxDQUFDNkIsV0FBVyxDQUFDbEIsR0FBRyxDQUFDO01BRTFCLElBQUk2RSxJQUFJLEdBQUc1RSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNLENBQUM7TUFDekMyRSxJQUFJLENBQUMxRSxTQUFTLEdBQUcsSUFBSSxDQUFDWCxJQUFJLENBQUNJLFdBQVc7TUFDdENpRixJQUFJLENBQUMxQixTQUFTLEdBQUd4QyxNQUFNLENBQUNqQyxLQUFLLElBQUksRUFBRTtNQUNuQ1csU0FBUyxDQUFDNkIsV0FBVyxDQUFDMkQsSUFBSSxDQUFDO01BRTNCLE9BQU94RixTQUFTO0lBQ3BCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBakNJO0lBQUFkLEdBQUE7SUFBQUMsS0FBQSxFQWtDQSxTQUFBNkMsNEJBQTZCVixNQUFNLEVBQUU7TUFDakM7TUFDQSxJQUFJNkQsSUFBSSxHQUFHLElBQUk7TUFFZixJQUFJbkYsU0FBUyxHQUFHWSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDN0NiLFNBQVMsQ0FBQ2MsU0FBUyxHQUFHLElBQUksQ0FBQ1gsSUFBSSxDQUFDSyxvQkFBb0I7O01BRXBEO01BQ0EsSUFBSSxDQUFDYyxNQUFNLENBQUNNLElBQUksRUFBRTtRQUNkLE9BQU81QixTQUFTO01BQ3BCOztNQUVBO01BQ0E7TUFDQSxRQUFRc0IsTUFBTSxDQUFDNUIsSUFBSTtRQUNmLEtBQUssTUFBTTtVQUNQK0YsZUFBZSxDQUFDcEQsSUFBSSxDQUFDOEMsSUFBSSxDQUFDO1VBQzFCTyxlQUFlLENBQUNyRCxJQUFJLENBQUM4QyxJQUFJLENBQUM7VUFDMUJRLGlCQUFpQixDQUFDdEQsSUFBSSxDQUFDOEMsSUFBSSxDQUFDO1VBQzVCO1FBQ0osS0FBSyxZQUFZO1FBQ2pCLEtBQUssTUFBTTtVQUNQUyxlQUFlLENBQUN2RCxJQUFJLENBQUM4QyxJQUFJLENBQUM7VUFDMUJVLGlCQUFpQixDQUFDeEQsSUFBSSxDQUFDOEMsSUFBSSxDQUFDO1VBQzVCO1FBQ0o7VUFDSTtNQUNSOztNQUVBO01BQ0EsU0FBU00sZUFBZUEsQ0FBQSxFQUFJO1FBQ3hCLElBQUlLLFNBQVMsR0FBR2xGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUM3Q2lGLFNBQVMsQ0FBQ2hGLFNBQVMsR0FBRyxvQkFBb0I7UUFDMUMsSUFBSWlGLFVBQVUsR0FBR25GLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNoRGtGLFVBQVUsQ0FBQ2pGLFNBQVMsR0FBRyxhQUFhO1FBQ3BDaUYsVUFBVSxDQUFDQyxPQUFPLEdBQUcsSUFBSSxDQUFDNUcsRUFBRSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUNBLEVBQUUsR0FBRyxZQUFZO1FBQ3JFMkcsVUFBVSxDQUFDakMsU0FBUyxHQUFHLElBQUksQ0FBQ3JELE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSXdGLGNBQWMsR0FBR3JGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNwRG9GLGNBQWMsQ0FBQ25GLFNBQVMsR0FBRyxnQkFBZ0I7UUFDM0NtRixjQUFjLENBQUM3RyxFQUFFLEdBQUcsSUFBSSxDQUFDQSxFQUFFLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQ0EsRUFBRSxHQUFHLFlBQVk7UUFDcEU2RyxjQUFjLENBQUM1RyxLQUFLLEdBQUcsbUNBQW1DO1FBQzFENEcsY0FBYyxDQUFDdkcsSUFBSSxHQUFHLE9BQU87UUFDN0J1RyxjQUFjLENBQUM5RyxLQUFLLEdBQUdtQyxNQUFNLENBQUMzQixNQUFNLENBQUNHLEtBQUs7UUFDMUNtRyxjQUFjLENBQUNDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBQ3BELElBQUlELGNBQWMsQ0FBQ2IsZ0JBQWdCLEVBQUU7VUFDakNhLGNBQWMsQ0FBQ2IsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVVDLENBQUMsRUFBRTtZQUNuREYsSUFBSSxDQUFDcEMsZ0JBQWdCLENBQUN6QixNQUFNLENBQUM1QixJQUFJLEVBQUVzQixNQUFNLENBQUNDLE1BQU0sQ0FBQ0ssTUFBTSxDQUFDM0IsTUFBTSxFQUFFO2NBQzVERyxLQUFLLEVBQUd1RixDQUFDLENBQUMzRyxNQUFNLENBQUNTO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0hnRyxJQUFJLENBQUNnQix5QkFBeUIsQ0FBQ2QsQ0FBQyxDQUFDO1VBQ3JDLENBQUMsQ0FBQztRQUNOLENBQUMsTUFBTSxJQUFJWSxjQUFjLENBQUNWLFdBQVcsRUFBRTtVQUNuQ1UsY0FBYyxDQUFDVixXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVVGLENBQUMsRUFBRTtZQUNoREYsSUFBSSxDQUFDcEMsZ0JBQWdCLENBQUN6QixNQUFNLENBQUM1QixJQUFJLEVBQUVzQixNQUFNLENBQUNDLE1BQU0sQ0FBQ0ssTUFBTSxDQUFDM0IsTUFBTSxFQUFFO2NBQzVERyxLQUFLLEVBQUd1RixDQUFDLENBQUMzRyxNQUFNLENBQUNTO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0hnRyxJQUFJLENBQUNnQix5QkFBeUIsQ0FBQ2QsQ0FBQyxDQUFDO1VBQ3JDLENBQUMsQ0FBQztRQUNOO1FBQ0FTLFNBQVMsQ0FBQ2pFLFdBQVcsQ0FBQ2tFLFVBQVUsQ0FBQztRQUNqQ0QsU0FBUyxDQUFDakUsV0FBVyxDQUFDb0UsY0FBYyxDQUFDO1FBQ3JDakcsU0FBUyxDQUFDNkIsV0FBVyxDQUFDaUUsU0FBUyxDQUFDO01BQ3BDOztNQUVBO01BQ0EsU0FBU0osZUFBZUEsQ0FBQSxFQUFJO1FBQ3hCLElBQUlVLFNBQVMsR0FBR3hGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUM3Q3VGLFNBQVMsQ0FBQ3RGLFNBQVMsR0FBRyxvQkFBb0I7UUFDMUMsSUFBSXVGLFVBQVUsR0FBR3pGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNoRHdGLFVBQVUsQ0FBQ3ZGLFNBQVMsR0FBRyxhQUFhO1FBQ3BDdUYsVUFBVSxDQUFDTCxPQUFPLEdBQUcsSUFBSSxDQUFDNUcsRUFBRSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUNBLEVBQUUsR0FBRyxZQUFZO1FBQ3JFaUgsVUFBVSxDQUFDdkMsU0FBUyxHQUFHLElBQUksQ0FBQ3JELE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSTZGLGNBQWMsR0FBRzFGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNwRHlGLGNBQWMsQ0FBQ3hGLFNBQVMsR0FBRyxnQkFBZ0I7UUFDM0N3RixjQUFjLENBQUNsSCxFQUFFLEdBQUcsSUFBSSxDQUFDQSxFQUFFLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQ0EsRUFBRSxHQUFHLFlBQVk7UUFDcEVrSCxjQUFjLENBQUNqSCxLQUFLLEdBQUdpQyxNQUFNLENBQUMzQixNQUFNLENBQUNDLEtBQUs7UUFDMUMwRyxjQUFjLENBQUM1RyxJQUFJLEdBQUcsT0FBTztRQUM3QjRHLGNBQWMsQ0FBQ0MsR0FBRyxHQUFHLEdBQUc7UUFDeEJELGNBQWMsQ0FBQ0UsR0FBRyxHQUFHLElBQUk7UUFDekJGLGNBQWMsQ0FBQ0csSUFBSSxHQUFHLEdBQUc7UUFDekJILGNBQWMsQ0FBQ0ksWUFBWSxHQUFHcEYsTUFBTSxDQUFDM0IsTUFBTSxDQUFDQyxLQUFLO1FBQ2pEMEcsY0FBYyxDQUFDSixZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQztRQUNwRCxJQUFJSSxjQUFjLENBQUNsQixnQkFBZ0IsRUFBRTtVQUNqQ2tCLGNBQWMsQ0FBQ2xCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFVQyxDQUFDLEVBQUU7WUFDbkRsSCxNQUFNLENBQUNNLEtBQUssQ0FBQzRHLENBQUMsQ0FBQztZQUNmQSxDQUFDLENBQUMzRyxNQUFNLENBQUNXLEtBQUssR0FBR2dHLENBQUMsQ0FBQzNHLE1BQU0sQ0FBQ1MsS0FBSztZQUMvQmdHLElBQUksQ0FBQ3BDLGdCQUFnQixDQUFDekIsTUFBTSxDQUFDNUIsSUFBSSxFQUFFc0IsTUFBTSxDQUFDQyxNQUFNLENBQUNLLE1BQU0sQ0FBQzNCLE1BQU0sRUFBRTtjQUM1REMsS0FBSyxFQUFHeUYsQ0FBQyxDQUFDM0csTUFBTSxDQUFDUztZQUNyQixDQUFDLENBQUMsQ0FBQztZQUNIZ0csSUFBSSxDQUFDZ0IseUJBQXlCLENBQUNkLENBQUMsQ0FBQztVQUNyQyxDQUFDLENBQUM7UUFDTixDQUFDLE1BQU0sSUFBSWlCLGNBQWMsQ0FBQ2YsV0FBVyxFQUFFO1VBQ25DZSxjQUFjLENBQUNmLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVUYsQ0FBQyxFQUFFO1lBQ2hEbEgsTUFBTSxDQUFDTSxLQUFLLENBQUM0RyxDQUFDLENBQUM7WUFDZkEsQ0FBQyxDQUFDM0csTUFBTSxDQUFDVyxLQUFLLEdBQUdnRyxDQUFDLENBQUMzRyxNQUFNLENBQUNTLEtBQUs7WUFDL0JnRyxJQUFJLENBQUNwQyxnQkFBZ0IsQ0FBQ3pCLE1BQU0sQ0FBQzVCLElBQUksRUFBRXNCLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDSyxNQUFNLENBQUMzQixNQUFNLEVBQUU7Y0FDNURDLEtBQUssRUFBR3lGLENBQUMsQ0FBQzNHLE1BQU0sQ0FBQ1M7WUFDckIsQ0FBQyxDQUFDLENBQUM7WUFDSGdHLElBQUksQ0FBQ2dCLHlCQUF5QixDQUFDZCxDQUFDLENBQUM7VUFDckMsQ0FBQyxDQUFDO1FBQ047UUFDQWUsU0FBUyxDQUFDdkUsV0FBVyxDQUFDd0UsVUFBVSxDQUFDO1FBQ2pDRCxTQUFTLENBQUN2RSxXQUFXLENBQUN5RSxjQUFjLENBQUM7UUFDckN0RyxTQUFTLENBQUM2QixXQUFXLENBQUN1RSxTQUFTLENBQUM7TUFDcEM7O01BRUE7TUFDQSxTQUFTVCxpQkFBaUJBLENBQUEsRUFBSTtRQUMxQixJQUFJZ0IsV0FBVyxHQUFHL0YsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQy9DOEYsV0FBVyxDQUFDN0YsU0FBUyxHQUFHLG9CQUFvQjtRQUM1QyxJQUFJOEYsWUFBWSxHQUFHaEcsUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBQ2xEK0YsWUFBWSxDQUFDOUYsU0FBUyxHQUFHLGFBQWE7UUFDdEM4RixZQUFZLENBQUNaLE9BQU8sR0FBRyxJQUFJLENBQUM1RyxFQUFFLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQ0EsRUFBRSxHQUFHLGNBQWM7UUFDM0V3SCxZQUFZLENBQUM5QyxTQUFTLEdBQUcsSUFBSSxDQUFDckQsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUNwRCxJQUFJb0csZ0JBQWdCLEdBQUdqRyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFDdERnRyxnQkFBZ0IsQ0FBQy9GLFNBQVMsR0FBRyxnQkFBZ0I7UUFDN0MrRixnQkFBZ0IsQ0FBQ3pILEVBQUUsR0FBRyxJQUFJLENBQUNBLEVBQUUsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDQSxFQUFFLEdBQUcsY0FBYztRQUMxRXlILGdCQUFnQixDQUFDeEgsS0FBSyxHQUFHaUMsTUFBTSxDQUFDM0IsTUFBTSxDQUFDSSxPQUFPO1FBQzlDOEcsZ0JBQWdCLENBQUNuSCxJQUFJLEdBQUcsT0FBTztRQUMvQm1ILGdCQUFnQixDQUFDTixHQUFHLEdBQUcsR0FBRztRQUMxQk0sZ0JBQWdCLENBQUNMLEdBQUcsR0FBRyxHQUFHO1FBQzFCSyxnQkFBZ0IsQ0FBQ0osSUFBSSxHQUFHLEtBQUs7UUFDN0JJLGdCQUFnQixDQUFDSCxZQUFZLEdBQUdwRixNQUFNLENBQUMzQixNQUFNLENBQUNJLE9BQU87UUFDckQ4RyxnQkFBZ0IsQ0FBQ1gsWUFBWSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUM7UUFDeEQsSUFBSVcsZ0JBQWdCLENBQUN6QixnQkFBZ0IsRUFBRTtVQUNuQ3lCLGdCQUFnQixDQUFDekIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVVDLENBQUMsRUFBRTtZQUNyRGxILE1BQU0sQ0FBQ00sS0FBSyxDQUFDNEcsQ0FBQyxDQUFDO1lBQ2ZBLENBQUMsQ0FBQzNHLE1BQU0sQ0FBQ1csS0FBSyxHQUFHZ0csQ0FBQyxDQUFDM0csTUFBTSxDQUFDUyxLQUFLO1lBQy9CZ0csSUFBSSxDQUFDcEMsZ0JBQWdCLENBQUN6QixNQUFNLENBQUM1QixJQUFJLEVBQUVzQixNQUFNLENBQUNDLE1BQU0sQ0FBQ0ssTUFBTSxDQUFDM0IsTUFBTSxFQUFFO2NBQzVESSxPQUFPLEVBQUdzRixDQUFDLENBQUMzRyxNQUFNLENBQUNTO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1lBQ0hnRyxJQUFJLENBQUNnQix5QkFBeUIsQ0FBQ2QsQ0FBQyxDQUFDO1VBQ3JDLENBQUMsQ0FBQztRQUNOLENBQUMsTUFBTSxJQUFJd0IsZ0JBQWdCLENBQUN0QixXQUFXLEVBQUU7VUFDckNzQixnQkFBZ0IsQ0FBQ3RCLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVUYsQ0FBQyxFQUFFO1lBQ2xEbEgsTUFBTSxDQUFDTSxLQUFLLENBQUM0RyxDQUFDLENBQUM7WUFDZkEsQ0FBQyxDQUFDM0csTUFBTSxDQUFDVyxLQUFLLEdBQUdnRyxDQUFDLENBQUMzRyxNQUFNLENBQUNTLEtBQUs7WUFDL0JnRyxJQUFJLENBQUNwQyxnQkFBZ0IsQ0FBQ3pCLE1BQU0sQ0FBQzVCLElBQUksRUFBRXNCLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDSyxNQUFNLENBQUMzQixNQUFNLEVBQUU7Y0FDNURJLE9BQU8sRUFBR3NGLENBQUMsQ0FBQzNHLE1BQU0sQ0FBQ1M7WUFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDSGdHLElBQUksQ0FBQ2dCLHlCQUF5QixDQUFDZCxDQUFDLENBQUM7VUFDckMsQ0FBQyxDQUFDO1FBQ047UUFDQXNCLFdBQVcsQ0FBQzlFLFdBQVcsQ0FBQytFLFlBQVksQ0FBQztRQUNyQ0QsV0FBVyxDQUFDOUUsV0FBVyxDQUFDZ0YsZ0JBQWdCLENBQUM7UUFDekM3RyxTQUFTLENBQUM2QixXQUFXLENBQUM4RSxXQUFXLENBQUM7TUFDdEM7O01BRUE7TUFDQSxTQUFTZixlQUFlQSxDQUFBLEVBQUk7UUFDeEIsSUFBSWtCLFNBQVMsR0FBR2xHLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUM3Q2lHLFNBQVMsQ0FBQ2hHLFNBQVMsR0FBRyxvQkFBb0I7UUFDMUMsSUFBSWlHLFVBQVUsR0FBR25HLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNoRGtHLFVBQVUsQ0FBQ2pHLFNBQVMsR0FBRyxhQUFhO1FBQ3BDaUcsVUFBVSxDQUFDZixPQUFPLEdBQUcsSUFBSSxDQUFDNUcsRUFBRSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUNBLEVBQUUsR0FBRyxZQUFZO1FBQ3JFMkgsVUFBVSxDQUFDakQsU0FBUyxHQUFHLElBQUksQ0FBQ3JELE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSXVHLGNBQWMsR0FBR3BHLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNwRG1HLGNBQWMsQ0FBQ2xHLFNBQVMsR0FBRyxnQkFBZ0I7UUFDM0NrRyxjQUFjLENBQUM1SCxFQUFFLEdBQUcsSUFBSSxDQUFDQSxFQUFFLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQ0EsRUFBRSxHQUFHLFlBQVk7UUFDcEU0SCxjQUFjLENBQUMzSCxLQUFLLEdBQUcseUNBQXlDO1FBQ2hFMkgsY0FBYyxDQUFDdEgsSUFBSSxHQUFHLE9BQU87UUFDN0JzSCxjQUFjLENBQUM3SCxLQUFLLEdBQUdtQyxNQUFNLENBQUMzQixNQUFNLENBQUNHLEtBQUs7UUFDMUNrSCxjQUFjLENBQUNkLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBQ3BELElBQUljLGNBQWMsQ0FBQzVCLGdCQUFnQixFQUFFO1VBQ2pDNEIsY0FBYyxDQUFDNUIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVVDLENBQUMsRUFBRTtZQUNuREYsSUFBSSxDQUFDcEMsZ0JBQWdCLENBQUN6QixNQUFNLENBQUM1QixJQUFJLEVBQUVzQixNQUFNLENBQUNDLE1BQU0sQ0FBQ0ssTUFBTSxDQUFDM0IsTUFBTSxFQUFFO2NBQzVERyxLQUFLLEVBQUd1RixDQUFDLENBQUMzRyxNQUFNLENBQUNTO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0hnRyxJQUFJLENBQUNnQix5QkFBeUIsQ0FBQ2QsQ0FBQyxDQUFDO1VBQ3JDLENBQUMsQ0FBQztRQUNOLENBQUMsTUFBTSxJQUFJMkIsY0FBYyxDQUFDekIsV0FBVyxFQUFFO1VBQ25DeUIsY0FBYyxDQUFDekIsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVRixDQUFDLEVBQUU7WUFDaERGLElBQUksQ0FBQ3BDLGdCQUFnQixDQUFDekIsTUFBTSxDQUFDNUIsSUFBSSxFQUFFc0IsTUFBTSxDQUFDQyxNQUFNLENBQUNLLE1BQU0sQ0FBQzNCLE1BQU0sRUFBRTtjQUM1REcsS0FBSyxFQUFHdUYsQ0FBQyxDQUFDM0csTUFBTSxDQUFDUztZQUNyQixDQUFDLENBQUMsQ0FBQztZQUNIZ0csSUFBSSxDQUFDZ0IseUJBQXlCLENBQUNkLENBQUMsQ0FBQztVQUNyQyxDQUFDLENBQUM7UUFDTjtRQUNBeUIsU0FBUyxDQUFDakYsV0FBVyxDQUFDa0YsVUFBVSxDQUFDO1FBQ2pDRCxTQUFTLENBQUNqRixXQUFXLENBQUNtRixjQUFjLENBQUM7UUFDckNoSCxTQUFTLENBQUM2QixXQUFXLENBQUNpRixTQUFTLENBQUM7TUFDcEM7O01BRUE7TUFDQSxTQUFTakIsaUJBQWlCQSxDQUFBLEVBQUk7UUFDMUIsSUFBSW9CLFdBQVcsR0FBR3JHLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUMvQ29HLFdBQVcsQ0FBQ25HLFNBQVMsR0FBRyxvQkFBb0I7UUFDNUMsSUFBSW9HLFlBQVksR0FBR3RHLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNsRHFHLFlBQVksQ0FBQ3BHLFNBQVMsR0FBRyxhQUFhO1FBQ3RDb0csWUFBWSxDQUFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQzVHLEVBQUUsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDQSxFQUFFLEdBQUcsY0FBYztRQUMzRThILFlBQVksQ0FBQ3BELFNBQVMsR0FBRyxJQUFJLENBQUNyRCxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3BELElBQUkwRyxnQkFBZ0IsR0FBR3ZHLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUN0RHNHLGdCQUFnQixDQUFDckcsU0FBUyxHQUFHLGdCQUFnQjtRQUM3Q3FHLGdCQUFnQixDQUFDL0gsRUFBRSxHQUFHLElBQUksQ0FBQ0EsRUFBRSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUNBLEVBQUUsR0FBRyxjQUFjO1FBQzFFK0gsZ0JBQWdCLENBQUM5SCxLQUFLLEdBQUdpQyxNQUFNLENBQUMzQixNQUFNLENBQUNJLE9BQU87UUFDOUNvSCxnQkFBZ0IsQ0FBQ3pILElBQUksR0FBRyxPQUFPO1FBQy9CeUgsZ0JBQWdCLENBQUNaLEdBQUcsR0FBRyxHQUFHO1FBQzFCWSxnQkFBZ0IsQ0FBQ1gsR0FBRyxHQUFHLEdBQUc7UUFDMUJXLGdCQUFnQixDQUFDVixJQUFJLEdBQUcsS0FBSztRQUM3QlUsZ0JBQWdCLENBQUNULFlBQVksR0FBR3BGLE1BQU0sQ0FBQzNCLE1BQU0sQ0FBQ0ksT0FBTztRQUNyRG9ILGdCQUFnQixDQUFDakIsWUFBWSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUM7UUFDeEQsSUFBSWlCLGdCQUFnQixDQUFDL0IsZ0JBQWdCLEVBQUU7VUFDbkMrQixnQkFBZ0IsQ0FBQy9CLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFVQyxDQUFDLEVBQUU7WUFDckRBLENBQUMsQ0FBQzNHLE1BQU0sQ0FBQ1csS0FBSyxHQUFHZ0csQ0FBQyxDQUFDM0csTUFBTSxDQUFDUyxLQUFLO1lBQy9CZ0csSUFBSSxDQUFDcEMsZ0JBQWdCLENBQUN6QixNQUFNLENBQUM1QixJQUFJLEVBQUVzQixNQUFNLENBQUNDLE1BQU0sQ0FBQ0ssTUFBTSxDQUFDM0IsTUFBTSxFQUFFO2NBQzVESSxPQUFPLEVBQUdzRixDQUFDLENBQUMzRyxNQUFNLENBQUNTO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1lBQ0hnRyxJQUFJLENBQUNnQix5QkFBeUIsQ0FBQ2QsQ0FBQyxDQUFDO1VBQ3JDLENBQUMsQ0FBQztRQUNOLENBQUMsTUFBTSxJQUFJOEIsZ0JBQWdCLENBQUM1QixXQUFXLEVBQUU7VUFDckM0QixnQkFBZ0IsQ0FBQzVCLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVUYsQ0FBQyxFQUFFO1lBQ2xEQSxDQUFDLENBQUMzRyxNQUFNLENBQUNXLEtBQUssR0FBR2dHLENBQUMsQ0FBQzNHLE1BQU0sQ0FBQ1MsS0FBSztZQUMvQmdHLElBQUksQ0FBQ3BDLGdCQUFnQixDQUFDekIsTUFBTSxDQUFDNUIsSUFBSSxFQUFFc0IsTUFBTSxDQUFDQyxNQUFNLENBQUNLLE1BQU0sQ0FBQzNCLE1BQU0sRUFBRTtjQUM1REksT0FBTyxFQUFHc0YsQ0FBQyxDQUFDM0csTUFBTSxDQUFDUztZQUN2QixDQUFDLENBQUMsQ0FBQztZQUNIZ0csSUFBSSxDQUFDZ0IseUJBQXlCLENBQUNkLENBQUMsQ0FBQztVQUNyQyxDQUFDLENBQUM7UUFDTjtRQUNBNEIsV0FBVyxDQUFDcEYsV0FBVyxDQUFDcUYsWUFBWSxDQUFDO1FBQ3JDRCxXQUFXLENBQUNwRixXQUFXLENBQUNzRixnQkFBZ0IsQ0FBQztRQUN6Q25ILFNBQVMsQ0FBQzZCLFdBQVcsQ0FBQ29GLFdBQVcsQ0FBQztNQUN0QztNQUVBLE9BQU9qSCxTQUFTO0lBQ3BCOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBZCxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBaUksSUFBQSxFQUFPO01BQ0gsSUFBSSxDQUFDLElBQUksQ0FBQzdJLE9BQU8sQ0FBQ0csTUFBTSxFQUFFO1FBQ3RCLElBQUksQ0FBQ2tDLFFBQVEsQ0FBQ3lHLGNBQWMsQ0FBQyxJQUFJLENBQUNsSCxJQUFJLENBQUN6QixNQUFNLENBQUMsRUFBRTtVQUM1QyxJQUFJaUMsR0FBRyxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7VUFDdkNGLEdBQUcsQ0FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUNlLElBQUksQ0FBQ3pCLE1BQU07VUFDekIsSUFBSTRJLElBQUksR0FBRzFHLFFBQVEsQ0FBQzJHLGVBQWUsSUFDL0IzRyxRQUFRLENBQUM0RyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFDeEM1RyxRQUFRLENBQUM0RyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDNUNGLElBQUksQ0FBQ3pGLFdBQVcsQ0FBQ2xCLEdBQUcsQ0FBQztRQUN6QjtRQUNBLElBQUksQ0FBQ3BDLE9BQU8sQ0FBQ0csTUFBTSxHQUFHa0MsUUFBUSxDQUFDeUcsY0FBYyxDQUFDLElBQUksQ0FBQ2xILElBQUksQ0FBQ3pCLE1BQU0sQ0FBQztNQUNuRTtNQUNBLElBQUksSUFBSSxDQUFDc0IsU0FBUyxFQUFFO1FBQ2hCLElBQUksQ0FBQ3pCLE9BQU8sQ0FBQ0csTUFBTSxDQUFDbUQsV0FBVyxDQUFDLElBQUksQ0FBQzdCLFNBQVMsQ0FBQztNQUNuRDtNQUNBLE9BQU8sSUFBSTtJQUNmOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFkLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUFzSSxRQUFTQSxRQUFPLEVBQUU7TUFDZHRKLE1BQU0sQ0FBQ00sS0FBSyxDQUFDLFdBQVcsRUFBRWdKLFFBQU8sQ0FBQztNQUNsQyxJQUFJLE9BQU9BLFFBQU8sS0FBSyxXQUFXLEVBQUU7UUFDaEMsSUFBSSxDQUFDekgsU0FBUyxDQUFDZSxLQUFLLENBQUMwRyxPQUFPLEdBQUlBLFFBQU8sR0FBSSxNQUFNLEdBQUcsTUFBTTtNQUM5RDtNQUNBLE9BQVEsSUFBSSxDQUFDekgsU0FBUyxDQUFDZSxLQUFLLENBQUMwRyxPQUFPLEtBQUssTUFBTTtJQUNuRDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQXZJLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUF1SSxXQUFBLEVBQWM7TUFDVixPQUFPLElBQUksQ0FBQ3BJLFFBQVE7SUFDeEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJO0lBQUFKLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUF3SSxtQkFBQSxFQUFzQjtNQUNsQixPQUFPLElBQUksQ0FBQzFILGVBQWU7SUFDL0I7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJO0lBQUFmLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUF5SSxrQkFBQSxFQUFxQjtNQUNqQixPQUFPLElBQUksQ0FBQzFILGNBQWM7SUFDOUI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFoQixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBMEksYUFBQSxFQUFnQjtNQUNaLE9BQU8sSUFBSSxDQUFDN0gsU0FBUztJQUN6Qjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFkLEdBQUE7SUFBQUMsS0FBQSxFQVVBLFNBQUFtRyxzQkFBdUJELENBQUMsRUFBRTtNQUN0QmxILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHVCQUF1QixFQUFFNEcsQ0FBQyxDQUFDO01BQ3hDQSxDQUFDLENBQUN5QyxRQUFRLEdBQUcsSUFBSSxDQUFDMUksRUFBRTtNQUNwQmlHLENBQUMsQ0FBQzBDLElBQUksR0FBRyxJQUFJLENBQUN4SixPQUFPO01BQ3JCeUosaURBQVEsQ0FBQ0MsUUFBUSxDQUFDQyw4Q0FBVyxDQUFDQyxNQUFNLENBQUNDLGNBQWMsRUFBRS9DLENBQUMsQ0FBQztJQUMzRDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFuRyxHQUFBO0lBQUFDLEtBQUEsRUFVQSxTQUFBZ0gsMEJBQTJCZCxDQUFDLEVBQUU7TUFDMUJsSCxNQUFNLENBQUNNLEtBQUssQ0FBQywyQkFBMkIsRUFBRTRHLENBQUMsQ0FBQztNQUM1Q0EsQ0FBQyxDQUFDeUMsUUFBUSxHQUFHLElBQUksQ0FBQzFJLEVBQUU7TUFDcEJpRyxDQUFDLENBQUMwQyxJQUFJLEdBQUcsSUFBSSxDQUFDeEosT0FBTztNQUNyQnlKLGlEQUFRLENBQUNDLFFBQVEsQ0FBQ0MsOENBQVcsQ0FBQ0MsTUFBTSxDQUFDRSxhQUFhLEVBQUVoRCxDQUFDLENBQUM7SUFDMUQ7RUFBQztBQUFBO0FBRUo7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EvRyxNQUFNLENBQUNpRSxVQUFVLEdBQUc7RUFDaEIrRixJQUFJLEVBQUcsQ0FDSCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxZQUFZLENBQ2Y7RUFDREMsSUFBSSxFQUFHLENBQ0gsWUFBWSxFQUNaLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsY0FBYyxDQUNqQjtFQUNEQyxVQUFVLEVBQUcsQ0FDVCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixDQUN2QjtFQUNEQyxNQUFNLEVBQUcsQ0FDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIscUJBQXFCLENBQ3hCO0VBQ0RDLElBQUksRUFBRyxDQUNILFlBQVksRUFDWixZQUFZLEVBQ1osY0FBYyxFQUNkLGFBQWEsQ0FDaEI7RUFDREMsSUFBSSxFQUFHLENBQ0gsZUFBZSxFQUNmLFlBQVksRUFDWixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixhQUFhO0FBRXJCLENBQUM7QUFFY3JLLHFFQUFNIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRWRpdG9yL0xlZ2VuZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEJ1cyBmcm9tIFwiZXZlbnRidXNqc1wiO1xuaW1wb3J0IEV2ZW50RWRpdG9yIGZyb20gXCIuL0V2ZW50XCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Db2xvclV0aWxzXCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLWxlZ2VuZFwiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogTWFwQm94IExlZ2VuZCBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLkxlZ2VuZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnRhcmdldCA9IG51bGxdIC0gLi4uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucG9zaXRpb24gPSAwXSAtICAuLi5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pZCA9IG51bGxdIC0gKGludGVybmFsKSAuLi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zcHJpdGVzID0gbnVsbF0gLSAuLi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zcHJpdGVzLnVybF0gLSAuLi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zcHJpdGVzLnNpemVdIC0ge2g6LCB3On0gLi4uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc3ByaXRlcy5qc29uXSAtIC4uLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMub2JqIC0gLi4uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub2JqLnRpdGxlXSAtIC4uLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vYmouZWRpdGFibGUgPSB0cnVlXSAtIC4uLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMub2JqLnBhaW50IC0gLi4uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5vYmoubGF5b3V0IC0gLi4uXG4gKiBAZXhhbXBsZVxuICogICB2YXIgbGVnZW5kID0gbmV3IExlZ2VuZCAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHBvc2l0aW9uIDogMSwgLy8gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gKHVuaXF1ZSAhKVxuICogICAgICBzcHJpdGVzIDoge1xuICogICAgICAgICAgdXJsIDogXCJodHRwOi8vbG9jYWxob3N0L3Nwcml0ZXMucG5nXCIsXG4gKiAgICAgICAgICBzaXplIDogeyB3IDogNDUwLCBoIDogNTUwIH0sXG4gKiAgICAgICAgICBqc29uIDoge1xuICogICAgICAgICAgICAgIGljb24tMSA6IHt4Oix5OixoZWlnaHQ6LHdpZHRoOixwaXhlbFJhdGlvOn0sXG4gKiAgICAgICAgICAgICAgaWNvbi0yIDoge3g6LHk6LGhlaWdodDosd2lkdGg6LHBpeGVsUmF0aW86fVxuICogICAgICAgICAgfVxuICogICAgICB9LFxuICogICAgICBvYmogOiB7XG4gKiAgICAgICAgICB0aXRsZSA6IFwiXCIsXG4gKiAgICAgICAgICBlZGl0YWJsZSA6IHRydWUsIC8vIHRhZyBub24gc3RhbmRhcmQgaXNzdWUgZHUgc3R5bGUganNvbiBkw6lkacOpIMOgIGwnZWRpdGlvblxuICogICAgICAgICAgcGFpbnQgOiB7XCJmaWxsLWNvbG9yXCI6IFwiIzJCQjNFMVwifSxcbiAqICAgICAgICAgIGxheW91dCA6IHt2aXNpYmlsaXR5Olwibm9uZVwifVxuICogICAgICB9XG4gKiAgIH0pO1xuICogIGxlZ2VuZC5hZGQoKTtcbiAqICBsZWdlbmQuZGlzcGxheSh0cnVlKTtcbiAqICBsZWdlbmQuaXNFZGl0YWJsZSgpO1xuICogIGxlZ2VuZC5nZXRSZW5kZXJDb250YWluZXIoKTtcbiAqICBsZWdlbmQuZ2V0VG9vbHNDb250YWluZXIoKTtcbiAqICBsZWdlbmQuZ2V0Q29udGFpbmVyKCk7XG4gKi9cbmNsYXNzIExlZ2VuZCB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIExlZ2VuZFwiLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgLy8gZGVmYXVsdC4uLlxuICAgICAgICAgICAgdGFyZ2V0IDogbnVsbCxcbiAgICAgICAgICAgIHBvc2l0aW9uIDogMCxcbiAgICAgICAgICAgIHNwcml0ZXMgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBMZWdlbmQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBpbml0IG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGNmLiBhZGQoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGVybWV0IGQnYXZvaXIgdW4gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gZGFucyBsYSBsaXN0ZSBkZXMgbGF5ZXJzXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub2JqKSB7XG4gICAgICAgICAgICAvLyBjaG9peCBkJ2F2b2lyIHVuIG9iamV0IHZpZGUgcG91ciB1bmUgZWRpdGlvbi4uLlxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9iaiA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwidmlkZS4uLlwiLFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYWludCA6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJmaWxsLWNvbG9yXCIgOiBcIiNGRkZGRkZcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsYSBsZWdlbmRlIGVzdCBlbGxlIGVkaXRhYmxlID9cbiAgICAgICAgLy8gbGUgdGFnICdlZGl0YWJsZScgZXN0IMOgIHBsYWNlciBkYW5zIGxlIGZpY2hpZXIgZGUgc3R5bGUgKGRhbnMgbGUgbGF5ZXIpLi4uXG4gICAgICAgIHZhciBfZWRpdGFibGUgPSB0aGlzLm9wdGlvbnMub2JqLmVkaXRhYmxlO1xuICAgICAgICB0aGlzLmVkaXRhYmxlID0gKHR5cGVvZiBfZWRpdGFibGUgIT09IFwidW5kZWZpbmVkXCIpID8gX2VkaXRhYmxlIDogZmFsc2U7XG5cbiAgICAgICAgLy8gbGlzdGUgZGVzIGNhcmFjdMOpcmlzdGlxdWVzIGRlIGxhIGxlZ2VuZGUgcGFyIGRlZmF1dFxuICAgICAgICB0aGlzLmxlZ2VuZFJlbmRlciA9IHtcbiAgICAgICAgICAgIHR5cGUgOiBcImZpbGxcIixcbiAgICAgICAgICAgIHZhbHVlcyA6IHtcbiAgICAgICAgICAgICAgICB3aWR0aCA6IDEsXG4gICAgICAgICAgICAgICAgc3Ryb2tlIDogXCIjRkZGRkZGXCIsXG4gICAgICAgICAgICAgICAgY29sb3IgOiBcIiMwMDAwMDBcIixcbiAgICAgICAgICAgICAgICBvcGFjaXR5IDogMVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERPTSA6IHBvaW50ZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHRoaXMudG9vbHNjb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIERPTSA6IGNsYXNzTmFtZSBvciBpZFxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kVGFyZ2V0XCIsXG4gICAgICAgICAgICBjb250YWluZXIgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJsZWdlbmRyZW5kZXIgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBsZWdlbmRyZW5kZXIgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyXCIsXG4gICAgICAgICAgICBsZWdlbmRlZGl0YWJsZSA6IFwiR1BFZGl0b3JNYXBCb3hMZWdlbmRFZGl0YWJsZVwiLFxuICAgICAgICAgICAgbGVnZW5kdGl0bGUgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kVGl0bGVcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcmxlZ2VuZHRvb2xzIDogXCJHUEVkaXRvck1hcEJveExlZ2VuZFRvb2xzQ29udGFpbmVyXCJcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBET00gOiBMYWJlbCBtZW51IEVkaXRpb25cbiAgICAgICAgdGhpcy5sYWJlbHMgPSB7XG4gICAgICAgICAgICBcImxpbmUtY29sb3JcIiA6IFwiQ291bGV1ciBkdSB0cmFpdFwiLFxuICAgICAgICAgICAgXCJsaW5lLXdpZHRoXCIgOiBcIkVwYWlzc2V1ciBkdSB0cmFpdFwiLFxuICAgICAgICAgICAgXCJsaW5lLW9wYWNpdHlcIiA6IFwiT3BhY2l0w6kgZHUgdHJhaXRcIixcbiAgICAgICAgICAgIFwiZmlsbC1jb2xvclwiIDogXCJDb3VsZXVyIGRlIHJlbXBsaXNzYWdlXCIsXG4gICAgICAgICAgICBcImZpbGwtb3BhY2l0eVwiIDogXCJPcGFjaXTDqSBkdSByZW1wbGlzc2FnZVwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JhcGhpY2FsIHJlbmRlcmluZyBvZiB0aGUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRDb250YWluZXJcIj5cbiAgICAgKiAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyQ29udGFpbmVyXCI+XG4gICAgICogICAgICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRSZW5kZXIgR1BFZGl0b3JNYXBCb3hMZWdlbmRFZGl0YWJsZSBsZWdlbmQtY2lyY2xlXCIgc3R5bGU9XCIuLi5cIj48L2Rpdj5cbiAgICAgKiAgICAgIDxzcGFuIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRUaXRsZVwiPnRlc3QgY2lyY2xlIGVkaXRhYmxlLi4uPC9zcGFuPlxuICAgICAqICA8L2Rpdj5cbiAgICAgKiAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kVG9vbHNDb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIHZhciBfb2JqID0gdGhpcy5vcHRpb25zLm9iajtcblxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXI7XG5cbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyBvbiByZWNoZXJjaGUgbGVzIGluZm9ybWF0aW9ucyBkYW5zIGxlIHRhZyAncGFpbnQnIGVuIHByaW9yaXTDqSwgbWFpcyBwb3VyXG4gICAgICAgIC8vIGxlcyBpY29uZXMgb3UgdGV4dGVzLCBsZXMgaW5mb3JtYXRpb25zIHBldXZlbnQgc2UgdHJvdXZlciBhdXNzaSBkYW5zIGxlIHRhZyAnbGF5b3V0Jy4uLlxuICAgICAgICAvLyBvbiBmdXNpb25ubmUgcGFpbnQgZXQgbGF5b3V0IHBhciBmYWNpbGl0w6lcbiAgICAgICAgdmFyIHN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgX29iai5wYWludCwgX29iai5sYXlvdXQpO1xuXG4gICAgICAgIC8vIGxpc3RlIGRlcyBwcm9wZXJ0aWVzIG1hcGJveFxuICAgICAgICAvLyBleC4gZmlsbC1jb2xvclxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInRhZyAncGFpbnQnIG9yICdsYXlvdXQnIGlzIGVtcHR5ICFcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRVxuICAgICAgICAvLyAtIGdlc3Rpb24gZGUgdHlwZSBwbHVzIGNvbXBsZXhlIDogdGV4dGUgYXZlYy9zYW5zIHN5bWJvbGUgb3Ugc3ltYm9sZSAhXG4gICAgICAgIC8vIC0gcG91ciBsZXMgdGV4dGVzIG91IGljb25lcywgbGVzIGluZm8gcGV1dmVudCDDqnRyZSBhdXNzaSBkYW5zIGxlIHRhZyAnbGF5b3V0JyAhXG4gICAgICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICAgICAgdmFyIGJGb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgLy8gcmVjaGVyY2hlIGR1IHR5cGVcbiAgICAgICAgICAgIC8vIGV4LiBmaWxsXG4gICAgICAgICAgICBpZiAoL2ZpbGwtLy50ZXN0KGtleSkgfHxcbiAgICAgICAgICAgICAgICAvbGluZS0vLnRlc3Qoa2V5KSB8fFxuICAgICAgICAgICAgICAgIC9jaXJjbGUtLy50ZXN0KGtleSkgfHxcbiAgICAgICAgICAgICAgICAvYmFja2dyb3VuZC0vLnRlc3Qoa2V5KSB8fFxuICAgICAgICAgICAgICAgIC90ZXh0LS8udGVzdChrZXkpIHx8XG4gICAgICAgICAgICAgICAgL2ljb24tLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAvLyBzdHlsZSBnZXLDqSAmIHRyb3V2w6lcbiAgICAgICAgICAgICAgICBiRm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gX29iai50aXRsZSB8fCBcIlwiO1xuXG4gICAgICAgICAgICAgICAgLy8gSU5GT1xuICAgICAgICAgICAgICAgIC8vIGxlIHR5cGUgdGV4dGUgb3UgaWNvbmUgZXN0IGRpZmZpY2lsZSDDoCB0cm91dmVyIGNhciBsZXMgMiB0eXBlcyBjb2hhYml0ZW50LFxuICAgICAgICAgICAgICAgIC8vIG9uIGxlIGfDqHJlIGVuIHN5bWJvbGUuLi5cbiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGtleS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwidGV4dFwiIHx8IHR5cGUgPT09IFwiaWNvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBcInN5bWJvbFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubGVnZW5kUmVuZGVyID0gdGhpcy5fZ2V0UHJvcGVydGllcyh0eXBlLCBzdHlsZSk7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICBlZGl0IDogdGhpcy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMubGVnZW5kUmVuZGVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA6IHRoaXMubGVnZW5kUmVuZGVyLnZhbHVlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kKHBhcmFtcykpO1xuXG4gICAgICAgICAgICAgICAgLy8gb24gc3RvcHBlIGxhIHJlY2hlcmNoZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGVnZW5kZSBhdmVjIHVuIHN0eWxlIGluZGV0ZXJtaW7DqSBvdSBub24gZ8OpcsOpICE/XG4gICAgICAgIGlmICghYkZvdW5kKSB7XG4gICAgICAgICAgICAvLyBvbiBwcmVuZCBsYSBsZWdlbmRlIHBhciBkZWZhdXRcbiAgICAgICAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBlZGl0IDogdGhpcy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiXCIsXG4gICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMubGVnZW5kUmVuZGVyLnR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWVzIDogdGhpcy5sZWdlbmRSZW5kZXIudmFsdWVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kKHBhcmFtcykpO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJsZWdlbmQgdHlwZSB1bmtub3duLCBkZWZhdWx0IGxlZ2VuZCB1c2VkLi4uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWpvdXQgbW9kZSBlZGl0aW9uIGdyYXBoaXF1ZSBkZSBsYSBsZWdlbmRlXG4gICAgICAgIHRoaXMudG9vbHNjb250YWluZXIgPSB0aGlzLl9jcmVhdGVFbGVtZW50RWRpdGlvbkxlZ2VuZChwYXJhbXMpO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGhpcy50b29sc2NvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcml2YXRlIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgKiBHZXQgcHJvcGVydGllcyBzdXBwb3J0ZWRcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZSAtIGZpbGwsIGxpbmUsIGNpcmNsZSwgdGV4dCwgaWNvbi4uLlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIHJhdyB2YWx1ZXMgZnJvbSB0aGUgSlNPTiBmaWxlXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIHsgdHlwZSA6IChmaWxsIHwgbGluZSB8IGNpcmNsZSB8IHN5bWJvbCksIHZhbHVlcyA6IHZhbHVlc1N1cHBvcnRlZCB9XG4gICAgKlxuICAgICogQHByaXZhdGVcbiAgICAqIEBleGFtcGxlXG4gICAgKlxuICAgICogLy8gVE9ET1xuICAgICogLy8gc3ltYm9sIHdpdGggdGV4dCAoMSkgLyBzeW1ib2wgd2l0aG91dCB0ZXh0ICgyKSAvIHRleHQgKDMpXG4gICAgKiAvLyBcImxheW91dFwiOntcbiAgICAqIC8vICAgICAgXCJpY29uLWltYWdlXCI6XCJ7bWFraX0tMTFcIiwgICAgICAgICAgPCEtLS0gSVQnUyBBIFNZTUJPTCAoMSkgKDIpLS0+XG4gICAgKiAvLyAgICAgIFwidGV4dC1mb250XCI6W1xuICAgICogLy8gICAgICAgICAgIFwiT3BlbiBTYW5zIFNlbWlib2xkXCIsXG4gICAgKiAvLyAgICAgICAgICAgXCJBcmlhbCBVbmljb2RlIE1TIEJvbGRcIlxuICAgICogLy8gICAgICAgXSxcbiAgICAqIC8vICAgICAgIFwidGV4dC1maWVsZFwiOlwie25hbWVfZW59XCIsICAgICAgICAgPCEtLS0gSVQnUyBBIFRFWFQgKDEpICgzKS0tPlxuICAgICogLy8gICAgICAgXCJ0ZXh0LW1heC13aWR0aFwiOjksXG4gICAgKiAvLyAgICAgICBcInRleHQtcGFkZGluZ1wiOjIsXG4gICAgKiAvLyAgICAgICBcInRleHQtb2Zmc2V0XCI6W1xuICAgICogLy8gICAgICAgICAgICAwLFxuICAgICogLy8gICAgICAgICAgICAwLjZcbiAgICAqIC8vICAgICAgIF0sXG4gICAgKiAvLyAgICAgICBcInRleHQtYW5jaG9yXCI6XCJ0b3BcIixcbiAgICAqIC8vICAgICAgIFwidGV4dC1zaXplXCI6MTJcbiAgICAqIC8vIH0sXG4gICAgKiAvLyBcInBhaW50XCI6e1xuICAgICogLy8gICAgIFwidGV4dC1jb2xvclwiOlwiIzY2NlwiLFxuICAgICogLy8gICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6XCIjZmZmZmZmXCIsXG4gICAgKiAvLyAgICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjoxLFxuICAgICogLy8gICAgIFwidGV4dC1oYWxvLWJsdXJcIjowLjVcbiAgICAqIC8vIH0sXG4gICAgKlxuICAgICovXG4gICAgX2dldFByb3BlcnRpZXMgKHR5cGUsIHZhbHVlcykge1xuICAgICAgICAvLyBjYXMgcGFydGljdWxpZXIgZHUgc3ltYm9sZSBjb21wbGV4ZVxuICAgICAgICAvLyBpbCBleGlzdGUgcGx1c2lldXJzIHR5cGVzIHBvdXIgdW4gc3ltYm9sZSA6XG4gICAgICAgIC8vIC0gdGV4dFxuICAgICAgICAvLyAtIGljb25cbiAgICAgICAgLy8gLSBpY29uIHdpdGggdGV4dFxuICAgICAgICBpZiAodHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgdmFyIGlzVGV4dFZhbHVlID0gdmFsdWVzW1widGV4dC1maWVsZFwiXTtcbiAgICAgICAgICAgIHZhciBpc0ljb25WYWx1ZSA9IHZhbHVlc1tcImljb24taW1hZ2VcIl07XG4gICAgICAgICAgICB0eXBlID0gKGlzVGV4dFZhbHVlICYmIGlzSWNvblZhbHVlKSA/IFwiaWNvblwiIDogKGlzVGV4dFZhbHVlKSA/IFwidGV4dFwiIDogKGlzSWNvblZhbHVlKSA/IFwiaWNvblwiIDogXCJ1bmtub3dcIjtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInVua25vd1wiKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJ0eXBlIHVua25vdyAhP1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsdWVzU3VwcG9ydGVkID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlcywga2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHZhbHVlc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChMZWdlbmQuUFJPUEVSVElFU1t0eXBlXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0ga2V5LnJlcGxhY2UodHlwZSwgXCJcIikuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzIHBhcnRpY3VsaWVyIGRlcyBzcHJpdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJwYXR0ZXJuXCIgfHwgcHJvcCA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3ByaXRlcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSB0eXBlICsgXCI6XCIgKyBwcm9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInNwcml0ZXMgbWFuZGF0b3J5IGZvciBrZXkgXCIsIGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNTdXBwb3J0ZWRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwicHJvcGVydHkgbm90IHN1cHBvcnRlZCA6IFwiLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlIDogdHlwZSxcbiAgICAgICAgICAgIHZhbHVlcyA6IHZhbHVlc1N1cHBvcnRlZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmVuZGVyIHRodW1ibmFpbCAoU1ZHKVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlIC0gZmlsbCwgbGluZSwgY2lyY2xlLCB0ZXh0LCAuLi5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB7XCJjb2xvclwiOi4uLiwgXCJ3aWR0aFwiOi4uLiwgXCJzdHJva2VcIjouLi4uLCBcIm9wYWNpdHlcIjouLi59XG4gICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZVxuICAgICpcbiAgICAqIEBwcml2YXRlXG4gICAgKiBAZXhhbXBsZVxuICAgICogKC4uLilcbiAgICAqL1xuICAgIF9yZW5kZXJUaHVtYm5haWwgKHR5cGUsIHZhbHVlcykge1xuICAgICAgICAvLyBkaXYgZGUgcmVuZHUgZGUgbGEgbGVnZW5kZVxuICAgICAgICB2YXIgZGl2ID0gdGhpcy5yZW5kZXJjb250YWluZXI7XG5cbiAgICAgICAgaWYgKCFkaXYpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNWR1xuICAgICAgICB2YXIgc3ZnID0gbnVsbDtcbiAgICAgICAgLy8gZmFjdGV1ciBncm9zc2lzc2VtZW50ICh4MTApIHBvdXIgbGUgdHJhaXRcbiAgICAgICAgdmFyIGZhY3RvciA9IDM7XG5cbiAgICAgICAgLy8gdmFsZXVyIHBhciBkZWZhdXRcbiAgICAgICAgaWYgKCF2YWx1ZXMuY29sb3IpIHtcbiAgICAgICAgICAgIHZhbHVlcy5jb2xvciA9IFwiI0ZGRkZGRlwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuIGZvbmN0aW9uIGR1IHR5cGUsIG9uIHkgYWpvdXRlIGxlIHN0eWxlXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGVUZXh0ID0gXCJmb250LXNpemU6IDVlbTtmb250LXdlaWdodDogYm9sZDtcIjtcbiAgICAgICAgICAgICAgICBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjx0ZXh0IHg9JzUwJyB5PSc1MCcgZmlsbD0nJWNvbG9yJScgZmlsbC1vcGFjaXR5PSclb3BhY2l0eSUnICB0ZXh0LWFuY2hvcj0nbWlkZGxlJyBkb21pbmFudC1iYXNlbGluZT0nY2VudHJhbCcgc3R5bGU9JyVzdHlsZSUnPiBUIDwvdGV4dD48L3N2Zz5cXFwiKVwiO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZVtcImJhY2tncm91bmRcIl0gPSBzdmdcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlY29sb3IlXCIsICh2YWx1ZXMuY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyB2YWx1ZXMuY29sb3IgOiBDb2xvci5oZXhUb1JnYmEodmFsdWVzLmNvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlb3BhY2l0eSVcIiwgdmFsdWVzLm9wYWNpdHkgfHwgMSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3R5bGUlXCIsIHN0eWxlVGV4dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaWNvblwiOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb24gcmVzdGUgZGFucyBsZSBwYXJhZGlnbWUgZCd1dGlsaXNhdGlvbiBkdSBTVkcuLi4sXG4gICAgICAgICAgICAgICAgICAgIC8vIG1haXMgcHJvYmxlbWUgZGUgcmF0aW8gZGUgbCdpbWFnZSAhP1xuICAgICAgICAgICAgICAgICAgICBzdmcgPSBcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHdpZHRoPScyN3B4JyBoZWlnaHQ9JzI3cHgnIHg9JzAnIHk9JzAnIHZpZXdCb3g9JyV4JSAleSUgJXclICVoJSc+PGltYWdlIHdpZHRoPSclVyVweCcgaGVpZ2h0PSclSCVweCcgaHJlZj0nJVVSTCUnLz48L3N2Zz5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIleCVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZXMuaW1hZ2VdLngpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiV5JVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5pbWFnZV0ueSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8ldyUvZywgdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZXMuaW1hZ2VdLndpZHRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyVoJS9nLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5pbWFnZV0uaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVyVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS53KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlSCVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVVJMJVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy51cmwpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gc3ZnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZVRleHRJY29uID0gXCJmaWxsOiB0cmFuc3BhcmVudDtzdHJva2Utd2lkdGg6IDEwO1wiO1xuICAgICAgICAgICAgICAgICAgICBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxwYXRoIGQ9J00gNTAsMjAgODAsODIuNSAyMCw4Mi41IHonIHN0cm9rZT0nJWNvbG9yJScgc3R5bGU9JyVzdHlsZSUnLz48L3N2Zz5cXFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGVbXCJiYWNrZ3JvdW5kXCJdID0gc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVjb2xvciVcIiwgKHZhbHVlcy5jb2xvci5pbmRleE9mKFwicmdiXCIpID09PSAwKSA/IHZhbHVlcy5jb2xvciA6IENvbG9yLmhleFRvUmdiYSh2YWx1ZXMuY29sb3IsIDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3R5bGUlXCIsIHN0eWxlVGV4dEljb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgICAgICAgICAgICAgdmFyIGxzdHJvY2tlZGFzaGFycmF5ID0gKEFycmF5LmlzQXJyYXkodmFsdWVzW1wiZGFzaGFycmF5XCJdKSkgPyB2YWx1ZXNbXCJkYXNoYXJyYXlcIl0uam9pbihcIiBcIikgOiAwO1xuICAgICAgICAgICAgICAgIHN2ZyA9IFwidXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgdmVyc2lvbj0nMS4xJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSdub25lJyB2aWV3Qm94PScwIDAgMTAwIDEwMCc+PGxpbmUgeDE9JzAnIHkxPScxMDAnIHgyPScxMDAnIHkyPScwJyBzdHJva2U9JyVjb2xvciUnIHN0cm9rZS13aWR0aD0nJXN0cm9rZS13aWR0aCUnIHN0cm9rZS1vcGFjaXR5PSclc3Ryb2tlLW9wYWNpdHklJyBzdHJva2UtZGFzaGFycmF5PSclc3Ryb2tlLWRhc2hhcnJheSUnIC8+PC9zdmc+XFxcIilcIjtcbiAgICAgICAgICAgICAgICAvLyBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxwYXRoIGQ9J00wIDk5IEw5OSAwIEwxMDAgMSBMMSAxMDAnIHN0cm9rZT0nJWNvbG9yJScgc3Ryb2tlLXdpZHRoPScld2lkdGglJyBzdHJva2Utb3BhY2l0eT0nJW9wYWNpdHklJyBzdHJva2UtZGFzaGFycmF5PSclZGFzaGFycmF5JScgLz48L3N2Zz5cXFwiKVwiO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZVtcImJhY2tncm91bmRcIl0gPSBzdmdcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlY29sb3IlXCIsICh2YWx1ZXMuY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyB2YWx1ZXMuY29sb3IgOiBDb2xvci5oZXhUb1JnYmEodmFsdWVzLmNvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3Ryb2tlLW9wYWNpdHklXCIsIHZhbHVlcy5vcGFjaXR5IHx8IDEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJXN0cm9rZS1kYXNoYXJyYXklXCIsIGxzdHJvY2tlZGFzaGFycmF5KVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVzdHJva2Utd2lkdGglXCIsICh2YWx1ZXMud2lkdGggfHwgMCkgKiBmYWN0b3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNpcmNsZVwiOlxuICAgICAgICAgICAgICAgIHZhciBjc3Ryb2NrY29sb3IgPSB2YWx1ZXNbXCJzdHJva2UtY29sb3JcIl0gfHwgXCIjRkZGRkZGXCI7XG4gICAgICAgICAgICAgICAgc3ZnID0gXCJ1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHZpZXdCb3g9JzAgMCAxMDAgMTAwJz48Y2lyY2xlIGN4PSc1MCcgY3k9JzUwJyByPSc0MCcgc3Ryb2tlPSclc3Ryb2tlLWNvbG9yJScgc3Ryb2tlLXdpZHRoPSclc3Ryb2tlLXdpZHRoJScgc3Ryb2tlLW9wYWNpdHk9JyVzdHJvY2stb3BhY2l0eSUnIGZpbGw9JyVjb2xvciUnIGZpbGwtb3BhY2l0eT0nJW9wYWNpdHklJyAvPjwvc3ZnPlxcXCIpXCI7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlW1wiYmFja2dyb3VuZFwiXSA9IHN2Z1xuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVjb2xvciVcIiwgKHZhbHVlcy5jb2xvci5pbmRleE9mKFwicmdiXCIpID09PSAwKSA/IHZhbHVlcy5jb2xvciA6IENvbG9yLmhleFRvUmdiYSh2YWx1ZXMuY29sb3IsIDEpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVvcGFjaXR5JVwiLCB2YWx1ZXMub3BhY2l0eSB8fCAxKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVzdHJva2UtY29sb3IlXCIsIChjc3Ryb2NrY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyBjc3Ryb2NrY29sb3IgOiBDb2xvci5oZXhUb1JnYmEoY3N0cm9ja2NvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3Ryb2tlLW9wYWNpdHklXCIsIHZhbHVlc1tcInN0cm9rZS1vcGFjaXR5XCJdIHx8IDEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJXN0cm9rZS13aWR0aCVcIiwgKHZhbHVlc1tcInN0cm9rZS13aWR0aFwiXSB8fCAwKSAqIGZhY3Rvcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmFja2dyb3VuZFwiOlxuICAgICAgICAgICAgY2FzZSBcImZpbGxcIjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgc3ZnID0gXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgdmVyc2lvbj0nMS4xJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSdub25lJyB3aWR0aD0nMjdweCcgaGVpZ2h0PScyN3B4JyB4PScwJyB5PScwJyB2aWV3Qm94PScleCUgJXklICV3JSAlaCUnPjxpbWFnZSB3aWR0aD0nJVclcHgnIGhlaWdodD0nJUglcHgnIGhyZWY9JyVVUkwlJy8+PC9zdmc+XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJXglXCIsIHRoaXMub3B0aW9ucy5zcHJpdGVzLmpzb25bdmFsdWVzLnBhdHRlcm5dLngpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiV5JVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5wYXR0ZXJuXS55KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyV3JS9nLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5wYXR0ZXJuXS53aWR0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8laCUvZywgdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZXMucGF0dGVybl0uaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVyVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS53KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlSCVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVVJMJVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy51cmwpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gc3ZnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmc3Ryb2tlY29sb3IgPSB2YWx1ZXNbXCJvdXRsaW5lLWNvbG9yXCJdIHx8IFwiI0ZGRkZGRlwiO1xuICAgICAgICAgICAgICAgICAgICBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxyZWN0IHg9JzAnIHk9JzAnIHdpZHRoPScxMDAnIGhlaWdodD0nMTAwJyByeD0nNScgcnk9JzUnIHN0cm9rZT0nJXN0cm9rZS1jb2xvciUnIHN0cm9rZS13aWR0aD0nMycgZmlsbD0nJWNvbG9yJScgZmlsbC1vcGFjaXR5PSclb3BhY2l0eSUnIC8+PC9zdmc+XFxcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlW1wiYmFja2dyb3VuZFwiXSA9IHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlY29sb3IlXCIsICh2YWx1ZXMuY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyB2YWx1ZXMuY29sb3IgOiBDb2xvci5oZXhUb1JnYmEodmFsdWVzLmNvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJW9wYWNpdHklXCIsIHZhbHVlcy5vcGFjaXR5IHx8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVzdHJva2UtY29sb3IlXCIsIChmc3Ryb2tlY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyBmc3Ryb2tlY29sb3IgOiBDb2xvci5oZXhUb1JnYmEoZnN0cm9rZWNvbG9yLCAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInR5cGUgbm90IGZvdW5kLCBubyB0aHVtYm5haWwuLi5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gdmFsdWUgb2YgYSBwcm9wZXJ0eSAoZXguIFwiIzJCQjNFMVwiKVxuICAgICAqIEByZXR1cm5zIHsqfSByZXR1cm4gYSB2ZXJpZmllZCB2YWx1ZSAoZXguIGNvbG9yXCI6IFwiIzJCQjNFMVwiKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHR5cGUgc2ltcGxlIGZvciBmaWxsLCBsaW5lIG9yIGNpcmNsZSB0eXBlIHdpdGggc3RyaW5nIDpcbiAgICAgKiAvLyBcInBhaW50XCI6IHtcbiAgICAgKiAvLyAgICAgXCJmaWxsLWNvbG9yXCI6IFwiIzJCQjNFMVwiXG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gdHlwZSBzaW1wbGUgZm9yIGZpbGwsIGxpbmUgb3IgY2lyY2xlIHR5cGUgd2l0aCBhcnJheSA6XG4gICAgICogLy8gXCJwYWludFwiOiB7XG4gICAgICogLy8gICAgIFwibGluZS1kYXNoYXJyYXlcIjogWzIsMTBdXG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gVE9ETyB0eXBlIGNvbXBsZXhlIDogbm90IHlldCBpbXBsZW1lbnRlZCAhXG4gICAgICogLy8gXCJwYWludFwiOiB7XG4gICAgICogLy8gICAgIFwiZmlsbC1jb2xvclwiOiBbXG4gICAgICogLy8gICAgICAgICAgXCJtYXRjaFwiLFxuICAgICAqIC8vICAgICAgICAgIFtcImdldFwiLFwic3ltYm9cIl0sXG4gICAgICogLy8gICAgICAgICAgXCJaT05FX0JPSVNFRVwiLFwiI0E3REE4MVwiLFxuICAgICAqIC8vICAgICAgICAgIFwiWk9ORV9NQU5HUk9WRVwiLFwiIzdFOEFCNVwiLFxuICAgICAqIC8vICAgICAgICAgIFwiI0E3REE4MVwiXG4gICAgICogLy8gICAgICBdXG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gb3RoZXIgdHlwZSBjb21wbGV4ZSA6XG4gICAgICogLy8gXCJwYWludFwiOiB7XG4gICAgICogLy8gICAgIFwiZmlsbC1jb2xvclwiOiB7XG4gICAgICogLy8gICAgICAgIFwiYmFzZVwiOiAxLFxuICAgICAqIC8vICAgICAgICBcInN0b3BzXCI6IFtcbiAgICAgKiAvLyAgICAgICAgW1xuICAgICAqIC8vICAgICAgICAgIDE1LjUsXG4gICAgICogLy8gICAgICAgICBcIiNmMmVhZTJcIlxuICAgICAqIC8vICAgICAgICBdLFxuICAgICAqIC8vICAgICAgICBbXG4gICAgICogLy8gICAgICAgICAgMTYsXG4gICAgICogLy8gICAgICAgICAgXCIjZGZkYmQ3XCJcbiAgICAgKiAvLyAgICAgICAgXVxuICAgICAqIC8vICAgICAgICBdXG4gICAgICogLy8gICAgIH1cbiAgICAgKiAvLyB9XG4gICAgICovXG4gICAgX2dldFZhbHVlICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gY2FzIGQndW4gdGFibGVhdSBkZSB2YWxldXJzIG51bcOpcmlxdWVzIDogWzEsMiwzXVxuICAgICAgICAgICAgdmFyIGlzTnVtYmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoXCJzdG9wc1wiIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gb24gcmVhbGlzZSB1biBvcmRyZSBpbnZlcnPDqSBzdXIgbGVzIHpvb21zXG4gICAgICAgICAgICAgICAgdmFsdWUuc3RvcHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtQSA9IGFbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1CID0gYlswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bUEgPiBudW1CKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bUEgPCBudW1CKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBldCwgb24gcHJlbmQgbGUgcGx1cyBwZXRpdCB6b29tXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RTdG9wc1ZhbHVlID0gdmFsdWUuc3RvcHMuc2xpY2UoLTEpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxhc3RTdG9wc1ZhbHVlWzBdWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJ2YWx1ZSBub3Qgc3VwcG9ydGVkICFcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBET00gbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAqIENyZWF0ZSBhIEdyYXBoaWNhbCBMZWdlbmQgSWNvblxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50aXRsZSAtIHRpdGxlXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR5cGUgLSBmaWxsLCBsaW5lLCBjaXJjbGUsIHRleHQsIGljb24sIC4uLlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy52YWx1ZXMgLSB7XCJjb2xvclwiOiBcIiMyQkIzRTFcIiwgXCJ3aWR0aFwiOiAxMCwgXCJvcGFjaXR5XCI6IDAuNSwgXCJzdHJva2VcIjogXCIjMkJCM0UxXCJ9XG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lZGl0IC0gZWRpdGFibGUgd2l0aCBhIGNvbG9yUGlja2VyIGZvciBvbmx5IGxpbmUsIGZpbGwgYW5kIGNpcmNsZSBsZWdlbmQgIVxuICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgKlxuICAgICogQHByaXZhdGVcbiAgICAqIEBleGFtcGxlXG4gICAgKiAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExlZ2VuZFJlbmRlckNvbnRhaW5lclwiPlxuICAgICogICAgICAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyIEdQRWRpdG9yTWFwQm94TGVnZW5kRWRpdGFibGUgbGVnZW5kLWZpbGxcIlxuICAgICogICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdXJsKCZxdW90O2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHZpZXdCb3g9JzAgMCAxMDAgMTAwJz48cmVjdCB4PScwJyB5PScwJyB3aWR0aD0nMTAwJyBoZWlnaHQ9JzEwMCcgcng9JzUnIHJ5PSc1JyBmaWxsPSdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJyBmaWxsLW9wYWNpdHk9JzEnIC8+PC9zdmc+JnF1b3Q7KTtcIj5cbiAgICAqICAgICAgIDwvZGl2PlxuICAgICogICAgICAgPHNwYW4gY2xhc3M9XCJHUEVkaXRvck1hcEJveExlZ2VuZFRpdGxlXCI+dmlkZS4uLjwvc3Bhbj5cbiAgICAqIDwvZGl2PlxuICAgICovXG4gICAgX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kIChwYXJhbXMpIHtcbiAgICAgICAgLy8gY29udGV4dGVcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcmxlZ2VuZHJlbmRlcjtcblxuICAgICAgICB2YXIgZGl2ID0gdGhpcy5yZW5kZXJjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmxlZ2VuZHJlbmRlcjtcbiAgICAgICAgaWYgKHBhcmFtcy5lZGl0KSB7XG4gICAgICAgICAgICBkaXYuY2xhc3NOYW1lICs9IFwiIFwiO1xuICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSArPSB0aGlzLm5hbWUubGVnZW5kZWRpdGFibGU7XG4gICAgICAgICAgICBpZiAoZGl2LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25FZGl0aW9uTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXYuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBkaXYuYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25FZGl0aW9uTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHlwZSBkZSBsZWdlbmRlXG4gICAgICAgIHZhciB0eXBlID0gcGFyYW1zLnR5cGU7XG5cbiAgICAgICAgLy8gVE9ETyBjbGFzc05hbWVcbiAgICAgICAgLy8gZGl2LmNsYXNzTmFtZSArPSBcIiBsZWdlbmQtbm90LWltcGxlbWVudGVkXCI7XG4gICAgICAgIC8vIGFqb3V0IGR1IHN0eWxlIHN1ciBsYSBkaXYgZGUgcmVuZHVcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlclRodW1ibmFpbCh0eXBlLCBwYXJhbXMudmFsdWVzKSkge1xuICAgICAgICAgICAgLy8gY2xhc3NOYW1lIHBvc3NpYmxlcyA6XG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtdGV4dFwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtaWNvblwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtYmFja2dyb3VuZFwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtbGluZVwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtbGluZS1ub3QtZWRpdGFibGVcIlxuICAgICAgICAgICAgLy8gXCIgbGVnZW5kLWNpcmNsZVwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtY2lyY2xlLW5vdC1lZGl0YWJsZVwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtZmlsbFwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtZmlsbC1ub3QtZWRpdGFibGVcIlxuICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSArPSAocGFyYW1zLmVkaXQpID8gXCIgbGVnZW5kLVwiICsgdHlwZSA6IFwiIGxlZ2VuZC1cIiArIHR5cGUgKyBcIi1ub3QtZWRpdGFibGVcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpdi5jbGFzc05hbWUgKz0gXCIgbGVnZW5kLXVua25vd1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSB0aGlzLm5hbWUubGVnZW5kdGl0bGU7XG4gICAgICAgIHNwYW4uaW5uZXJIVE1MID0gcGFyYW1zLnRpdGxlIHx8IFwiXCI7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcblxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ3JlYXRlIGEgR3JhcGhpY2FsIExlZ2VuZCBFZGl0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR5cGUgLSBmaWxsLCBsaW5lLCAoVE9ETyA6IGNpcmNsZSwgaWNvbiBvciB0ZXh0KVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy52YWx1ZXMgLSB7XCJmaWxsLWNvbG9yXCI6IFwiIzJCQjNFMVwifVxuICAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZWRpdCAtIGVkaXRhYmxlIHdpdGggYSBjb2xvclBpY2tlciBmb3Igb25seSBsaW5lIGFuZCBmaWxsIGxlZ2VuZCAhXG4gICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAqXG4gICAgKiBAcHJpdmF0ZVxuICAgICogQGV4YW1wbGVcbiAgICAqICAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kVG9vbHNDb250YWluZXJcIj5cbiAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtc3R5bGluZy1kaXZcIj5cbiAgICAqICAgICAgICAgICA8bGFiZWwgZm9yPVwic3Ryb2tlLWNvbG9yXCI+Q291bGV1ciBkdSB0cmFpdDwvbGFiZWw+XG4gICAgKiAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibGVnZW5kLXN0eWxpbmdcIiBpZD1cInN0cm9rZS1jb2xvclwiIHRpdGxlPVwiXCIgdHlwZT1cImNvbG9yXCI+XG4gICAgKiAgICAgICA8L2Rpdj5cbiAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtc3R5bGluZy1kaXZcIj5cbiAgICAqICAgICAgICAgICA8bGFiZWwgZm9yPVwic3Ryb2tlLXdpZHRoXCI+RXBhaXNzZXVyIGR1IHRyYWl0PC9sYWJlbD5cbiAgICAqICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJsZWdlbmQtc3R5bGluZ1wiIGlkPVwic3Ryb2tlLXdpZHRoXCIgdGl0bGU9XCJcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiIHZhbHVlPVwiMVwiPlxuICAgICogICAgICAgPC9kaXY+XG4gICAgKiAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXN0eWxpbmctZGl2XCI+XG4gICAgKiAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0cm9rZS1vcGFjaXR5XCI+T3BhY2l0w6kgZHUgdHJhaXQ8L2xhYmVsPlxuICAgICogICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImxlZ2VuZC1zdHlsaW5nXCIgaWQ9XCJzdHJva2Utb3BhY2l0eVwiIHRpdGxlPVwiXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjFcIiBzdGVwPVwiMC4xXCIgdmFsdWU9XCIxXCI+XG4gICAgKiAgICAgICA8L2Rpdj5cbiAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtc3R5bGluZy1kaXZcIj5cbiAgICAqICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsbC1jb2xvclwiPkNvdWxldXIgZGUgcmVtcGxpc3NhZ2U8L2xhYmVsPlxuICAgICogICAgICAgIDxpbnB1dCBjbGFzcz1cImxlZ2VuZC1zdHlsaW5nXCIgaWQ9XCJmaWxsLWNvbG9yXCIgdGl0bGU9XCJcIiB0eXBlPVwiY29sb3JcIj5cbiAgICAqICAgICAgIDwvZGl2PlxuICAgICogICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1zdHlsaW5nLWRpdlwiPlxuICAgICogICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaWxsLW9wYWNpdHlcIj5PcGFjaXTDqSBkdSByZW1wbGlzc2FnZTwvbGFiZWw+XG4gICAgKiAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibGVnZW5kLXN0eWxpbmdcIiBpZD1cImZpbGwtb3BhY2l0eVwiIHRpdGxlPVwiXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjFcIiBzdGVwPVwiMC4xXCIgdmFsdWU9XCIxXCI+XG4gICAgKiAgICAgICA8L2Rpdj5cbiAgICAqICAgPC9kaXY+XG4gICAgKi9cbiAgICBfY3JlYXRlRWxlbWVudEVkaXRpb25MZWdlbmQgKHBhcmFtcykge1xuICAgICAgICAvLyBjb250ZXh0ZVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kdG9vbHM7XG5cbiAgICAgICAgLy8gdW5pcXVlbWVudCBsZXMgZWxlbWVudHMgZWRpdGFibGVzICFcbiAgICAgICAgaWYgKCFwYXJhbXMuZWRpdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIG5lIHRyYWl0ZSBxdWUgbCdlZGl0aW9uIGR1IG1vZGUgJ3RyYWl0cycgb3UgJ3N1cmZhY2lxdWVzJ1xuICAgICAgICAvLyBtb2RlICdsaW5lJ1xuICAgICAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGluZVwiOlxuICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVDb2xvci5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVXaWR0aC5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVPcGFjaXR5LmNhbGwoc2VsZik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmFja2dyb3VuZFwiOlxuICAgICAgICAgICAgY2FzZSBcImZpbGxcIjpcbiAgICAgICAgICAgICAgICBjcmVhdGVGaWxsQ29sb3IuY2FsbChzZWxmKTtcbiAgICAgICAgICAgICAgICBjcmVhdGVGaWxsT3BhY2l0eS5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvdWxldXIgZHUgdHJhaXRcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlTGluZUNvbG9yICgpIHtcbiAgICAgICAgICAgIHZhciBsaW5lY29sb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgbGluZWNvbG9yLmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbExpbmVDb2xvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxMaW5lQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtbGluZVwiO1xuICAgICAgICAgICAgbExpbmVDb2xvci5odG1sRm9yID0gdGhpcy5pZCA/IFwibGluZS1jb2xvci1cIiArIHRoaXMuaWQgOiBcImxpbmUtY29sb3JcIjtcbiAgICAgICAgICAgIGxMaW5lQ29sb3IuaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJsaW5lLWNvbG9yXCJdO1xuICAgICAgICAgICAgdmFyIGlucHV0TGluZUNvbG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IuaWQgPSB0aGlzLmlkID8gXCJsaW5lLWNvbG9yLVwiICsgdGhpcy5pZCA6IFwibGluZS1jb2xvclwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IudGl0bGUgPSBcIlNlbGVjdGlvbm5lciB1bmUgY291bGV1ciBkZSB0cmFpdFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IudHlwZSA9IFwiY29sb3JcIjtcbiAgICAgICAgICAgIGlucHV0TGluZUNvbG9yLnZhbHVlID0gcGFyYW1zLnZhbHVlcy5jb2xvcjtcbiAgICAgICAgICAgIGlucHV0TGluZUNvbG9yLnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJsaW5lLWNvbG9yXCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0TGluZUNvbG9yLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dExpbmVDb2xvci5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dExpbmVDb2xvci5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgIGlucHV0TGluZUNvbG9yLmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaW5lY29sb3IuYXBwZW5kQ2hpbGQobExpbmVDb2xvcik7XG4gICAgICAgICAgICBsaW5lY29sb3IuYXBwZW5kQ2hpbGQoaW5wdXRMaW5lQ29sb3IpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVjb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlcGFpc3NldXIgZHUgdHJhaXRcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlTGluZVdpZHRoICgpIHtcbiAgICAgICAgICAgIHZhciBsaW5ld2lkdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgbGluZXdpZHRoLmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbExpbmVXaWR0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxMaW5lV2lkdGguY2xhc3NOYW1lID0gXCJsZWdlbmQtbGluZVwiO1xuICAgICAgICAgICAgbExpbmVXaWR0aC5odG1sRm9yID0gdGhpcy5pZCA/IFwibGluZS13aWR0aC1cIiArIHRoaXMuaWQgOiBcImxpbmUtd2lkdGhcIjtcbiAgICAgICAgICAgIGxMaW5lV2lkdGguaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJsaW5lLXdpZHRoXCJdO1xuICAgICAgICAgICAgdmFyIGlucHV0TGluZVdpZHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguaWQgPSB0aGlzLmlkID8gXCJsaW5lLXdpZHRoLVwiICsgdGhpcy5pZCA6IFwibGluZS13aWR0aFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGgudGl0bGUgPSBwYXJhbXMudmFsdWVzLndpZHRoO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGgudHlwZSA9IFwicmFuZ2VcIjtcbiAgICAgICAgICAgIGlucHV0TGluZVdpZHRoLm1pbiA9IFwiMFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGgubWF4ID0gXCIxMFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguc3RlcCA9IFwiMVwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguZGVmYXVsdFZhbHVlID0gcGFyYW1zLnZhbHVlcy53aWR0aDtcbiAgICAgICAgICAgIGlucHV0TGluZVdpZHRoLnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJsaW5lLXdpZHRoXCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0TGluZVdpZHRoLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dExpbmVXaWR0aC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShlKTtcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudGl0bGUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0TGluZVdpZHRoLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguYXR0YWNoRXZlbnQoXCJvbmNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZSk7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnRpdGxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZXdpZHRoLmFwcGVuZENoaWxkKGxMaW5lV2lkdGgpO1xuICAgICAgICAgICAgbGluZXdpZHRoLmFwcGVuZENoaWxkKGlucHV0TGluZVdpZHRoKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5ld2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3BhY2l0w6kgZHUgdHJhaXRcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlTGluZU9wYWNpdHkgKCkge1xuICAgICAgICAgICAgdmFyIGxpbmVvcGFjaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGxpbmVvcGFjaXR5LmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbExpbmVPcGFjaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAgICAgbExpbmVPcGFjaXR5LmNsYXNzTmFtZSA9IFwibGVnZW5kLWxpbmVcIjtcbiAgICAgICAgICAgIGxMaW5lT3BhY2l0eS5odG1sRm9yID0gdGhpcy5pZCA/IFwibGluZS1vcGFjaXR5LVwiICsgdGhpcy5pZCA6IFwibGluZS1vcGFjaXR5XCI7XG4gICAgICAgICAgICBsTGluZU9wYWNpdHkuaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJsaW5lLW9wYWNpdHlcIl07XG4gICAgICAgICAgICB2YXIgaW5wdXRMaW5lT3BhY2l0eSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS5pZCA9IHRoaXMuaWQgPyBcImxpbmUtb3BhY2l0eS1cIiArIHRoaXMuaWQgOiBcImxpbmUtb3BhY2l0eVwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS50aXRsZSA9IHBhcmFtcy52YWx1ZXMub3BhY2l0eTtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkudHlwZSA9IFwicmFuZ2VcIjtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkubWluID0gXCIwXCI7XG4gICAgICAgICAgICBpbnB1dExpbmVPcGFjaXR5Lm1heCA9IFwiMVwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS5zdGVwID0gXCIwLjFcIjtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkuZGVmYXVsdFZhbHVlID0gcGFyYW1zLnZhbHVlcy5vcGFjaXR5O1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIsIFwibGluZS1vcGFjaXR5XCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0TGluZU9wYWNpdHkuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZSk7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnRpdGxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5IDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0TGluZU9wYWNpdHkuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dExpbmVPcGFjaXR5LmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGUpO1xuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC50aXRsZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXJUaHVtYm5haWwocGFyYW1zLnR5cGUsIE9iamVjdC5hc3NpZ24ocGFyYW1zLnZhbHVlcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZW9wYWNpdHkuYXBwZW5kQ2hpbGQobExpbmVPcGFjaXR5KTtcbiAgICAgICAgICAgIGxpbmVvcGFjaXR5LmFwcGVuZENoaWxkKGlucHV0TGluZU9wYWNpdHkpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVvcGFjaXR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvdWxldXIgZGUgcmVtcGxpc3NhZ2VcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRmlsbENvbG9yICgpIHtcbiAgICAgICAgICAgIHZhciBmaWxsY29sb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZmlsbGNvbG9yLmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbEZpbGxDb2xvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxGaWxsQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtZmlsbFwiO1xuICAgICAgICAgICAgbEZpbGxDb2xvci5odG1sRm9yID0gdGhpcy5pZCA/IFwiZmlsbC1jb2xvci1cIiArIHRoaXMuaWQgOiBcImZpbGwtY29sb3JcIjtcbiAgICAgICAgICAgIGxGaWxsQ29sb3IuaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJmaWxsLWNvbG9yXCJdO1xuICAgICAgICAgICAgdmFyIGlucHV0RmlsbENvbG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IuaWQgPSB0aGlzLmlkID8gXCJmaWxsLWNvbG9yLVwiICsgdGhpcy5pZCA6IFwiZmlsbC1jb2xvclwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IudGl0bGUgPSBcIlNlbGVjdGlvbm5lciB1bmUgY291bGV1ciBkZSByZW1wbGlzc2FnZVwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IudHlwZSA9IFwiY29sb3JcIjtcbiAgICAgICAgICAgIGlucHV0RmlsbENvbG9yLnZhbHVlID0gcGFyYW1zLnZhbHVlcy5jb2xvcjtcbiAgICAgICAgICAgIGlucHV0RmlsbENvbG9yLnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJmaWxsLWNvbG9yXCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0RmlsbENvbG9yLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEZpbGxDb2xvci5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dEZpbGxDb2xvci5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgIGlucHV0RmlsbENvbG9yLmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxsY29sb3IuYXBwZW5kQ2hpbGQobEZpbGxDb2xvcik7XG4gICAgICAgICAgICBmaWxsY29sb3IuYXBwZW5kQ2hpbGQoaW5wdXRGaWxsQ29sb3IpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZpbGxjb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvcGFjaXTDqSBkdSByZW1wbGlzc2FnZVxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVGaWxsT3BhY2l0eSAoKSB7XG4gICAgICAgICAgICB2YXIgZmlsbG9wYWNpdHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZmlsbG9wYWNpdHkuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZy1kaXZcIjtcbiAgICAgICAgICAgIHZhciBsRmlsbE9wYWNpdHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgICBsRmlsbE9wYWNpdHkuY2xhc3NOYW1lID0gXCJsZWdlbmQtZmlsbFwiO1xuICAgICAgICAgICAgbEZpbGxPcGFjaXR5Lmh0bWxGb3IgPSB0aGlzLmlkID8gXCJmaWxsLW9wYWNpdHktXCIgKyB0aGlzLmlkIDogXCJmaWxsLW9wYWNpdHlcIjtcbiAgICAgICAgICAgIGxGaWxsT3BhY2l0eS5pbm5lckhUTUwgPSB0aGlzLmxhYmVsc1tcImZpbGwtb3BhY2l0eVwiXTtcbiAgICAgICAgICAgIHZhciBpbnB1dEZpbGxPcGFjaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5jbGFzc05hbWUgPSBcImxlZ2VuZC1zdHlsaW5nXCI7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LmlkID0gdGhpcy5pZCA/IFwiZmlsbC1vcGFjaXR5LVwiICsgdGhpcy5pZCA6IFwiZmlsbC1vcGFjaXR5XCI7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LnRpdGxlID0gcGFyYW1zLnZhbHVlcy5vcGFjaXR5O1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS50eXBlID0gXCJyYW5nZVwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5taW4gPSBcIjBcIjtcbiAgICAgICAgICAgIGlucHV0RmlsbE9wYWNpdHkubWF4ID0gXCIxXCI7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LnN0ZXAgPSBcIjAuMVwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5kZWZhdWx0VmFsdWUgPSBwYXJhbXMudmFsdWVzLm9wYWNpdHk7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJmaWxsLW9wYWNpdHlcIik7XG4gICAgICAgICAgICBpZiAoaW5wdXRGaWxsT3BhY2l0eS5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnRpdGxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5IDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RmlsbE9wYWNpdHkuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudGl0bGUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgOiBlLnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2VWYWx1ZUxlZ2VuZE1hcEJveChlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGxvcGFjaXR5LmFwcGVuZENoaWxkKGxGaWxsT3BhY2l0eSk7XG4gICAgICAgICAgICBmaWxsb3BhY2l0eS5hcHBlbmRDaGlsZChpbnB1dEZpbGxPcGFjaXR5KTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxsb3BhY2l0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHVibGljIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIEFkZCBlbGVtZW50IGludG8gdGFyZ2V0IERPTVxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBMZWdlbmQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGQgKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIG9yIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJkaXNwbGF5KClcIiwgZGlzcGxheSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiZmxleFwiIDogXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcImZsZXhcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgZWRpdGFibGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICBpc0VkaXRhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciBMZWdlbmQgUmVuZGVyIChET00pXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKiBAc2VlIExheWVyLnByb3RvdHlwZS5zbG90TGVnZW5kKClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRSZW5kZXIgbGVnZW5kLShsaW5lfGZpbGx8YmFja2dyb3VuZHx0ZXh0fGljb258Y2lyY2xlfHVua25vdylcIiBzdHlsZT1cIi4uLlwiPjwvZGl2PlxuICAgICAqL1xuICAgIGdldFJlbmRlckNvbnRhaW5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIExlZ2VuZCBUb29scyAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICogQHNlZSBMYXllci5wcm90b3R5cGUuc2xvdExlZ2VuZCgpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kVG9vbHNDb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKi9cbiAgICBnZXRUb29sc0NvbnRhaW5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvb2xzY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjb250YWluZXIgKERPTSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtET01FbGVtZW50fSBET00gZWxlbWVudFxuICAgICAqL1xuICAgIGdldENvbnRhaW5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIHRvIGRvbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBMZWdlbmQjZWRpdG9yOmxlZ2VuZDpvbmNsaWNrZWRpdGlvblxuICAgICAqL1xuICAgIG9uRWRpdGlvbkxlZ2VuZE1hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvbkVkaXRpb25MZWdlbmRNYXBCb3hcIiwgZSk7XG4gICAgICAgIGUuZWRpdG9ySUQgPSB0aGlzLmlkO1xuICAgICAgICBlLmRhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIEV2ZW50QnVzLmRpc3BhdGNoKEV2ZW50RWRpdG9yLmxlZ2VuZC5vbmNsaWNrZWRpdGlvbiwgZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgTGVnZW5kI2VkaXRvcjpsZWdlbmQ6b25jaGFuZ2V2YWx1ZVxuICAgICAqL1xuICAgIG9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DaGFuZ2VWYWx1ZUxlZ2VuZE1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3IubGVnZW5kLm9uY2hhbmdldmFsdWUsIGUpO1xuICAgIH1cblxufTtcblxuO1xuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDT05TVEFOVEVTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbi8qKlxuICogTGlzdCBvZiBzdXBwb3J0ZWQgcHJvcGVydGllc1xuICovXG5MZWdlbmQuUFJPUEVSVElFUyA9IHtcbiAgICBsaW5lIDogW1xuICAgICAgICBcImxpbmUtY29sb3JcIixcbiAgICAgICAgXCJsaW5lLWRhc2hhcnJheVwiLFxuICAgICAgICBcImxpbmUtb3BhY2l0eVwiLFxuICAgICAgICBcImxpbmUtd2lkdGhcIlxuICAgIF0sXG4gICAgZmlsbCA6IFtcbiAgICAgICAgXCJmaWxsLWNvbG9yXCIsXG4gICAgICAgIFwiZmlsbC1vcGFjaXR5XCIsXG4gICAgICAgIFwiZmlsbC1vdXRsaW5lLWNvbG9yXCIsXG4gICAgICAgIFwiZmlsbC1wYXR0ZXJuXCJcbiAgICBdLFxuICAgIGJhY2tncm91bmQgOiBbXG4gICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiLFxuICAgICAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiLFxuICAgICAgICBcImJhY2tncm91bmQtcGF0dGVyblwiXG4gICAgXSxcbiAgICBjaXJjbGUgOiBbXG4gICAgICAgIFwiY2lyY2xlLWNvbG9yXCIsXG4gICAgICAgIFwiY2lyY2xlLW9wYWNpdHlcIixcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCIsXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCIsXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiXG4gICAgXSxcbiAgICBpY29uIDogW1xuICAgICAgICBcImljb24tY29sb3JcIixcbiAgICAgICAgXCJpY29uLWltYWdlXCIsXG4gICAgICAgIFwiaWNvbi1vcGFjaXR5XCIsXG4gICAgICAgIFwiX19pY29uLXNpemVcIlxuICAgIF0sXG4gICAgdGV4dCA6IFtcbiAgICAgICAgXCJfX3RleHQtYW5jaG9yXCIsXG4gICAgICAgIFwidGV4dC1jb2xvclwiLFxuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAgXCJfX3RleHQtZm9udFwiLFxuICAgICAgICBcIl9fdGV4dC1vcGFjaXR5XCIsXG4gICAgICAgIFwiX190ZXh0LXNpemVcIlxuICAgIF1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IExlZ2VuZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Legend.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/ColorUtils */ \"./src/Common/Utils/ColorUtils.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getLogger(\"editor-legend\");\n\n/**\n * @classdesc\n *\n * MapBox Legend management\n *\n * @constructor\n * @alias ol.style.editor.Legend\n * @param {Object} options - options for function call.\n * @param {Object} [options.target = null] - ...\n * @param {Number} [options.position = 0] - ...\n * @param {Number} [options.id = null] - (internal) ...\n * @param {Object} [options.sprites = null] - ...\n * @param {String} [options.sprites.url] - ...\n * @param {Object} [options.sprites.size] - {h:, w:} ...\n * @param {Object} [options.sprites.json] - ...\n * @param {Object} options.obj - ...\n * @param {String} [options.obj.title] - ...\n * @param {Boolean} [options.obj.editable = true] - ...\n * @param {Object} options.obj.paint - ...\n * @param {Object} options.obj.layout - ...\n * @example\n * var legend = new Legend ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * sprites : {\n * url : \"http://localhost/sprites.png\",\n * size : { w : 450, h : 550 },\n * json : {\n * icon-1 : {x:,y:,height:,width:,pixelRatio:},\n * icon-2 : {x:,y:,height:,width:,pixelRatio:}\n * }\n * },\n * obj : {\n * title : \"\",\n * editable : true, // tag non standard issue du style json dédié à l'edition\n * paint : {\"fill-color\": \"#2BB3E1\"},\n * layout : {visibility:\"none\"}\n * }\n * });\n * legend.add();\n * legend.display(true);\n * legend.isEditable();\n * legend.getRenderContainer();\n * legend.getToolsContainer();\n * legend.getContainer();\n */\nvar Legend = /*#__PURE__*/function () {\n function Legend(options) {\n _classCallCheck(this, Legend);\n logger.trace(\"[constructor] Legend\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n position: 0,\n sprites: null,\n obj: null\n };\n if (!(this instanceof Legend)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n // ################################################################### //\n // ########################## init methods ########################### //\n // ################################################################### //\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Legend, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n\n // permet d'avoir un identifiant de position dans la liste des layers\n if (!this.options.position) {\n this.options.position = 0;\n }\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition...\n this.options.obj = {\n title: \"vide...\",\n editable: true,\n paint: {\n \"fill-color\": \"#FFFFFF\"\n }\n };\n }\n\n // la legende est elle editable ?\n // le tag 'editable' est à placer dans le fichier de style (dans le layer)...\n var _editable = this.options.obj.editable;\n this.editable = typeof _editable !== \"undefined\" ? _editable : false;\n\n // liste des caractéristiques de la legende par defaut\n this.legendRender = {\n type: \"fill\",\n values: {\n width: 1,\n stroke: \"#FFFFFF\",\n color: \"#000000\",\n opacity: 1\n }\n };\n\n // DOM : pointer\n this.container = null;\n this.rendercontainer = null;\n this.toolscontainer = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxLegendTarget\",\n container: \"GPEditorMapBoxLegendContainer\",\n containerlegendrender: \"GPEditorMapBoxLegendRenderContainer\",\n legendrender: \"GPEditorMapBoxLegendRender\",\n legendeditable: \"GPEditorMapBoxLegendEditable\",\n legendtitle: \"GPEditorMapBoxLegendTitle\",\n containerlegendtools: \"GPEditorMapBoxLegendToolsContainer\"\n };\n\n // DOM : Label menu Edition\n this.labels = {\n \"line-color\": \"Couleur du trait\",\n \"line-width\": \"Epaisseur du trait\",\n \"line-opacity\": \"Opacité du trait\",\n \"fill-color\": \"Couleur de remplissage\",\n \"fill-opacity\": \"Opacité du remplissage\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n *
\n * test circle editable...\n *
\n *
...
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n var _obj = this.options.obj;\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // INFO\n // on recherche les informations dans le tag 'paint' en priorité, mais pour\n // les icones ou textes, les informations peuvent se trouver aussi dans le tag 'layout'...\n // on fusionnne paint et layout par facilité\n var style = Object.assign({}, _obj.paint, _obj.layout);\n\n // liste des properties mapbox\n // ex. fill-color\n var keys = Object.keys(style);\n if (keys.length === 0) {\n logger.info(\"tag 'paint' or 'layout' is empty !\");\n return;\n }\n\n // FIXME\n // - gestion de type plus complexe : texte avec/sans symbole ou symbole !\n // - pour les textes ou icones, les info peuvent être aussi dans le tag 'layout' !\n var params = {};\n var bFound = false;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n // recherche du type\n // ex. fill\n if (/fill-/.test(key) || /line-/.test(key) || /circle-/.test(key) || /background-/.test(key) || /text-/.test(key) || /icon-/.test(key)) {\n // style geré & trouvé\n bFound = true;\n var title = _obj.title || \"\";\n\n // INFO\n // le type texte ou icone est difficile à trouver car les 2 types cohabitent,\n // on le gère en symbole...\n var type = key.split(\"-\")[0];\n if (type === \"text\" || type === \"icon\") {\n type = \"symbol\";\n }\n this.legendRender = this._getProperties(type, style);\n params = {\n edit: this.editable,\n title: title,\n type: this.legendRender.type,\n values: this.legendRender.values\n };\n div.appendChild(this._createElementIconLegend(params));\n\n // on stoppe la recherche\n break;\n }\n }\n\n // legende avec un style indeterminé ou non géré !?\n if (!bFound) {\n // on prend la legende par defaut\n params = {\n edit: this.editable,\n title: \"\",\n type: this.legendRender.type,\n values: this.legendRender.values\n };\n div.appendChild(this._createElementIconLegend(params));\n logger.warn(\"legend type unknown, default legend used...\");\n }\n\n // ajout mode edition graphique de la legende\n this.toolscontainer = this._createElementEditionLegend(params);\n div.appendChild(this.toolscontainer);\n\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### private methods ############################# //\n // ################################################################### //\n /**\n * Get properties supported\n *\n * @param {Object} type - fill, line, circle, text, icon...\n * @param {Object} values - raw values from the JSON file\n * @returns {Object} - { type : (fill | line | circle | symbol), values : valuesSupported }\n *\n * @private\n * @example\n *\n * // TODO\n * // symbol with text (1) / symbol without text (2) / text (3)\n * // \"layout\":{\n * // \"icon-image\":\"{maki}-11\", \n * // \"text-font\":[\n * // \"Open Sans Semibold\",\n * // \"Arial Unicode MS Bold\"\n * // ],\n * // \"text-field\":\"{name_en}\", \n * // \"text-max-width\":9,\n * // \"text-padding\":2,\n * // \"text-offset\":[\n * // 0,\n * // 0.6\n * // ],\n * // \"text-anchor\":\"top\",\n * // \"text-size\":12\n * // },\n * // \"paint\":{\n * // \"text-color\":\"#666\",\n * // \"text-halo-color\":\"#ffffff\",\n * // \"text-halo-width\":1,\n * // \"text-halo-blur\":0.5\n * // },\n *\n */\n }, {\n key: \"_getProperties\",\n value: function _getProperties(type, values) {\n // cas particulier du symbole complexe\n // il existe plusieurs types pour un symbole :\n // - text\n // - icon\n // - icon with text\n if (type === \"symbol\") {\n var isTextValue = values[\"text-field\"];\n var isIconValue = values[\"icon-image\"];\n type = isTextValue && isIconValue ? \"icon\" : isTextValue ? \"text\" : isIconValue ? \"icon\" : \"unknow\";\n if (type === \"unknow\") {\n logger.warn(\"type unknow !?\");\n return;\n }\n }\n var valuesSupported = {};\n for (var key in values) {\n if (Object.hasOwnProperty.call(values, key)) {\n var val = values[key];\n if (Legend.PROPERTIES[type].includes(key)) {\n var prop = key.replace(type, \"\").slice(1);\n var value = this._getValue(val);\n if (value) {\n // cas particulier des sprites\n if (prop === \"pattern\" || prop === \"image\") {\n if (!this.options.sprites || !this.options.sprites.json || !this.options.sprites.json[value]) {\n var k = type + \":\" + prop;\n logger.warn(\"sprites mandatory for key \", k);\n break;\n }\n }\n valuesSupported[prop] = value;\n }\n } else {\n logger.warn(\"property not supported : \", key);\n }\n }\n }\n return {\n type: type,\n values: valuesSupported\n };\n }\n\n /**\n * Render thumbnail (SVG)\n *\n * @param {Object} type - fill, line, circle, text, ...\n * @param {Object} values - {\"color\":..., \"width\":..., \"stroke\":...., \"opacity\":...}\n * @returns {Boolean} true/false\n *\n * @private\n * @example\n * (...)\n */\n }, {\n key: \"_renderThumbnail\",\n value: function _renderThumbnail(type, values) {\n // div de rendu de la legende\n var div = this.rendercontainer;\n if (!div) {\n return false;\n }\n\n // SVG\n var svg = null;\n // facteur grossissement (x10) pour le trait\n var factor = 3;\n\n // valeur par defaut\n if (!values.color) {\n values.color = \"#FFFFFF\";\n }\n // en fonction du type, on y ajoute le style\n switch (type) {\n case \"text\":\n var styleText = \"font-size: 5em;font-weight: bold;\";\n svg = \"url(\\\"data:image/svg+xml;utf8, T \\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%opacity%\", values.opacity || 1).replace(\"%style%\", styleText);\n break;\n case \"icon\":\n if (values.image) {\n // FIXME on reste dans le paradigme d'utilisation du SVG...,\n // mais probleme de ratio de l'image !?\n svg = \"\".replace(\"%x%\", this.options.sprites.json[values.image].x).replace(\"%y%\", this.options.sprites.json[values.image].y).replace(/%w%/g, this.options.sprites.json[values.image].width).replace(/%h%/g, this.options.sprites.json[values.image].height).replace(\"%W%\", this.options.sprites.size.w).replace(\"%H%\", this.options.sprites.size.h).replace(\"%URL%\", this.options.sprites.url);\n div.innerHTML = svg;\n } else {\n var styleTextIcon = \"fill: transparent;stroke-width: 10;\";\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%style%\", styleTextIcon);\n }\n break;\n case \"line\":\n var lstrockedasharray = Array.isArray(values[\"dasharray\"]) ? values[\"dasharray\"].join(\" \") : 0;\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n // svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%stroke-opacity%\", values.opacity || 1).replace(\"%stroke-dasharray%\", lstrockedasharray).replace(\"%stroke-width%\", (values.width || 0) * factor);\n break;\n case \"circle\":\n var cstrockcolor = values[\"stroke-color\"] || \"#FFFFFF\";\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%opacity%\", values.opacity || 1).replace(\"%stroke-color%\", cstrockcolor.indexOf(\"rgb\") === 0 ? cstrockcolor : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(cstrockcolor, 1)).replace(\"%stroke-opacity%\", values[\"stroke-opacity\"] || 1).replace(\"%stroke-width%\", (values[\"stroke-width\"] || 0) * factor);\n break;\n case \"background\":\n case \"fill\":\n if (values.pattern) {\n svg = \"\".replace(\"%x%\", this.options.sprites.json[values.pattern].x).replace(\"%y%\", this.options.sprites.json[values.pattern].y).replace(/%w%/g, this.options.sprites.json[values.pattern].width).replace(/%h%/g, this.options.sprites.json[values.pattern].height).replace(\"%W%\", this.options.sprites.size.w).replace(\"%H%\", this.options.sprites.size.h).replace(\"%URL%\", this.options.sprites.url);\n div.innerHTML = svg;\n } else {\n var fstrokecolor = values[\"outline-color\"] || \"#FFFFFF\";\n svg = \"url(\\\"data:image/svg+xml;utf8,\\\")\";\n div.style[\"background\"] = svg.replace(\"%color%\", values.color.indexOf(\"rgb\") === 0 ? values.color : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(values.color, 1)).replace(\"%opacity%\", values.opacity || 1).replace(\"%stroke-color%\", fstrokecolor.indexOf(\"rgb\") === 0 ? fstrokecolor : _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].hexToRgba(fstrokecolor, 1));\n }\n break;\n default:\n logger.warn(\"type not found, no thumbnail...\");\n return false;\n }\n return true;\n }\n\n /**\n * Get value\n *\n * @param {*} value - value of a property (ex. \"#2BB3E1\")\n * @returns {*} return a verified value (ex. color\": \"#2BB3E1\")\n *\n * @private\n * @example\n * // type simple for fill, line or circle type with string :\n * // \"paint\": {\n * // \"fill-color\": \"#2BB3E1\"\n * // }\n *\n * // type simple for fill, line or circle type with array :\n * // \"paint\": {\n * // \"line-dasharray\": [2,10]\n * // }\n *\n * // TODO type complexe : not yet implemented !\n * // \"paint\": {\n * // \"fill-color\": [\n * // \"match\",\n * // [\"get\",\"symbo\"],\n * // \"ZONE_BOISEE\",\"#A7DA81\",\n * // \"ZONE_MANGROVE\",\"#7E8AB5\",\n * // \"#A7DA81\"\n * // ]\n * // }\n *\n * // other type complexe :\n * // \"paint\": {\n * // \"fill-color\": {\n * // \"base\": 1,\n * // \"stops\": [\n * // [\n * // 15.5,\n * // \"#f2eae2\"\n * // ],\n * // [\n * // 16,\n * // \"#dfdbd7\"\n * // ]\n * // ]\n * // }\n * // }\n */\n }, {\n key: \"_getValue\",\n value: function _getValue(value) {\n var result = null;\n if (typeof value === \"string\") {\n result = value;\n } else if (typeof value === \"number\") {\n result = value;\n } else if (Array.isArray(value)) {\n // cas d'un tableau de valeurs numériques : [1,2,3]\n var isNumber = true;\n value.forEach(function (v) {\n if (typeof v !== \"number\") {\n isNumber = false;\n }\n });\n if (isNumber) {\n result = value;\n }\n } else if (_typeof(value) === \"object\") {\n result = null;\n if (\"stops\" in value) {\n // on realise un ordre inversé sur les zooms\n value.stops.sort(function (a, b) {\n var numA = a[0];\n var numB = b[0];\n if (numA > numB) {\n return -1;\n }\n if (numA < numB) {\n return 1;\n }\n return 0;\n });\n // et, on prend le plus petit zoom\n var lastStopsValue = value.stops.slice(-1);\n result = lastStopsValue[0][1];\n }\n } else {\n logger.warn(\"value not supported !\");\n }\n return result;\n }\n\n // ################################################################### //\n // ######################### DOM methods ############################# //\n // ################################################################### //\n /**\n * Create a Graphical Legend Icon\n *\n * @param {Object} params - param\n * @param {String} params.title - title\n * @param {String} params.type - fill, line, circle, text, icon, ...\n * @param {String} params.values - {\"color\": \"#2BB3E1\", \"width\": 10, \"opacity\": 0.5, \"stroke\": \"#2BB3E1\"}\n * @param {Boolean} params.edit - editable with a colorPicker for only line, fill and circle legend !\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n *
");\">\n *
\n * vide...\n *
\n */\n }, {\n key: \"_createElementIconLegend\",\n value: function _createElementIconLegend(params) {\n // contexte\n var self = this;\n var container = document.createElement(\"div\");\n container.className = this.name.containerlegendrender;\n var div = this.rendercontainer = document.createElement(\"div\");\n div.className = this.name.legendrender;\n if (params.edit) {\n div.className += \" \";\n div.className += this.name.legendeditable;\n if (div.addEventListener) {\n div.addEventListener(\"click\", function (e) {\n self.onEditionLegendMapBox(e);\n });\n } else if (div.attachEvent) {\n div.attachEvent(\"onclick\", function (e) {\n self.onEditionLegendMapBox(e);\n });\n }\n }\n\n // type de legende\n var type = params.type;\n\n // TODO className\n // div.className += \" legend-not-implemented\";\n // ajout du style sur la div de rendu\n if (this._renderThumbnail(type, params.values)) {\n // className possibles :\n // \" legend-text\"\n // \" legend-icon\"\n // \" legend-background\"\n // \" legend-line\"\n // \" legend-line-not-editable\"\n // \" legend-circle\"\n // \" legend-circle-not-editable\"\n // \" legend-fill\"\n // \" legend-fill-not-editable\"\n div.className += params.edit ? \" legend-\" + type : \" legend-\" + type + \"-not-editable\";\n } else {\n div.className += \" legend-unknow\";\n }\n container.appendChild(div);\n var span = document.createElement(\"span\");\n span.className = this.name.legendtitle;\n span.innerHTML = params.title || \"\";\n container.appendChild(span);\n return container;\n }\n\n /**\n * Create a Graphical Legend Edition\n *\n * @param {Object} params - param\n * @param {String} params.type - fill, line, (TODO : circle, icon or text)\n * @param {String} params.values - {\"fill-color\": \"#2BB3E1\"}\n * @param {Boolean} params.edit - editable with a colorPicker for only line and fill legend !\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n * \n * \n *
\n *
\n */\n }, {\n key: \"_createElementEditionLegend\",\n value: function _createElementEditionLegend(params) {\n // contexte\n var self = this;\n var container = document.createElement(\"div\");\n container.className = this.name.containerlegendtools;\n\n // uniquement les elements editables !\n if (!params.edit) {\n return container;\n }\n\n // on ne traite que l'edition du mode 'traits' ou 'surfaciques'\n // mode 'line'\n switch (params.type) {\n case \"line\":\n createLineColor.call(self);\n createLineWidth.call(self);\n createLineOpacity.call(self);\n break;\n case \"background\":\n case \"fill\":\n createFillColor.call(self);\n createFillOpacity.call(self);\n break;\n default:\n break;\n }\n\n // couleur du trait\n function createLineColor() {\n var linecolor = document.createElement(\"div\");\n linecolor.className = \"legend-styling-div\";\n var lLineColor = document.createElement(\"label\");\n lLineColor.className = \"legend-line\";\n lLineColor.htmlFor = this.id ? \"line-color-\" + this.id : \"line-color\";\n lLineColor.innerHTML = this.labels[\"line-color\"];\n var inputLineColor = document.createElement(\"input\");\n inputLineColor.className = \"legend-styling\";\n inputLineColor.id = this.id ? \"line-color-\" + this.id : \"line-color\";\n inputLineColor.title = \"Selectionner une couleur de trait\";\n inputLineColor.type = \"color\";\n inputLineColor.value = params.values.color;\n inputLineColor.setAttribute(\"data-id\", \"line-color\");\n if (inputLineColor.addEventListener) {\n inputLineColor.addEventListener(\"change\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputLineColor.attachEvent) {\n inputLineColor.attachEvent(\"onchange\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n linecolor.appendChild(lLineColor);\n linecolor.appendChild(inputLineColor);\n container.appendChild(linecolor);\n }\n\n // epaisseur du trait\n function createLineWidth() {\n var linewidth = document.createElement(\"div\");\n linewidth.className = \"legend-styling-div\";\n var lLineWidth = document.createElement(\"label\");\n lLineWidth.className = \"legend-line\";\n lLineWidth.htmlFor = this.id ? \"line-width-\" + this.id : \"line-width\";\n lLineWidth.innerHTML = this.labels[\"line-width\"];\n var inputLineWidth = document.createElement(\"input\");\n inputLineWidth.className = \"legend-styling\";\n inputLineWidth.id = this.id ? \"line-width-\" + this.id : \"line-width\";\n inputLineWidth.title = params.values.width;\n inputLineWidth.type = \"range\";\n inputLineWidth.min = \"0\";\n inputLineWidth.max = \"10\";\n inputLineWidth.step = \"1\";\n inputLineWidth.defaultValue = params.values.width;\n inputLineWidth.setAttribute(\"data-id\", \"line-width\");\n if (inputLineWidth.addEventListener) {\n inputLineWidth.addEventListener(\"change\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n width: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputLineWidth.attachEvent) {\n inputLineWidth.attachEvent(\"onchange\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n width: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n linewidth.appendChild(lLineWidth);\n linewidth.appendChild(inputLineWidth);\n container.appendChild(linewidth);\n }\n\n // opacité du trait\n function createLineOpacity() {\n var lineopacity = document.createElement(\"div\");\n lineopacity.className = \"legend-styling-div\";\n var lLineOpacity = document.createElement(\"label\");\n lLineOpacity.className = \"legend-line\";\n lLineOpacity.htmlFor = this.id ? \"line-opacity-\" + this.id : \"line-opacity\";\n lLineOpacity.innerHTML = this.labels[\"line-opacity\"];\n var inputLineOpacity = document.createElement(\"input\");\n inputLineOpacity.className = \"legend-styling\";\n inputLineOpacity.id = this.id ? \"line-opacity-\" + this.id : \"line-opacity\";\n inputLineOpacity.title = params.values.opacity;\n inputLineOpacity.type = \"range\";\n inputLineOpacity.min = \"0\";\n inputLineOpacity.max = \"1\";\n inputLineOpacity.step = \"0.1\";\n inputLineOpacity.defaultValue = params.values.opacity;\n inputLineOpacity.setAttribute(\"data-id\", \"line-opacity\");\n if (inputLineOpacity.addEventListener) {\n inputLineOpacity.addEventListener(\"change\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputLineOpacity.attachEvent) {\n inputLineOpacity.attachEvent(\"onchange\", function (e) {\n logger.trace(e);\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n lineopacity.appendChild(lLineOpacity);\n lineopacity.appendChild(inputLineOpacity);\n container.appendChild(lineopacity);\n }\n\n // couleur de remplissage\n function createFillColor() {\n var fillcolor = document.createElement(\"div\");\n fillcolor.className = \"legend-styling-div\";\n var lFillColor = document.createElement(\"label\");\n lFillColor.className = \"legend-fill\";\n lFillColor.htmlFor = this.id ? \"fill-color-\" + this.id : \"fill-color\";\n lFillColor.innerHTML = this.labels[\"fill-color\"];\n var inputFillColor = document.createElement(\"input\");\n inputFillColor.className = \"legend-styling\";\n inputFillColor.id = this.id ? \"fill-color-\" + this.id : \"fill-color\";\n inputFillColor.title = \"Selectionner une couleur de remplissage\";\n inputFillColor.type = \"color\";\n inputFillColor.value = params.values.color;\n inputFillColor.setAttribute(\"data-id\", \"fill-color\");\n if (inputFillColor.addEventListener) {\n inputFillColor.addEventListener(\"change\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputFillColor.attachEvent) {\n inputFillColor.attachEvent(\"onchange\", function (e) {\n self._renderThumbnail(params.type, Object.assign(params.values, {\n color: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n fillcolor.appendChild(lFillColor);\n fillcolor.appendChild(inputFillColor);\n container.appendChild(fillcolor);\n }\n\n // opacité du remplissage\n function createFillOpacity() {\n var fillopacity = document.createElement(\"div\");\n fillopacity.className = \"legend-styling-div\";\n var lFillOpacity = document.createElement(\"label\");\n lFillOpacity.className = \"legend-fill\";\n lFillOpacity.htmlFor = this.id ? \"fill-opacity-\" + this.id : \"fill-opacity\";\n lFillOpacity.innerHTML = this.labels[\"fill-opacity\"];\n var inputFillOpacity = document.createElement(\"input\");\n inputFillOpacity.className = \"legend-styling\";\n inputFillOpacity.id = this.id ? \"fill-opacity-\" + this.id : \"fill-opacity\";\n inputFillOpacity.title = params.values.opacity;\n inputFillOpacity.type = \"range\";\n inputFillOpacity.min = \"0\";\n inputFillOpacity.max = \"1\";\n inputFillOpacity.step = \"0.1\";\n inputFillOpacity.defaultValue = params.values.opacity;\n inputFillOpacity.setAttribute(\"data-id\", \"fill-opacity\");\n if (inputFillOpacity.addEventListener) {\n inputFillOpacity.addEventListener(\"change\", function (e) {\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n } else if (inputFillOpacity.attachEvent) {\n inputFillOpacity.attachEvent(\"onchange\", function (e) {\n e.target.title = e.target.value;\n self._renderThumbnail(params.type, Object.assign(params.values, {\n opacity: e.target.value\n }));\n self.onChangeValueLegendMapBox(e);\n });\n }\n fillopacity.appendChild(lFillOpacity);\n fillopacity.appendChild(inputFillOpacity);\n container.appendChild(fillopacity);\n }\n return container;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n *\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Is editable\n *\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"isEditable\",\n value: function isEditable() {\n return this.editable;\n }\n\n /**\n * Get container Legend Render (DOM)\n *\n * @returns {DOMElement} DOM element\n * @see Layer.prototype.slotLegend()\n * @example\n *
\n */\n }, {\n key: \"getRenderContainer\",\n value: function getRenderContainer() {\n return this.rendercontainer;\n }\n\n /**\n * Get container Legend Tools (DOM)\n *\n * @returns {DOMElement} DOM element\n * @see Layer.prototype.slotLegend()\n * @example\n *
...
\n */\n }, {\n key: \"getToolsContainer\",\n value: function getToolsContainer() {\n return this.toolscontainer;\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Legend#editor:legend:onclickedition\n */\n }, {\n key: \"onEditionLegendMapBox\",\n value: function onEditionLegendMapBox(e) {\n logger.trace(\"onEditionLegendMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].legend.onclickedition, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Legend#editor:legend:onchangevalue\n */\n }, {\n key: \"onChangeValueLegendMapBox\",\n value: function onChangeValueLegendMapBox(e) {\n logger.trace(\"onChangeValueLegendMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].legend.onchangevalue, e);\n }\n }]);\n}();\n;\n;\n\n// ################################################################### //\n// ########################## CONSTANTES ############################# //\n// ################################################################### //\n\n/**\n * List of supported properties\n */\nLegend.PROPERTIES = {\n line: [\"line-color\", \"line-dasharray\", \"line-opacity\", \"line-width\"],\n fill: [\"fill-color\", \"fill-opacity\", \"fill-outline-color\", \"fill-pattern\"],\n background: [\"background-color\", \"background-opacity\", \"background-pattern\"],\n circle: [\"circle-color\", \"circle-opacity\", \"circle-stroke-color\", \"circle-stroke-opacity\", \"circle-stroke-width\"],\n icon: [\"icon-color\", \"icon-image\", \"icon-opacity\", \"__icon-size\"],\n text: [\"__text-anchor\", \"text-color\", \"text-field\", \"__text-font\", \"__text-opacity\", \"__text-size\"]\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Legend);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9MZWdlbmQuanM/OWJiMSJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJMZWdlbmQiLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsInNwcml0ZXMiLCJvYmoiLCJUeXBlRXJyb3IiLCJfaW5pdGlhbGl6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJpZCIsInRpdGxlIiwiZWRpdGFibGUiLCJwYWludCIsIl9lZGl0YWJsZSIsImxlZ2VuZFJlbmRlciIsInR5cGUiLCJ2YWx1ZXMiLCJ3aWR0aCIsInN0cm9rZSIsImNvbG9yIiwib3BhY2l0eSIsImNvbnRhaW5lciIsInJlbmRlcmNvbnRhaW5lciIsInRvb2xzY29udGFpbmVyIiwibmFtZSIsImNvbnRhaW5lcmxlZ2VuZHJlbmRlciIsImxlZ2VuZHJlbmRlciIsImxlZ2VuZGVkaXRhYmxlIiwibGVnZW5kdGl0bGUiLCJjb250YWluZXJsZWdlbmR0b29scyIsImxhYmVscyIsIl9vYmoiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJzdHlsZSIsIk9iamVjdCIsImFzc2lnbiIsImxheW91dCIsImtleXMiLCJsZW5ndGgiLCJpbmZvIiwicGFyYW1zIiwiYkZvdW5kIiwiaSIsInRlc3QiLCJzcGxpdCIsIl9nZXRQcm9wZXJ0aWVzIiwiZWRpdCIsImFwcGVuZENoaWxkIiwiX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kIiwid2FybiIsIl9jcmVhdGVFbGVtZW50RWRpdGlvbkxlZ2VuZCIsImlzVGV4dFZhbHVlIiwiaXNJY29uVmFsdWUiLCJ2YWx1ZXNTdXBwb3J0ZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ2YWwiLCJQUk9QRVJUSUVTIiwiaW5jbHVkZXMiLCJwcm9wIiwicmVwbGFjZSIsInNsaWNlIiwiX2dldFZhbHVlIiwianNvbiIsImsiLCJfcmVuZGVyVGh1bWJuYWlsIiwic3ZnIiwiZmFjdG9yIiwic3R5bGVUZXh0IiwiaW5kZXhPZiIsIkNvbG9yIiwiaGV4VG9SZ2JhIiwiaW1hZ2UiLCJ4IiwieSIsImhlaWdodCIsInNpemUiLCJ3IiwiaCIsInVybCIsImlubmVySFRNTCIsInN0eWxlVGV4dEljb24iLCJsc3Ryb2NrZWRhc2hhcnJheSIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJjc3Ryb2NrY29sb3IiLCJwYXR0ZXJuIiwiZnN0cm9rZWNvbG9yIiwicmVzdWx0IiwiaXNOdW1iZXIiLCJmb3JFYWNoIiwidiIsIl90eXBlb2YiLCJzdG9wcyIsInNvcnQiLCJhIiwiYiIsIm51bUEiLCJudW1CIiwibGFzdFN0b3BzVmFsdWUiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJvbkVkaXRpb25MZWdlbmRNYXBCb3giLCJhdHRhY2hFdmVudCIsInNwYW4iLCJjcmVhdGVMaW5lQ29sb3IiLCJjcmVhdGVMaW5lV2lkdGgiLCJjcmVhdGVMaW5lT3BhY2l0eSIsImNyZWF0ZUZpbGxDb2xvciIsImNyZWF0ZUZpbGxPcGFjaXR5IiwibGluZWNvbG9yIiwibExpbmVDb2xvciIsImh0bWxGb3IiLCJpbnB1dExpbmVDb2xvciIsInNldEF0dHJpYnV0ZSIsIm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3giLCJsaW5ld2lkdGgiLCJsTGluZVdpZHRoIiwiaW5wdXRMaW5lV2lkdGgiLCJtaW4iLCJtYXgiLCJzdGVwIiwiZGVmYXVsdFZhbHVlIiwibGluZW9wYWNpdHkiLCJsTGluZU9wYWNpdHkiLCJpbnB1dExpbmVPcGFjaXR5IiwiZmlsbGNvbG9yIiwibEZpbGxDb2xvciIsImlucHV0RmlsbENvbG9yIiwiZmlsbG9wYWNpdHkiLCJsRmlsbE9wYWNpdHkiLCJpbnB1dEZpbGxPcGFjaXR5IiwiYWRkIiwiZ2V0RWxlbWVudEJ5SWQiLCJub2RlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkaXNwbGF5IiwiaXNFZGl0YWJsZSIsImdldFJlbmRlckNvbnRhaW5lciIsImdldFRvb2xzQ29udGFpbmVyIiwiZ2V0Q29udGFpbmVyIiwiZWRpdG9ySUQiLCJkYXRhIiwiRXZlbnRCdXMiLCJkaXNwYXRjaCIsIkV2ZW50RWRpdG9yIiwibGVnZW5kIiwib25jbGlja2VkaXRpb24iLCJvbmNoYW5nZXZhbHVlIiwibGluZSIsImZpbGwiLCJiYWNrZ3JvdW5kIiwiY2lyY2xlIiwiaWNvbiIsInRleHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ3lCO0FBQ047QUFFckQsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsZUFBZSxDQUFDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdDQSxJQThDTUMsTUFBTTtFQUVSLFNBQUFBLE9BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLE1BQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHNCQUFzQixFQUFFRixPQUFPLENBQUM7O0lBRTdDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtNQUNBRyxNQUFNLEVBQUcsSUFBSTtNQUNiQyxRQUFRLEVBQUcsQ0FBQztNQUNaQyxPQUFPLEVBQUcsSUFBSTtNQUNkQyxHQUFHLEVBQUc7SUFDVixDQUFDO0lBRUQsSUFBSSxFQUFFLElBQUksWUFBWVAsTUFBTSxDQUFDLEVBQUU7TUFDM0IsTUFBTSxJQUFJUSxT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QkFBb0IsRUFDcEIsY0FBYyxDQUNqQjtFQUNEQyxVQUFVLEVBQUcsQ0FDVCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixDQUN2QjtFQUNEQyxNQUFNLEVBQUcsQ0FDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIscUJBQXFCLENBQ3hCO0VBQ0RDLElBQUksRUFBRyxDQUNILFlBQVksRUFDWixZQUFZLEVBQ1osY0FBYyxFQUNkLGFBQWEsQ0FDaEI7RUFDREMsSUFBSSxFQUFHLENBQ0gsZUFBZSxFQUNmLFlBQVksRUFDWixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixhQUFhO0FBRXJCLENBQUM7QUFFY3JLLHFFQUFNIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRWRpdG9yL0xlZ2VuZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEJ1cyBmcm9tIFwiZXZlbnRidXNqc1wiO1xuaW1wb3J0IEV2ZW50RWRpdG9yIGZyb20gXCIuL0V2ZW50XCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Db2xvclV0aWxzXCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLWxlZ2VuZFwiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogTWFwQm94IExlZ2VuZCBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLkxlZ2VuZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnRhcmdldCA9IG51bGxdIC0gLi4uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucG9zaXRpb24gPSAwXSAtICAuLi5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pZCA9IG51bGxdIC0gKGludGVybmFsKSAuLi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zcHJpdGVzID0gbnVsbF0gLSAuLi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zcHJpdGVzLnVybF0gLSAuLi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zcHJpdGVzLnNpemVdIC0ge2g6LCB3On0gLi4uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc3ByaXRlcy5qc29uXSAtIC4uLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMub2JqIC0gLi4uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub2JqLnRpdGxlXSAtIC4uLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vYmouZWRpdGFibGUgPSB0cnVlXSAtIC4uLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMub2JqLnBhaW50IC0gLi4uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5vYmoubGF5b3V0IC0gLi4uXG4gKiBAZXhhbXBsZVxuICogICB2YXIgbGVnZW5kID0gbmV3IExlZ2VuZCAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHBvc2l0aW9uIDogMSwgLy8gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gKHVuaXF1ZSAhKVxuICogICAgICBzcHJpdGVzIDoge1xuICogICAgICAgICAgdXJsIDogXCJodHRwOi8vbG9jYWxob3N0L3Nwcml0ZXMucG5nXCIsXG4gKiAgICAgICAgICBzaXplIDogeyB3IDogNDUwLCBoIDogNTUwIH0sXG4gKiAgICAgICAgICBqc29uIDoge1xuICogICAgICAgICAgICAgIGljb24tMSA6IHt4Oix5OixoZWlnaHQ6LHdpZHRoOixwaXhlbFJhdGlvOn0sXG4gKiAgICAgICAgICAgICAgaWNvbi0yIDoge3g6LHk6LGhlaWdodDosd2lkdGg6LHBpeGVsUmF0aW86fVxuICogICAgICAgICAgfVxuICogICAgICB9LFxuICogICAgICBvYmogOiB7XG4gKiAgICAgICAgICB0aXRsZSA6IFwiXCIsXG4gKiAgICAgICAgICBlZGl0YWJsZSA6IHRydWUsIC8vIHRhZyBub24gc3RhbmRhcmQgaXNzdWUgZHUgc3R5bGUganNvbiBkw6lkacOpIMOgIGwnZWRpdGlvblxuICogICAgICAgICAgcGFpbnQgOiB7XCJmaWxsLWNvbG9yXCI6IFwiIzJCQjNFMVwifSxcbiAqICAgICAgICAgIGxheW91dCA6IHt2aXNpYmlsaXR5Olwibm9uZVwifVxuICogICAgICB9XG4gKiAgIH0pO1xuICogIGxlZ2VuZC5hZGQoKTtcbiAqICBsZWdlbmQuZGlzcGxheSh0cnVlKTtcbiAqICBsZWdlbmQuaXNFZGl0YWJsZSgpO1xuICogIGxlZ2VuZC5nZXRSZW5kZXJDb250YWluZXIoKTtcbiAqICBsZWdlbmQuZ2V0VG9vbHNDb250YWluZXIoKTtcbiAqICBsZWdlbmQuZ2V0Q29udGFpbmVyKCk7XG4gKi9cbmNsYXNzIExlZ2VuZCB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIExlZ2VuZFwiLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgLy8gZGVmYXVsdC4uLlxuICAgICAgICAgICAgdGFyZ2V0IDogbnVsbCxcbiAgICAgICAgICAgIHBvc2l0aW9uIDogMCxcbiAgICAgICAgICAgIHNwcml0ZXMgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBMZWdlbmQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBpbml0IG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGNmLiBhZGQoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGVybWV0IGQnYXZvaXIgdW4gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gZGFucyBsYSBsaXN0ZSBkZXMgbGF5ZXJzXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub2JqKSB7XG4gICAgICAgICAgICAvLyBjaG9peCBkJ2F2b2lyIHVuIG9iamV0IHZpZGUgcG91ciB1bmUgZWRpdGlvbi4uLlxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9iaiA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwidmlkZS4uLlwiLFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYWludCA6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJmaWxsLWNvbG9yXCIgOiBcIiNGRkZGRkZcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsYSBsZWdlbmRlIGVzdCBlbGxlIGVkaXRhYmxlID9cbiAgICAgICAgLy8gbGUgdGFnICdlZGl0YWJsZScgZXN0IMOgIHBsYWNlciBkYW5zIGxlIGZpY2hpZXIgZGUgc3R5bGUgKGRhbnMgbGUgbGF5ZXIpLi4uXG4gICAgICAgIHZhciBfZWRpdGFibGUgPSB0aGlzLm9wdGlvbnMub2JqLmVkaXRhYmxlO1xuICAgICAgICB0aGlzLmVkaXRhYmxlID0gKHR5cGVvZiBfZWRpdGFibGUgIT09IFwidW5kZWZpbmVkXCIpID8gX2VkaXRhYmxlIDogZmFsc2U7XG5cbiAgICAgICAgLy8gbGlzdGUgZGVzIGNhcmFjdMOpcmlzdGlxdWVzIGRlIGxhIGxlZ2VuZGUgcGFyIGRlZmF1dFxuICAgICAgICB0aGlzLmxlZ2VuZFJlbmRlciA9IHtcbiAgICAgICAgICAgIHR5cGUgOiBcImZpbGxcIixcbiAgICAgICAgICAgIHZhbHVlcyA6IHtcbiAgICAgICAgICAgICAgICB3aWR0aCA6IDEsXG4gICAgICAgICAgICAgICAgc3Ryb2tlIDogXCIjRkZGRkZGXCIsXG4gICAgICAgICAgICAgICAgY29sb3IgOiBcIiMwMDAwMDBcIixcbiAgICAgICAgICAgICAgICBvcGFjaXR5IDogMVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERPTSA6IHBvaW50ZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHRoaXMudG9vbHNjb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIERPTSA6IGNsYXNzTmFtZSBvciBpZFxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kVGFyZ2V0XCIsXG4gICAgICAgICAgICBjb250YWluZXIgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJsZWdlbmRyZW5kZXIgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBsZWdlbmRyZW5kZXIgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyXCIsXG4gICAgICAgICAgICBsZWdlbmRlZGl0YWJsZSA6IFwiR1BFZGl0b3JNYXBCb3hMZWdlbmRFZGl0YWJsZVwiLFxuICAgICAgICAgICAgbGVnZW5kdGl0bGUgOiBcIkdQRWRpdG9yTWFwQm94TGVnZW5kVGl0bGVcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcmxlZ2VuZHRvb2xzIDogXCJHUEVkaXRvck1hcEJveExlZ2VuZFRvb2xzQ29udGFpbmVyXCJcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBET00gOiBMYWJlbCBtZW51IEVkaXRpb25cbiAgICAgICAgdGhpcy5sYWJlbHMgPSB7XG4gICAgICAgICAgICBcImxpbmUtY29sb3JcIiA6IFwiQ291bGV1ciBkdSB0cmFpdFwiLFxuICAgICAgICAgICAgXCJsaW5lLXdpZHRoXCIgOiBcIkVwYWlzc2V1ciBkdSB0cmFpdFwiLFxuICAgICAgICAgICAgXCJsaW5lLW9wYWNpdHlcIiA6IFwiT3BhY2l0w6kgZHUgdHJhaXRcIixcbiAgICAgICAgICAgIFwiZmlsbC1jb2xvclwiIDogXCJDb3VsZXVyIGRlIHJlbXBsaXNzYWdlXCIsXG4gICAgICAgICAgICBcImZpbGwtb3BhY2l0eVwiIDogXCJPcGFjaXTDqSBkdSByZW1wbGlzc2FnZVwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JhcGhpY2FsIHJlbmRlcmluZyBvZiB0aGUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRDb250YWluZXJcIj5cbiAgICAgKiAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyQ29udGFpbmVyXCI+XG4gICAgICogICAgICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRSZW5kZXIgR1BFZGl0b3JNYXBCb3hMZWdlbmRFZGl0YWJsZSBsZWdlbmQtY2lyY2xlXCIgc3R5bGU9XCIuLi5cIj48L2Rpdj5cbiAgICAgKiAgICAgIDxzcGFuIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRUaXRsZVwiPnRlc3QgY2lyY2xlIGVkaXRhYmxlLi4uPC9zcGFuPlxuICAgICAqICA8L2Rpdj5cbiAgICAgKiAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kVG9vbHNDb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIHZhciBfb2JqID0gdGhpcy5vcHRpb25zLm9iajtcblxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXI7XG5cbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyBvbiByZWNoZXJjaGUgbGVzIGluZm9ybWF0aW9ucyBkYW5zIGxlIHRhZyAncGFpbnQnIGVuIHByaW9yaXTDqSwgbWFpcyBwb3VyXG4gICAgICAgIC8vIGxlcyBpY29uZXMgb3UgdGV4dGVzLCBsZXMgaW5mb3JtYXRpb25zIHBldXZlbnQgc2UgdHJvdXZlciBhdXNzaSBkYW5zIGxlIHRhZyAnbGF5b3V0Jy4uLlxuICAgICAgICAvLyBvbiBmdXNpb25ubmUgcGFpbnQgZXQgbGF5b3V0IHBhciBmYWNpbGl0w6lcbiAgICAgICAgdmFyIHN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgX29iai5wYWludCwgX29iai5sYXlvdXQpO1xuXG4gICAgICAgIC8vIGxpc3RlIGRlcyBwcm9wZXJ0aWVzIG1hcGJveFxuICAgICAgICAvLyBleC4gZmlsbC1jb2xvclxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInRhZyAncGFpbnQnIG9yICdsYXlvdXQnIGlzIGVtcHR5ICFcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRVxuICAgICAgICAvLyAtIGdlc3Rpb24gZGUgdHlwZSBwbHVzIGNvbXBsZXhlIDogdGV4dGUgYXZlYy9zYW5zIHN5bWJvbGUgb3Ugc3ltYm9sZSAhXG4gICAgICAgIC8vIC0gcG91ciBsZXMgdGV4dGVzIG91IGljb25lcywgbGVzIGluZm8gcGV1dmVudCDDqnRyZSBhdXNzaSBkYW5zIGxlIHRhZyAnbGF5b3V0JyAhXG4gICAgICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICAgICAgdmFyIGJGb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgLy8gcmVjaGVyY2hlIGR1IHR5cGVcbiAgICAgICAgICAgIC8vIGV4LiBmaWxsXG4gICAgICAgICAgICBpZiAoL2ZpbGwtLy50ZXN0KGtleSkgfHxcbiAgICAgICAgICAgICAgICAvbGluZS0vLnRlc3Qoa2V5KSB8fFxuICAgICAgICAgICAgICAgIC9jaXJjbGUtLy50ZXN0KGtleSkgfHxcbiAgICAgICAgICAgICAgICAvYmFja2dyb3VuZC0vLnRlc3Qoa2V5KSB8fFxuICAgICAgICAgICAgICAgIC90ZXh0LS8udGVzdChrZXkpIHx8XG4gICAgICAgICAgICAgICAgL2ljb24tLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAvLyBzdHlsZSBnZXLDqSAmIHRyb3V2w6lcbiAgICAgICAgICAgICAgICBiRm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gX29iai50aXRsZSB8fCBcIlwiO1xuXG4gICAgICAgICAgICAgICAgLy8gSU5GT1xuICAgICAgICAgICAgICAgIC8vIGxlIHR5cGUgdGV4dGUgb3UgaWNvbmUgZXN0IGRpZmZpY2lsZSDDoCB0cm91dmVyIGNhciBsZXMgMiB0eXBlcyBjb2hhYml0ZW50LFxuICAgICAgICAgICAgICAgIC8vIG9uIGxlIGfDqHJlIGVuIHN5bWJvbGUuLi5cbiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGtleS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwidGV4dFwiIHx8IHR5cGUgPT09IFwiaWNvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBcInN5bWJvbFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubGVnZW5kUmVuZGVyID0gdGhpcy5fZ2V0UHJvcGVydGllcyh0eXBlLCBzdHlsZSk7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICBlZGl0IDogdGhpcy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMubGVnZW5kUmVuZGVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA6IHRoaXMubGVnZW5kUmVuZGVyLnZhbHVlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kKHBhcmFtcykpO1xuXG4gICAgICAgICAgICAgICAgLy8gb24gc3RvcHBlIGxhIHJlY2hlcmNoZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGVnZW5kZSBhdmVjIHVuIHN0eWxlIGluZGV0ZXJtaW7DqSBvdSBub24gZ8OpcsOpICE/XG4gICAgICAgIGlmICghYkZvdW5kKSB7XG4gICAgICAgICAgICAvLyBvbiBwcmVuZCBsYSBsZWdlbmRlIHBhciBkZWZhdXRcbiAgICAgICAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBlZGl0IDogdGhpcy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiXCIsXG4gICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMubGVnZW5kUmVuZGVyLnR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWVzIDogdGhpcy5sZWdlbmRSZW5kZXIudmFsdWVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kKHBhcmFtcykpO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJsZWdlbmQgdHlwZSB1bmtub3duLCBkZWZhdWx0IGxlZ2VuZCB1c2VkLi4uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWpvdXQgbW9kZSBlZGl0aW9uIGdyYXBoaXF1ZSBkZSBsYSBsZWdlbmRlXG4gICAgICAgIHRoaXMudG9vbHNjb250YWluZXIgPSB0aGlzLl9jcmVhdGVFbGVtZW50RWRpdGlvbkxlZ2VuZChwYXJhbXMpO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGhpcy50b29sc2NvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcml2YXRlIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgKiBHZXQgcHJvcGVydGllcyBzdXBwb3J0ZWRcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZSAtIGZpbGwsIGxpbmUsIGNpcmNsZSwgdGV4dCwgaWNvbi4uLlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIHJhdyB2YWx1ZXMgZnJvbSB0aGUgSlNPTiBmaWxlXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIHsgdHlwZSA6IChmaWxsIHwgbGluZSB8IGNpcmNsZSB8IHN5bWJvbCksIHZhbHVlcyA6IHZhbHVlc1N1cHBvcnRlZCB9XG4gICAgKlxuICAgICogQHByaXZhdGVcbiAgICAqIEBleGFtcGxlXG4gICAgKlxuICAgICogLy8gVE9ET1xuICAgICogLy8gc3ltYm9sIHdpdGggdGV4dCAoMSkgLyBzeW1ib2wgd2l0aG91dCB0ZXh0ICgyKSAvIHRleHQgKDMpXG4gICAgKiAvLyBcImxheW91dFwiOntcbiAgICAqIC8vICAgICAgXCJpY29uLWltYWdlXCI6XCJ7bWFraX0tMTFcIiwgICAgICAgICAgPCEtLS0gSVQnUyBBIFNZTUJPTCAoMSkgKDIpLS0+XG4gICAgKiAvLyAgICAgIFwidGV4dC1mb250XCI6W1xuICAgICogLy8gICAgICAgICAgIFwiT3BlbiBTYW5zIFNlbWlib2xkXCIsXG4gICAgKiAvLyAgICAgICAgICAgXCJBcmlhbCBVbmljb2RlIE1TIEJvbGRcIlxuICAgICogLy8gICAgICAgXSxcbiAgICAqIC8vICAgICAgIFwidGV4dC1maWVsZFwiOlwie25hbWVfZW59XCIsICAgICAgICAgPCEtLS0gSVQnUyBBIFRFWFQgKDEpICgzKS0tPlxuICAgICogLy8gICAgICAgXCJ0ZXh0LW1heC13aWR0aFwiOjksXG4gICAgKiAvLyAgICAgICBcInRleHQtcGFkZGluZ1wiOjIsXG4gICAgKiAvLyAgICAgICBcInRleHQtb2Zmc2V0XCI6W1xuICAgICogLy8gICAgICAgICAgICAwLFxuICAgICogLy8gICAgICAgICAgICAwLjZcbiAgICAqIC8vICAgICAgIF0sXG4gICAgKiAvLyAgICAgICBcInRleHQtYW5jaG9yXCI6XCJ0b3BcIixcbiAgICAqIC8vICAgICAgIFwidGV4dC1zaXplXCI6MTJcbiAgICAqIC8vIH0sXG4gICAgKiAvLyBcInBhaW50XCI6e1xuICAgICogLy8gICAgIFwidGV4dC1jb2xvclwiOlwiIzY2NlwiLFxuICAgICogLy8gICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6XCIjZmZmZmZmXCIsXG4gICAgKiAvLyAgICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjoxLFxuICAgICogLy8gICAgIFwidGV4dC1oYWxvLWJsdXJcIjowLjVcbiAgICAqIC8vIH0sXG4gICAgKlxuICAgICovXG4gICAgX2dldFByb3BlcnRpZXMgKHR5cGUsIHZhbHVlcykge1xuICAgICAgICAvLyBjYXMgcGFydGljdWxpZXIgZHUgc3ltYm9sZSBjb21wbGV4ZVxuICAgICAgICAvLyBpbCBleGlzdGUgcGx1c2lldXJzIHR5cGVzIHBvdXIgdW4gc3ltYm9sZSA6XG4gICAgICAgIC8vIC0gdGV4dFxuICAgICAgICAvLyAtIGljb25cbiAgICAgICAgLy8gLSBpY29uIHdpdGggdGV4dFxuICAgICAgICBpZiAodHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgdmFyIGlzVGV4dFZhbHVlID0gdmFsdWVzW1widGV4dC1maWVsZFwiXTtcbiAgICAgICAgICAgIHZhciBpc0ljb25WYWx1ZSA9IHZhbHVlc1tcImljb24taW1hZ2VcIl07XG4gICAgICAgICAgICB0eXBlID0gKGlzVGV4dFZhbHVlICYmIGlzSWNvblZhbHVlKSA/IFwiaWNvblwiIDogKGlzVGV4dFZhbHVlKSA/IFwidGV4dFwiIDogKGlzSWNvblZhbHVlKSA/IFwiaWNvblwiIDogXCJ1bmtub3dcIjtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInVua25vd1wiKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJ0eXBlIHVua25vdyAhP1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsdWVzU3VwcG9ydGVkID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlcywga2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHZhbHVlc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChMZWdlbmQuUFJPUEVSVElFU1t0eXBlXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0ga2V5LnJlcGxhY2UodHlwZSwgXCJcIikuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzIHBhcnRpY3VsaWVyIGRlcyBzcHJpdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJwYXR0ZXJuXCIgfHwgcHJvcCA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3ByaXRlcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSB0eXBlICsgXCI6XCIgKyBwcm9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInNwcml0ZXMgbWFuZGF0b3J5IGZvciBrZXkgXCIsIGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNTdXBwb3J0ZWRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwicHJvcGVydHkgbm90IHN1cHBvcnRlZCA6IFwiLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlIDogdHlwZSxcbiAgICAgICAgICAgIHZhbHVlcyA6IHZhbHVlc1N1cHBvcnRlZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmVuZGVyIHRodW1ibmFpbCAoU1ZHKVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlIC0gZmlsbCwgbGluZSwgY2lyY2xlLCB0ZXh0LCAuLi5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB7XCJjb2xvclwiOi4uLiwgXCJ3aWR0aFwiOi4uLiwgXCJzdHJva2VcIjouLi4uLCBcIm9wYWNpdHlcIjouLi59XG4gICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZVxuICAgICpcbiAgICAqIEBwcml2YXRlXG4gICAgKiBAZXhhbXBsZVxuICAgICogKC4uLilcbiAgICAqL1xuICAgIF9yZW5kZXJUaHVtYm5haWwgKHR5cGUsIHZhbHVlcykge1xuICAgICAgICAvLyBkaXYgZGUgcmVuZHUgZGUgbGEgbGVnZW5kZVxuICAgICAgICB2YXIgZGl2ID0gdGhpcy5yZW5kZXJjb250YWluZXI7XG5cbiAgICAgICAgaWYgKCFkaXYpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNWR1xuICAgICAgICB2YXIgc3ZnID0gbnVsbDtcbiAgICAgICAgLy8gZmFjdGV1ciBncm9zc2lzc2VtZW50ICh4MTApIHBvdXIgbGUgdHJhaXRcbiAgICAgICAgdmFyIGZhY3RvciA9IDM7XG5cbiAgICAgICAgLy8gdmFsZXVyIHBhciBkZWZhdXRcbiAgICAgICAgaWYgKCF2YWx1ZXMuY29sb3IpIHtcbiAgICAgICAgICAgIHZhbHVlcy5jb2xvciA9IFwiI0ZGRkZGRlwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuIGZvbmN0aW9uIGR1IHR5cGUsIG9uIHkgYWpvdXRlIGxlIHN0eWxlXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGVUZXh0ID0gXCJmb250LXNpemU6IDVlbTtmb250LXdlaWdodDogYm9sZDtcIjtcbiAgICAgICAgICAgICAgICBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjx0ZXh0IHg9JzUwJyB5PSc1MCcgZmlsbD0nJWNvbG9yJScgZmlsbC1vcGFjaXR5PSclb3BhY2l0eSUnICB0ZXh0LWFuY2hvcj0nbWlkZGxlJyBkb21pbmFudC1iYXNlbGluZT0nY2VudHJhbCcgc3R5bGU9JyVzdHlsZSUnPiBUIDwvdGV4dD48L3N2Zz5cXFwiKVwiO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZVtcImJhY2tncm91bmRcIl0gPSBzdmdcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlY29sb3IlXCIsICh2YWx1ZXMuY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyB2YWx1ZXMuY29sb3IgOiBDb2xvci5oZXhUb1JnYmEodmFsdWVzLmNvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlb3BhY2l0eSVcIiwgdmFsdWVzLm9wYWNpdHkgfHwgMSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3R5bGUlXCIsIHN0eWxlVGV4dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaWNvblwiOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb24gcmVzdGUgZGFucyBsZSBwYXJhZGlnbWUgZCd1dGlsaXNhdGlvbiBkdSBTVkcuLi4sXG4gICAgICAgICAgICAgICAgICAgIC8vIG1haXMgcHJvYmxlbWUgZGUgcmF0aW8gZGUgbCdpbWFnZSAhP1xuICAgICAgICAgICAgICAgICAgICBzdmcgPSBcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHdpZHRoPScyN3B4JyBoZWlnaHQ9JzI3cHgnIHg9JzAnIHk9JzAnIHZpZXdCb3g9JyV4JSAleSUgJXclICVoJSc+PGltYWdlIHdpZHRoPSclVyVweCcgaGVpZ2h0PSclSCVweCcgaHJlZj0nJVVSTCUnLz48L3N2Zz5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIleCVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZXMuaW1hZ2VdLngpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiV5JVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5pbWFnZV0ueSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8ldyUvZywgdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZXMuaW1hZ2VdLndpZHRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyVoJS9nLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5pbWFnZV0uaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVyVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS53KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlSCVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVVJMJVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy51cmwpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gc3ZnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZVRleHRJY29uID0gXCJmaWxsOiB0cmFuc3BhcmVudDtzdHJva2Utd2lkdGg6IDEwO1wiO1xuICAgICAgICAgICAgICAgICAgICBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxwYXRoIGQ9J00gNTAsMjAgODAsODIuNSAyMCw4Mi41IHonIHN0cm9rZT0nJWNvbG9yJScgc3R5bGU9JyVzdHlsZSUnLz48L3N2Zz5cXFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGVbXCJiYWNrZ3JvdW5kXCJdID0gc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVjb2xvciVcIiwgKHZhbHVlcy5jb2xvci5pbmRleE9mKFwicmdiXCIpID09PSAwKSA/IHZhbHVlcy5jb2xvciA6IENvbG9yLmhleFRvUmdiYSh2YWx1ZXMuY29sb3IsIDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3R5bGUlXCIsIHN0eWxlVGV4dEljb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgICAgICAgICAgICAgdmFyIGxzdHJvY2tlZGFzaGFycmF5ID0gKEFycmF5LmlzQXJyYXkodmFsdWVzW1wiZGFzaGFycmF5XCJdKSkgPyB2YWx1ZXNbXCJkYXNoYXJyYXlcIl0uam9pbihcIiBcIikgOiAwO1xuICAgICAgICAgICAgICAgIHN2ZyA9IFwidXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgdmVyc2lvbj0nMS4xJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSdub25lJyB2aWV3Qm94PScwIDAgMTAwIDEwMCc+PGxpbmUgeDE9JzAnIHkxPScxMDAnIHgyPScxMDAnIHkyPScwJyBzdHJva2U9JyVjb2xvciUnIHN0cm9rZS13aWR0aD0nJXN0cm9rZS13aWR0aCUnIHN0cm9rZS1vcGFjaXR5PSclc3Ryb2tlLW9wYWNpdHklJyBzdHJva2UtZGFzaGFycmF5PSclc3Ryb2tlLWRhc2hhcnJheSUnIC8+PC9zdmc+XFxcIilcIjtcbiAgICAgICAgICAgICAgICAvLyBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxwYXRoIGQ9J00wIDk5IEw5OSAwIEwxMDAgMSBMMSAxMDAnIHN0cm9rZT0nJWNvbG9yJScgc3Ryb2tlLXdpZHRoPScld2lkdGglJyBzdHJva2Utb3BhY2l0eT0nJW9wYWNpdHklJyBzdHJva2UtZGFzaGFycmF5PSclZGFzaGFycmF5JScgLz48L3N2Zz5cXFwiKVwiO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZVtcImJhY2tncm91bmRcIl0gPSBzdmdcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlY29sb3IlXCIsICh2YWx1ZXMuY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyB2YWx1ZXMuY29sb3IgOiBDb2xvci5oZXhUb1JnYmEodmFsdWVzLmNvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3Ryb2tlLW9wYWNpdHklXCIsIHZhbHVlcy5vcGFjaXR5IHx8IDEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJXN0cm9rZS1kYXNoYXJyYXklXCIsIGxzdHJvY2tlZGFzaGFycmF5KVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVzdHJva2Utd2lkdGglXCIsICh2YWx1ZXMud2lkdGggfHwgMCkgKiBmYWN0b3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNpcmNsZVwiOlxuICAgICAgICAgICAgICAgIHZhciBjc3Ryb2NrY29sb3IgPSB2YWx1ZXNbXCJzdHJva2UtY29sb3JcIl0gfHwgXCIjRkZGRkZGXCI7XG4gICAgICAgICAgICAgICAgc3ZnID0gXCJ1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHZpZXdCb3g9JzAgMCAxMDAgMTAwJz48Y2lyY2xlIGN4PSc1MCcgY3k9JzUwJyByPSc0MCcgc3Ryb2tlPSclc3Ryb2tlLWNvbG9yJScgc3Ryb2tlLXdpZHRoPSclc3Ryb2tlLXdpZHRoJScgc3Ryb2tlLW9wYWNpdHk9JyVzdHJvY2stb3BhY2l0eSUnIGZpbGw9JyVjb2xvciUnIGZpbGwtb3BhY2l0eT0nJW9wYWNpdHklJyAvPjwvc3ZnPlxcXCIpXCI7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlW1wiYmFja2dyb3VuZFwiXSA9IHN2Z1xuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVjb2xvciVcIiwgKHZhbHVlcy5jb2xvci5pbmRleE9mKFwicmdiXCIpID09PSAwKSA/IHZhbHVlcy5jb2xvciA6IENvbG9yLmhleFRvUmdiYSh2YWx1ZXMuY29sb3IsIDEpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVvcGFjaXR5JVwiLCB2YWx1ZXMub3BhY2l0eSB8fCAxKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVzdHJva2UtY29sb3IlXCIsIChjc3Ryb2NrY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyBjc3Ryb2NrY29sb3IgOiBDb2xvci5oZXhUb1JnYmEoY3N0cm9ja2NvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlc3Ryb2tlLW9wYWNpdHklXCIsIHZhbHVlc1tcInN0cm9rZS1vcGFjaXR5XCJdIHx8IDEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJXN0cm9rZS13aWR0aCVcIiwgKHZhbHVlc1tcInN0cm9rZS13aWR0aFwiXSB8fCAwKSAqIGZhY3Rvcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmFja2dyb3VuZFwiOlxuICAgICAgICAgICAgY2FzZSBcImZpbGxcIjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgc3ZnID0gXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgdmVyc2lvbj0nMS4xJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSdub25lJyB3aWR0aD0nMjdweCcgaGVpZ2h0PScyN3B4JyB4PScwJyB5PScwJyB2aWV3Qm94PScleCUgJXklICV3JSAlaCUnPjxpbWFnZSB3aWR0aD0nJVclcHgnIGhlaWdodD0nJUglcHgnIGhyZWY9JyVVUkwlJy8+PC9zdmc+XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJXglXCIsIHRoaXMub3B0aW9ucy5zcHJpdGVzLmpzb25bdmFsdWVzLnBhdHRlcm5dLngpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiV5JVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5wYXR0ZXJuXS55KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyV3JS9nLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy5qc29uW3ZhbHVlcy5wYXR0ZXJuXS53aWR0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8laCUvZywgdGhpcy5vcHRpb25zLnNwcml0ZXMuanNvblt2YWx1ZXMucGF0dGVybl0uaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVyVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS53KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlSCVcIiwgdGhpcy5vcHRpb25zLnNwcml0ZXMuc2l6ZS5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlVVJMJVwiLCB0aGlzLm9wdGlvbnMuc3ByaXRlcy51cmwpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gc3ZnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmc3Ryb2tlY29sb3IgPSB2YWx1ZXNbXCJvdXRsaW5lLWNvbG9yXCJdIHx8IFwiI0ZGRkZGRlwiO1xuICAgICAgICAgICAgICAgICAgICBzdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgcHJlc2VydmVBc3BlY3RSYXRpbz0nbm9uZScgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxyZWN0IHg9JzAnIHk9JzAnIHdpZHRoPScxMDAnIGhlaWdodD0nMTAwJyByeD0nNScgcnk9JzUnIHN0cm9rZT0nJXN0cm9rZS1jb2xvciUnIHN0cm9rZS13aWR0aD0nMycgZmlsbD0nJWNvbG9yJScgZmlsbC1vcGFjaXR5PSclb3BhY2l0eSUnIC8+PC9zdmc+XFxcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlW1wiYmFja2dyb3VuZFwiXSA9IHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIlY29sb3IlXCIsICh2YWx1ZXMuY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyB2YWx1ZXMuY29sb3IgOiBDb2xvci5oZXhUb1JnYmEodmFsdWVzLmNvbG9yLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJW9wYWNpdHklXCIsIHZhbHVlcy5vcGFjaXR5IHx8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIiVzdHJva2UtY29sb3IlXCIsIChmc3Ryb2tlY29sb3IuaW5kZXhPZihcInJnYlwiKSA9PT0gMCkgPyBmc3Ryb2tlY29sb3IgOiBDb2xvci5oZXhUb1JnYmEoZnN0cm9rZWNvbG9yLCAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInR5cGUgbm90IGZvdW5kLCBubyB0aHVtYm5haWwuLi5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gdmFsdWUgb2YgYSBwcm9wZXJ0eSAoZXguIFwiIzJCQjNFMVwiKVxuICAgICAqIEByZXR1cm5zIHsqfSByZXR1cm4gYSB2ZXJpZmllZCB2YWx1ZSAoZXguIGNvbG9yXCI6IFwiIzJCQjNFMVwiKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHR5cGUgc2ltcGxlIGZvciBmaWxsLCBsaW5lIG9yIGNpcmNsZSB0eXBlIHdpdGggc3RyaW5nIDpcbiAgICAgKiAvLyBcInBhaW50XCI6IHtcbiAgICAgKiAvLyAgICAgXCJmaWxsLWNvbG9yXCI6IFwiIzJCQjNFMVwiXG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gdHlwZSBzaW1wbGUgZm9yIGZpbGwsIGxpbmUgb3IgY2lyY2xlIHR5cGUgd2l0aCBhcnJheSA6XG4gICAgICogLy8gXCJwYWludFwiOiB7XG4gICAgICogLy8gICAgIFwibGluZS1kYXNoYXJyYXlcIjogWzIsMTBdXG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gVE9ETyB0eXBlIGNvbXBsZXhlIDogbm90IHlldCBpbXBsZW1lbnRlZCAhXG4gICAgICogLy8gXCJwYWludFwiOiB7XG4gICAgICogLy8gICAgIFwiZmlsbC1jb2xvclwiOiBbXG4gICAgICogLy8gICAgICAgICAgXCJtYXRjaFwiLFxuICAgICAqIC8vICAgICAgICAgIFtcImdldFwiLFwic3ltYm9cIl0sXG4gICAgICogLy8gICAgICAgICAgXCJaT05FX0JPSVNFRVwiLFwiI0E3REE4MVwiLFxuICAgICAqIC8vICAgICAgICAgIFwiWk9ORV9NQU5HUk9WRVwiLFwiIzdFOEFCNVwiLFxuICAgICAqIC8vICAgICAgICAgIFwiI0E3REE4MVwiXG4gICAgICogLy8gICAgICBdXG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gb3RoZXIgdHlwZSBjb21wbGV4ZSA6XG4gICAgICogLy8gXCJwYWludFwiOiB7XG4gICAgICogLy8gICAgIFwiZmlsbC1jb2xvclwiOiB7XG4gICAgICogLy8gICAgICAgIFwiYmFzZVwiOiAxLFxuICAgICAqIC8vICAgICAgICBcInN0b3BzXCI6IFtcbiAgICAgKiAvLyAgICAgICAgW1xuICAgICAqIC8vICAgICAgICAgIDE1LjUsXG4gICAgICogLy8gICAgICAgICBcIiNmMmVhZTJcIlxuICAgICAqIC8vICAgICAgICBdLFxuICAgICAqIC8vICAgICAgICBbXG4gICAgICogLy8gICAgICAgICAgMTYsXG4gICAgICogLy8gICAgICAgICAgXCIjZGZkYmQ3XCJcbiAgICAgKiAvLyAgICAgICAgXVxuICAgICAqIC8vICAgICAgICBdXG4gICAgICogLy8gICAgIH1cbiAgICAgKiAvLyB9XG4gICAgICovXG4gICAgX2dldFZhbHVlICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gY2FzIGQndW4gdGFibGVhdSBkZSB2YWxldXJzIG51bcOpcmlxdWVzIDogWzEsMiwzXVxuICAgICAgICAgICAgdmFyIGlzTnVtYmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoXCJzdG9wc1wiIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gb24gcmVhbGlzZSB1biBvcmRyZSBpbnZlcnPDqSBzdXIgbGVzIHpvb21zXG4gICAgICAgICAgICAgICAgdmFsdWUuc3RvcHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtQSA9IGFbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1CID0gYlswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bUEgPiBudW1CKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bUEgPCBudW1CKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBldCwgb24gcHJlbmQgbGUgcGx1cyBwZXRpdCB6b29tXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RTdG9wc1ZhbHVlID0gdmFsdWUuc3RvcHMuc2xpY2UoLTEpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxhc3RTdG9wc1ZhbHVlWzBdWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJ2YWx1ZSBub3Qgc3VwcG9ydGVkICFcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBET00gbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAqIENyZWF0ZSBhIEdyYXBoaWNhbCBMZWdlbmQgSWNvblxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50aXRsZSAtIHRpdGxlXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR5cGUgLSBmaWxsLCBsaW5lLCBjaXJjbGUsIHRleHQsIGljb24sIC4uLlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy52YWx1ZXMgLSB7XCJjb2xvclwiOiBcIiMyQkIzRTFcIiwgXCJ3aWR0aFwiOiAxMCwgXCJvcGFjaXR5XCI6IDAuNSwgXCJzdHJva2VcIjogXCIjMkJCM0UxXCJ9XG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lZGl0IC0gZWRpdGFibGUgd2l0aCBhIGNvbG9yUGlja2VyIGZvciBvbmx5IGxpbmUsIGZpbGwgYW5kIGNpcmNsZSBsZWdlbmQgIVxuICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgKlxuICAgICogQHByaXZhdGVcbiAgICAqIEBleGFtcGxlXG4gICAgKiAgIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveExlZ2VuZFJlbmRlckNvbnRhaW5lclwiPlxuICAgICogICAgICAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kUmVuZGVyIEdQRWRpdG9yTWFwQm94TGVnZW5kRWRpdGFibGUgbGVnZW5kLWZpbGxcIlxuICAgICogICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdXJsKCZxdW90O2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHZpZXdCb3g9JzAgMCAxMDAgMTAwJz48cmVjdCB4PScwJyB5PScwJyB3aWR0aD0nMTAwJyBoZWlnaHQ9JzEwMCcgcng9JzUnIHJ5PSc1JyBmaWxsPSdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJyBmaWxsLW9wYWNpdHk9JzEnIC8+PC9zdmc+JnF1b3Q7KTtcIj5cbiAgICAqICAgICAgIDwvZGl2PlxuICAgICogICAgICAgPHNwYW4gY2xhc3M9XCJHUEVkaXRvck1hcEJveExlZ2VuZFRpdGxlXCI+dmlkZS4uLjwvc3Bhbj5cbiAgICAqIDwvZGl2PlxuICAgICovXG4gICAgX2NyZWF0ZUVsZW1lbnRJY29uTGVnZW5kIChwYXJhbXMpIHtcbiAgICAgICAgLy8gY29udGV4dGVcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcmxlZ2VuZHJlbmRlcjtcblxuICAgICAgICB2YXIgZGl2ID0gdGhpcy5yZW5kZXJjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmxlZ2VuZHJlbmRlcjtcbiAgICAgICAgaWYgKHBhcmFtcy5lZGl0KSB7XG4gICAgICAgICAgICBkaXYuY2xhc3NOYW1lICs9IFwiIFwiO1xuICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSArPSB0aGlzLm5hbWUubGVnZW5kZWRpdGFibGU7XG4gICAgICAgICAgICBpZiAoZGl2LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25FZGl0aW9uTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXYuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBkaXYuYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25FZGl0aW9uTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHlwZSBkZSBsZWdlbmRlXG4gICAgICAgIHZhciB0eXBlID0gcGFyYW1zLnR5cGU7XG5cbiAgICAgICAgLy8gVE9ETyBjbGFzc05hbWVcbiAgICAgICAgLy8gZGl2LmNsYXNzTmFtZSArPSBcIiBsZWdlbmQtbm90LWltcGxlbWVudGVkXCI7XG4gICAgICAgIC8vIGFqb3V0IGR1IHN0eWxlIHN1ciBsYSBkaXYgZGUgcmVuZHVcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlclRodW1ibmFpbCh0eXBlLCBwYXJhbXMudmFsdWVzKSkge1xuICAgICAgICAgICAgLy8gY2xhc3NOYW1lIHBvc3NpYmxlcyA6XG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtdGV4dFwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtaWNvblwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtYmFja2dyb3VuZFwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtbGluZVwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtbGluZS1ub3QtZWRpdGFibGVcIlxuICAgICAgICAgICAgLy8gXCIgbGVnZW5kLWNpcmNsZVwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtY2lyY2xlLW5vdC1lZGl0YWJsZVwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtZmlsbFwiXG4gICAgICAgICAgICAvLyBcIiBsZWdlbmQtZmlsbC1ub3QtZWRpdGFibGVcIlxuICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSArPSAocGFyYW1zLmVkaXQpID8gXCIgbGVnZW5kLVwiICsgdHlwZSA6IFwiIGxlZ2VuZC1cIiArIHR5cGUgKyBcIi1ub3QtZWRpdGFibGVcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpdi5jbGFzc05hbWUgKz0gXCIgbGVnZW5kLXVua25vd1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSB0aGlzLm5hbWUubGVnZW5kdGl0bGU7XG4gICAgICAgIHNwYW4uaW5uZXJIVE1MID0gcGFyYW1zLnRpdGxlIHx8IFwiXCI7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcblxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ3JlYXRlIGEgR3JhcGhpY2FsIExlZ2VuZCBFZGl0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR5cGUgLSBmaWxsLCBsaW5lLCAoVE9ETyA6IGNpcmNsZSwgaWNvbiBvciB0ZXh0KVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy52YWx1ZXMgLSB7XCJmaWxsLWNvbG9yXCI6IFwiIzJCQjNFMVwifVxuICAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZWRpdCAtIGVkaXRhYmxlIHdpdGggYSBjb2xvclBpY2tlciBmb3Igb25seSBsaW5lIGFuZCBmaWxsIGxlZ2VuZCAhXG4gICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAqXG4gICAgKiBAcHJpdmF0ZVxuICAgICogQGV4YW1wbGVcbiAgICAqICAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kVG9vbHNDb250YWluZXJcIj5cbiAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtc3R5bGluZy1kaXZcIj5cbiAgICAqICAgICAgICAgICA8bGFiZWwgZm9yPVwic3Ryb2tlLWNvbG9yXCI+Q291bGV1ciBkdSB0cmFpdDwvbGFiZWw+XG4gICAgKiAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibGVnZW5kLXN0eWxpbmdcIiBpZD1cInN0cm9rZS1jb2xvclwiIHRpdGxlPVwiXCIgdHlwZT1cImNvbG9yXCI+XG4gICAgKiAgICAgICA8L2Rpdj5cbiAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtc3R5bGluZy1kaXZcIj5cbiAgICAqICAgICAgICAgICA8bGFiZWwgZm9yPVwic3Ryb2tlLXdpZHRoXCI+RXBhaXNzZXVyIGR1IHRyYWl0PC9sYWJlbD5cbiAgICAqICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJsZWdlbmQtc3R5bGluZ1wiIGlkPVwic3Ryb2tlLXdpZHRoXCIgdGl0bGU9XCJcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiIHZhbHVlPVwiMVwiPlxuICAgICogICAgICAgPC9kaXY+XG4gICAgKiAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXN0eWxpbmctZGl2XCI+XG4gICAgKiAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0cm9rZS1vcGFjaXR5XCI+T3BhY2l0w6kgZHUgdHJhaXQ8L2xhYmVsPlxuICAgICogICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImxlZ2VuZC1zdHlsaW5nXCIgaWQ9XCJzdHJva2Utb3BhY2l0eVwiIHRpdGxlPVwiXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjFcIiBzdGVwPVwiMC4xXCIgdmFsdWU9XCIxXCI+XG4gICAgKiAgICAgICA8L2Rpdj5cbiAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtc3R5bGluZy1kaXZcIj5cbiAgICAqICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsbC1jb2xvclwiPkNvdWxldXIgZGUgcmVtcGxpc3NhZ2U8L2xhYmVsPlxuICAgICogICAgICAgIDxpbnB1dCBjbGFzcz1cImxlZ2VuZC1zdHlsaW5nXCIgaWQ9XCJmaWxsLWNvbG9yXCIgdGl0bGU9XCJcIiB0eXBlPVwiY29sb3JcIj5cbiAgICAqICAgICAgIDwvZGl2PlxuICAgICogICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1zdHlsaW5nLWRpdlwiPlxuICAgICogICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaWxsLW9wYWNpdHlcIj5PcGFjaXTDqSBkdSByZW1wbGlzc2FnZTwvbGFiZWw+XG4gICAgKiAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibGVnZW5kLXN0eWxpbmdcIiBpZD1cImZpbGwtb3BhY2l0eVwiIHRpdGxlPVwiXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjFcIiBzdGVwPVwiMC4xXCIgdmFsdWU9XCIxXCI+XG4gICAgKiAgICAgICA8L2Rpdj5cbiAgICAqICAgPC9kaXY+XG4gICAgKi9cbiAgICBfY3JlYXRlRWxlbWVudEVkaXRpb25MZWdlbmQgKHBhcmFtcykge1xuICAgICAgICAvLyBjb250ZXh0ZVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVybGVnZW5kdG9vbHM7XG5cbiAgICAgICAgLy8gdW5pcXVlbWVudCBsZXMgZWxlbWVudHMgZWRpdGFibGVzICFcbiAgICAgICAgaWYgKCFwYXJhbXMuZWRpdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIG5lIHRyYWl0ZSBxdWUgbCdlZGl0aW9uIGR1IG1vZGUgJ3RyYWl0cycgb3UgJ3N1cmZhY2lxdWVzJ1xuICAgICAgICAvLyBtb2RlICdsaW5lJ1xuICAgICAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGluZVwiOlxuICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVDb2xvci5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVXaWR0aC5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVPcGFjaXR5LmNhbGwoc2VsZik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmFja2dyb3VuZFwiOlxuICAgICAgICAgICAgY2FzZSBcImZpbGxcIjpcbiAgICAgICAgICAgICAgICBjcmVhdGVGaWxsQ29sb3IuY2FsbChzZWxmKTtcbiAgICAgICAgICAgICAgICBjcmVhdGVGaWxsT3BhY2l0eS5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvdWxldXIgZHUgdHJhaXRcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlTGluZUNvbG9yICgpIHtcbiAgICAgICAgICAgIHZhciBsaW5lY29sb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgbGluZWNvbG9yLmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbExpbmVDb2xvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxMaW5lQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtbGluZVwiO1xuICAgICAgICAgICAgbExpbmVDb2xvci5odG1sRm9yID0gdGhpcy5pZCA/IFwibGluZS1jb2xvci1cIiArIHRoaXMuaWQgOiBcImxpbmUtY29sb3JcIjtcbiAgICAgICAgICAgIGxMaW5lQ29sb3IuaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJsaW5lLWNvbG9yXCJdO1xuICAgICAgICAgICAgdmFyIGlucHV0TGluZUNvbG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IuaWQgPSB0aGlzLmlkID8gXCJsaW5lLWNvbG9yLVwiICsgdGhpcy5pZCA6IFwibGluZS1jb2xvclwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IudGl0bGUgPSBcIlNlbGVjdGlvbm5lciB1bmUgY291bGV1ciBkZSB0cmFpdFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lQ29sb3IudHlwZSA9IFwiY29sb3JcIjtcbiAgICAgICAgICAgIGlucHV0TGluZUNvbG9yLnZhbHVlID0gcGFyYW1zLnZhbHVlcy5jb2xvcjtcbiAgICAgICAgICAgIGlucHV0TGluZUNvbG9yLnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJsaW5lLWNvbG9yXCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0TGluZUNvbG9yLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dExpbmVDb2xvci5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dExpbmVDb2xvci5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgIGlucHV0TGluZUNvbG9yLmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaW5lY29sb3IuYXBwZW5kQ2hpbGQobExpbmVDb2xvcik7XG4gICAgICAgICAgICBsaW5lY29sb3IuYXBwZW5kQ2hpbGQoaW5wdXRMaW5lQ29sb3IpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVjb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlcGFpc3NldXIgZHUgdHJhaXRcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlTGluZVdpZHRoICgpIHtcbiAgICAgICAgICAgIHZhciBsaW5ld2lkdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgbGluZXdpZHRoLmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbExpbmVXaWR0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxMaW5lV2lkdGguY2xhc3NOYW1lID0gXCJsZWdlbmQtbGluZVwiO1xuICAgICAgICAgICAgbExpbmVXaWR0aC5odG1sRm9yID0gdGhpcy5pZCA/IFwibGluZS13aWR0aC1cIiArIHRoaXMuaWQgOiBcImxpbmUtd2lkdGhcIjtcbiAgICAgICAgICAgIGxMaW5lV2lkdGguaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJsaW5lLXdpZHRoXCJdO1xuICAgICAgICAgICAgdmFyIGlucHV0TGluZVdpZHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguaWQgPSB0aGlzLmlkID8gXCJsaW5lLXdpZHRoLVwiICsgdGhpcy5pZCA6IFwibGluZS13aWR0aFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGgudGl0bGUgPSBwYXJhbXMudmFsdWVzLndpZHRoO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGgudHlwZSA9IFwicmFuZ2VcIjtcbiAgICAgICAgICAgIGlucHV0TGluZVdpZHRoLm1pbiA9IFwiMFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGgubWF4ID0gXCIxMFwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguc3RlcCA9IFwiMVwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguZGVmYXVsdFZhbHVlID0gcGFyYW1zLnZhbHVlcy53aWR0aDtcbiAgICAgICAgICAgIGlucHV0TGluZVdpZHRoLnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJsaW5lLXdpZHRoXCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0TGluZVdpZHRoLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dExpbmVXaWR0aC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShlKTtcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudGl0bGUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0TGluZVdpZHRoLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaW5wdXRMaW5lV2lkdGguYXR0YWNoRXZlbnQoXCJvbmNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZSk7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnRpdGxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZXdpZHRoLmFwcGVuZENoaWxkKGxMaW5lV2lkdGgpO1xuICAgICAgICAgICAgbGluZXdpZHRoLmFwcGVuZENoaWxkKGlucHV0TGluZVdpZHRoKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5ld2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3BhY2l0w6kgZHUgdHJhaXRcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlTGluZU9wYWNpdHkgKCkge1xuICAgICAgICAgICAgdmFyIGxpbmVvcGFjaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGxpbmVvcGFjaXR5LmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbExpbmVPcGFjaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAgICAgbExpbmVPcGFjaXR5LmNsYXNzTmFtZSA9IFwibGVnZW5kLWxpbmVcIjtcbiAgICAgICAgICAgIGxMaW5lT3BhY2l0eS5odG1sRm9yID0gdGhpcy5pZCA/IFwibGluZS1vcGFjaXR5LVwiICsgdGhpcy5pZCA6IFwibGluZS1vcGFjaXR5XCI7XG4gICAgICAgICAgICBsTGluZU9wYWNpdHkuaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJsaW5lLW9wYWNpdHlcIl07XG4gICAgICAgICAgICB2YXIgaW5wdXRMaW5lT3BhY2l0eSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS5pZCA9IHRoaXMuaWQgPyBcImxpbmUtb3BhY2l0eS1cIiArIHRoaXMuaWQgOiBcImxpbmUtb3BhY2l0eVwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS50aXRsZSA9IHBhcmFtcy52YWx1ZXMub3BhY2l0eTtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkudHlwZSA9IFwicmFuZ2VcIjtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkubWluID0gXCIwXCI7XG4gICAgICAgICAgICBpbnB1dExpbmVPcGFjaXR5Lm1heCA9IFwiMVwiO1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS5zdGVwID0gXCIwLjFcIjtcbiAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkuZGVmYXVsdFZhbHVlID0gcGFyYW1zLnZhbHVlcy5vcGFjaXR5O1xuICAgICAgICAgICAgaW5wdXRMaW5lT3BhY2l0eS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIsIFwibGluZS1vcGFjaXR5XCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0TGluZU9wYWNpdHkuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlucHV0TGluZU9wYWNpdHkuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZSk7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnRpdGxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5IDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0TGluZU9wYWNpdHkuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dExpbmVPcGFjaXR5LmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGUpO1xuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC50aXRsZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXJUaHVtYm5haWwocGFyYW1zLnR5cGUsIE9iamVjdC5hc3NpZ24ocGFyYW1zLnZhbHVlcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZW9wYWNpdHkuYXBwZW5kQ2hpbGQobExpbmVPcGFjaXR5KTtcbiAgICAgICAgICAgIGxpbmVvcGFjaXR5LmFwcGVuZENoaWxkKGlucHV0TGluZU9wYWNpdHkpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVvcGFjaXR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvdWxldXIgZGUgcmVtcGxpc3NhZ2VcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRmlsbENvbG9yICgpIHtcbiAgICAgICAgICAgIHZhciBmaWxsY29sb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZmlsbGNvbG9yLmNsYXNzTmFtZSA9IFwibGVnZW5kLXN0eWxpbmctZGl2XCI7XG4gICAgICAgICAgICB2YXIgbEZpbGxDb2xvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGxGaWxsQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtZmlsbFwiO1xuICAgICAgICAgICAgbEZpbGxDb2xvci5odG1sRm9yID0gdGhpcy5pZCA/IFwiZmlsbC1jb2xvci1cIiArIHRoaXMuaWQgOiBcImZpbGwtY29sb3JcIjtcbiAgICAgICAgICAgIGxGaWxsQ29sb3IuaW5uZXJIVE1MID0gdGhpcy5sYWJlbHNbXCJmaWxsLWNvbG9yXCJdO1xuICAgICAgICAgICAgdmFyIGlucHV0RmlsbENvbG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZ1wiO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IuaWQgPSB0aGlzLmlkID8gXCJmaWxsLWNvbG9yLVwiICsgdGhpcy5pZCA6IFwiZmlsbC1jb2xvclwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IudGl0bGUgPSBcIlNlbGVjdGlvbm5lciB1bmUgY291bGV1ciBkZSByZW1wbGlzc2FnZVwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsQ29sb3IudHlwZSA9IFwiY29sb3JcIjtcbiAgICAgICAgICAgIGlucHV0RmlsbENvbG9yLnZhbHVlID0gcGFyYW1zLnZhbHVlcy5jb2xvcjtcbiAgICAgICAgICAgIGlucHV0RmlsbENvbG9yLnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJmaWxsLWNvbG9yXCIpO1xuICAgICAgICAgICAgaWYgKGlucHV0RmlsbENvbG9yLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEZpbGxDb2xvci5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVZhbHVlTGVnZW5kTWFwQm94KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dEZpbGxDb2xvci5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgIGlucHV0RmlsbENvbG9yLmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxsY29sb3IuYXBwZW5kQ2hpbGQobEZpbGxDb2xvcik7XG4gICAgICAgICAgICBmaWxsY29sb3IuYXBwZW5kQ2hpbGQoaW5wdXRGaWxsQ29sb3IpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZpbGxjb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvcGFjaXTDqSBkdSByZW1wbGlzc2FnZVxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVGaWxsT3BhY2l0eSAoKSB7XG4gICAgICAgICAgICB2YXIgZmlsbG9wYWNpdHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZmlsbG9wYWNpdHkuY2xhc3NOYW1lID0gXCJsZWdlbmQtc3R5bGluZy1kaXZcIjtcbiAgICAgICAgICAgIHZhciBsRmlsbE9wYWNpdHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgICBsRmlsbE9wYWNpdHkuY2xhc3NOYW1lID0gXCJsZWdlbmQtZmlsbFwiO1xuICAgICAgICAgICAgbEZpbGxPcGFjaXR5Lmh0bWxGb3IgPSB0aGlzLmlkID8gXCJmaWxsLW9wYWNpdHktXCIgKyB0aGlzLmlkIDogXCJmaWxsLW9wYWNpdHlcIjtcbiAgICAgICAgICAgIGxGaWxsT3BhY2l0eS5pbm5lckhUTUwgPSB0aGlzLmxhYmVsc1tcImZpbGwtb3BhY2l0eVwiXTtcbiAgICAgICAgICAgIHZhciBpbnB1dEZpbGxPcGFjaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5jbGFzc05hbWUgPSBcImxlZ2VuZC1zdHlsaW5nXCI7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LmlkID0gdGhpcy5pZCA/IFwiZmlsbC1vcGFjaXR5LVwiICsgdGhpcy5pZCA6IFwiZmlsbC1vcGFjaXR5XCI7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LnRpdGxlID0gcGFyYW1zLnZhbHVlcy5vcGFjaXR5O1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS50eXBlID0gXCJyYW5nZVwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5taW4gPSBcIjBcIjtcbiAgICAgICAgICAgIGlucHV0RmlsbE9wYWNpdHkubWF4ID0gXCIxXCI7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LnN0ZXAgPSBcIjAuMVwiO1xuICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5kZWZhdWx0VmFsdWUgPSBwYXJhbXMudmFsdWVzLm9wYWNpdHk7XG4gICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LnNldEF0dHJpYnV0ZShcImRhdGEtaWRcIiwgXCJmaWxsLW9wYWNpdHlcIik7XG4gICAgICAgICAgICBpZiAoaW5wdXRGaWxsT3BhY2l0eS5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRGaWxsT3BhY2l0eS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnRpdGxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlclRodW1ibmFpbChwYXJhbXMudHlwZSwgT2JqZWN0LmFzc2lnbihwYXJhbXMudmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5IDogZS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RmlsbE9wYWNpdHkuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEZpbGxPcGFjaXR5LmF0dGFjaEV2ZW50KFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudGl0bGUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyVGh1bWJuYWlsKHBhcmFtcy50eXBlLCBPYmplY3QuYXNzaWduKHBhcmFtcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgOiBlLnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2VWYWx1ZUxlZ2VuZE1hcEJveChlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGxvcGFjaXR5LmFwcGVuZENoaWxkKGxGaWxsT3BhY2l0eSk7XG4gICAgICAgICAgICBmaWxsb3BhY2l0eS5hcHBlbmRDaGlsZChpbnB1dEZpbGxPcGFjaXR5KTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxsb3BhY2l0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHVibGljIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIEFkZCBlbGVtZW50IGludG8gdGFyZ2V0IERPTVxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBMZWdlbmQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGQgKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIG9yIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJkaXNwbGF5KClcIiwgZGlzcGxheSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiZmxleFwiIDogXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcImZsZXhcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgZWRpdGFibGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICBpc0VkaXRhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciBMZWdlbmQgUmVuZGVyIChET00pXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKiBAc2VlIExheWVyLnByb3RvdHlwZS5zbG90TGVnZW5kKClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hMZWdlbmRSZW5kZXIgbGVnZW5kLShsaW5lfGZpbGx8YmFja2dyb3VuZHx0ZXh0fGljb258Y2lyY2xlfHVua25vdylcIiBzdHlsZT1cIi4uLlwiPjwvZGl2PlxuICAgICAqL1xuICAgIGdldFJlbmRlckNvbnRhaW5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIExlZ2VuZCBUb29scyAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICogQHNlZSBMYXllci5wcm90b3R5cGUuc2xvdExlZ2VuZCgpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgPGRpdiBjbGFzcz1cIkdQRWRpdG9yTWFwQm94TGVnZW5kVG9vbHNDb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKi9cbiAgICBnZXRUb29sc0NvbnRhaW5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvb2xzY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjb250YWluZXIgKERPTSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtET01FbGVtZW50fSBET00gZWxlbWVudFxuICAgICAqL1xuICAgIGdldENvbnRhaW5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIHRvIGRvbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBMZWdlbmQjZWRpdG9yOmxlZ2VuZDpvbmNsaWNrZWRpdGlvblxuICAgICAqL1xuICAgIG9uRWRpdGlvbkxlZ2VuZE1hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvbkVkaXRpb25MZWdlbmRNYXBCb3hcIiwgZSk7XG4gICAgICAgIGUuZWRpdG9ySUQgPSB0aGlzLmlkO1xuICAgICAgICBlLmRhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIEV2ZW50QnVzLmRpc3BhdGNoKEV2ZW50RWRpdG9yLmxlZ2VuZC5vbmNsaWNrZWRpdGlvbiwgZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgTGVnZW5kI2VkaXRvcjpsZWdlbmQ6b25jaGFuZ2V2YWx1ZVxuICAgICAqL1xuICAgIG9uQ2hhbmdlVmFsdWVMZWdlbmRNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DaGFuZ2VWYWx1ZUxlZ2VuZE1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3IubGVnZW5kLm9uY2hhbmdldmFsdWUsIGUpO1xuICAgIH1cblxufTtcblxuO1xuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDT05TVEFOVEVTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbi8qKlxuICogTGlzdCBvZiBzdXBwb3J0ZWQgcHJvcGVydGllc1xuICovXG5MZWdlbmQuUFJPUEVSVElFUyA9IHtcbiAgICBsaW5lIDogW1xuICAgICAgICBcImxpbmUtY29sb3JcIixcbiAgICAgICAgXCJsaW5lLWRhc2hhcnJheVwiLFxuICAgICAgICBcImxpbmUtb3BhY2l0eVwiLFxuICAgICAgICBcImxpbmUtd2lkdGhcIlxuICAgIF0sXG4gICAgZmlsbCA6IFtcbiAgICAgICAgXCJmaWxsLWNvbG9yXCIsXG4gICAgICAgIFwiZmlsbC1vcGFjaXR5XCIsXG4gICAgICAgIFwiZmlsbC1vdXRsaW5lLWNvbG9yXCIsXG4gICAgICAgIFwiZmlsbC1wYXR0ZXJuXCJcbiAgICBdLFxuICAgIGJhY2tncm91bmQgOiBbXG4gICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiLFxuICAgICAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiLFxuICAgICAgICBcImJhY2tncm91bmQtcGF0dGVyblwiXG4gICAgXSxcbiAgICBjaXJjbGUgOiBbXG4gICAgICAgIFwiY2lyY2xlLWNvbG9yXCIsXG4gICAgICAgIFwiY2lyY2xlLW9wYWNpdHlcIixcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCIsXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCIsXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiXG4gICAgXSxcbiAgICBpY29uIDogW1xuICAgICAgICBcImljb24tY29sb3JcIixcbiAgICAgICAgXCJpY29uLWltYWdlXCIsXG4gICAgICAgIFwiaWNvbi1vcGFjaXR5XCIsXG4gICAgICAgIFwiX19pY29uLXNpemVcIlxuICAgIF0sXG4gICAgdGV4dCA6IFtcbiAgICAgICAgXCJfX3RleHQtYW5jaG9yXCIsXG4gICAgICAgIFwidGV4dC1jb2xvclwiLFxuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAgXCJfX3RleHQtZm9udFwiLFxuICAgICAgICBcIl9fdGV4dC1vcGFjaXR5XCIsXG4gICAgICAgIFwiX190ZXh0LXNpemVcIlxuICAgIF1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IExlZ2VuZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Legend.js\n"); /***/ }), @@ -2417,7 +2417,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var even /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"editor-search\");\n\n/**\n * @classdesc\n *\n * TODO MapBox search management\n *\n * @constructor\n * @alias ol.style.editor.Search\n * @param {Object} options - options for function call.\n * @todo\n * @example\n * var Search = new Search ({\n * target : ...,\n * tools : {\n * // ...\n * }\n * title : \"Filtres de recherche :\",\n * obj : {}\n * });\n * Search.add();\n * Search.display(true);\n * Search.getContainer();\n */\nvar Search = /*#__PURE__*/function () {\n function Search(options) {\n _classCallCheck(this, Search);\n logger.trace(\"[constructor] Search\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n tools: null,\n title: null,\n obj: null\n };\n if (!(this instanceof Search)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Search, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n var _toolsDefault = {};\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition futur...\n this.options.obj = {};\n }\n if (!this.options.title) {\n this.options.title = \"Recherche de couches :\";\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxSearchTarget\",\n container: \"GPEditorMapBoxSearchContainer\"\n // TODO ...\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n * // ...\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n // var self = this;\n var _search = JSON.parse(JSON.stringify(this.options.obj)); // on manipule une copie !\n\n if (_search.layers) {\n if (_search.layers.length === 0) {\n logger.info(\"tag 'layers' is empty !\");\n }\n }\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // TODO...\n // outil de recherche des couches mapbox.\n // 2 modes de recherches : exact ou par autocompletion\n // affichage des resultats directement dans la liste des couches\n // la recherche porte sur les champs suiavnts (options):\n // * id (par defaut)\n // * source-layer (par defaut)\n // * type (ex. Symbol)\n // * field (ex. HOPITAL_PONC) > recherche dans le champs filtre\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Search instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Search#editor:search:onsubmit\n */\n }, {\n key: \"onSubmitSearchLayersMapBox\",\n value: function onSubmitSearchLayersMapBox(e) {\n logger.trace(\"onSubmitSearchLayersMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].search.onsubmit, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Search#editor:search:onautocomplete\n */\n }, {\n key: \"onAutocompleteSearchLayersMapBox\",\n value: function onAutocompleteSearchLayersMapBox(e) {\n logger.trace(\"onAutocompleteSearchLayersMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].search.onautocomplete, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Search);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9TZWFyY2guanM/ODM4NSJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJTZWFyY2giLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJ0YXJnZXQiLCJ0b29scyIsInRpdGxlIiwib2JqIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJfdG9vbHNEZWZhdWx0IiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsImNvbnRhaW5lciIsIm5hbWUiLCJfc2VhcmNoIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibGF5ZXJzIiwibGVuZ3RoIiwiaW5mbyIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImFkZCIsImdldEVsZW1lbnRCeUlkIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJkaXNwbGF5Iiwic3R5bGUiLCJnZXRDb250YWluZXIiLCJvblN1Ym1pdFNlYXJjaExheWVyc01hcEJveCIsImUiLCJlZGl0b3JJRCIsImRhdGEiLCJFdmVudEJ1cyIsImRpc3BhdGNoIiwiRXZlbnRFZGl0b3IiLCJzZWFyY2giLCJvbnN1Ym1pdCIsIm9uQXV0b2NvbXBsZXRlU2VhcmNoTGF5ZXJzTWFwQm94Iiwib25hdXRvY29tcGxldGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ1E7QUFDaUI7QUFFM0QsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsZUFBZSxDQUFDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJCQSxJQXNCTUMsTUFBTTtFQUVSLFNBQUFBLE9BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLE1BQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHNCQUFzQixFQUFFRixPQUFPLENBQUM7O0lBRTdDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtNQUNBRyxNQUFNLEVBQUcsSUFBSTtNQUNiQyxLQUFLLEVBQUcsSUFBSTtNQUNaQyxLQUFLLEVBQUcsSUFBSTtNQUNaQyxHQUFHLEVBQUc7SUFDVixDQUFDO0lBRUQsSUFBSSxFQUFFLElBQUksWUFBWVAsTUFBTSxDQUFDLEVBQUU7TUFDM0IsTUFBTSxJQUFJUSxTQUFTLENBQUMseUJBQXlCLENBQUM7SUFDbEQ7SUFFQSxJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0lBRWxCLElBQUksQ0FBQ0MsY0FBYyxDQUFDLENBQUM7RUFDekI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEksT0FBQUMsWUFBQSxDQUFBWCxNQUFBO0lBQUFZLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUFKLFlBQUEsRUFBZTtNQUNYO01BQ0EsSUFBSSxDQUFDSyxFQUFFLEdBQUcsSUFBSSxDQUFDYixPQUFPLENBQUNhLEVBQUUsSUFBSSxJQUFJO01BRWpDLElBQUksQ0FBQyxJQUFJLENBQUNiLE9BQU8sQ0FBQ0csTUFBTSxFQUFFO1FBQ3RCO01BQUE7TUFHSixJQUFJVyxhQUFhLEdBQUcsQ0FBQyxDQUFDO01BRXRCLElBQUksQ0FBQyxJQUFJLENBQUNkLE9BQU8sQ0FBQ0ksS0FBSyxFQUFFO1FBQ3JCLElBQUksQ0FBQ0osT0FBTyxDQUFDSSxLQUFLLEdBQUdVLGFBQWE7TUFDdEM7TUFFQUMscURBQUssQ0FBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQ2hCLE9BQU8sQ0FBQ0ksS0FBSyxFQUFFVSxhQUFhLEVBQUUsS0FBSyxDQUFDO01BRTNELElBQUksQ0FBQyxJQUFJLENBQUNkLE9BQU8sQ0FBQ00sR0FBRyxFQUFFO1FBQ25CO1FBQ0EsSUFBSSxDQUFDTixPQUFPLENBQUNNLEdBQUcsR0FBRyxDQUFDLENBQUM7TUFDekI7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDTixPQUFPLENBQUNLLEtBQUssRUFBRTtRQUNyQixJQUFJLENBQUNMLE9BQU8sQ0FBQ0ssS0FBSyxHQUFHLHdCQUF3QjtNQUNqRDtNQUNBLElBQUksQ0FBQ1ksU0FBUyxHQUFHLElBQUk7O01BRXJCO01BQ0EsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDUmYsTUFBTSxFQUFHLDRCQUE0QjtRQUNyQ2MsU0FBUyxFQUFHO1FBQ1o7TUFDSixDQUFDO0lBQ0w7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFUSTtJQUFBTixHQUFBO0lBQUFDLEtBQUEsRUFVQSxTQUFBSCxlQUFBLEVBQWtCO01BQ2Q7TUFDQTtNQUNBLElBQUlVLE9BQU8sR0FBR0MsSUFBSSxDQUFDQyxLQUFLLENBQUNELElBQUksQ0FBQ0UsU0FBUyxDQUFDLElBQUksQ0FBQ3RCLE9BQU8sQ0FBQ00sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUU1RCxJQUFJYSxPQUFPLENBQUNJLE1BQU0sRUFBRTtRQUNoQixJQUFJSixPQUFPLENBQUNJLE1BQU0sQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRTtVQUM3QjVCLE1BQU0sQ0FBQzZCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUMxQztNQUNKO01BRUEsSUFBSUMsR0FBRyxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDdkNGLEdBQUcsQ0FBQ0csU0FBUyxHQUFHLElBQUksQ0FBQ1gsSUFBSSxDQUFDRCxTQUFTOztNQUVuQztNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQUksQ0FBQ0EsU0FBUyxHQUFHUyxHQUFHO0lBQ3hCOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0FBQ0o7QUFDQTtBQUNBO0VBSEk7SUFBQWYsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQWtCLElBQUEsRUFBTztNQUNILElBQUksQ0FBQyxJQUFJLENBQUM5QixPQUFPLENBQUNHLE1BQU0sRUFBRTtRQUN0QixJQUFJLENBQUN3QixRQUFRLENBQUNJLGNBQWMsQ0FBQyxJQUFJLENBQUNiLElBQUksQ0FBQ2YsTUFBTSxDQUFDLEVBQUU7VUFDNUMsSUFBSXVCLEdBQUcsR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO1VBQ3ZDRixHQUFHLENBQUNiLEVBQUUsR0FBRyxJQUFJLENBQUNLLElBQUksQ0FBQ2YsTUFBTTtVQUN6QixJQUFJNkIsSUFBSSxHQUFHTCxRQUFRLENBQUNNLGVBQWUsSUFDL0JOLFFBQVEsQ0FBQ08sb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQ3hDUCxRQUFRLENBQUNPLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUM1Q0YsSUFBSSxDQUFDRyxXQUFXLENBQUNULEdBQUcsQ0FBQztRQUN6QjtRQUNBLElBQUksQ0FBQzFCLE9BQU8sQ0FBQ0csTUFBTSxHQUFHd0IsUUFBUSxDQUFDSSxjQUFjLENBQUMsSUFBSSxDQUFDYixJQUFJLENBQUNmLE1BQU0sQ0FBQztNQUNuRTtNQUNBLElBQUksSUFBSSxDQUFDYyxTQUFTLEVBQUU7UUFDaEIsSUFBSSxDQUFDakIsT0FBTyxDQUFDRyxNQUFNLENBQUNnQyxXQUFXLENBQUMsSUFBSSxDQUFDbEIsU0FBUyxDQUFDO01BQ25EO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEk7SUFBQU4sR0FBQTtJQUFBQyxLQUFBLEVBTUEsU0FBQXdCLFFBQVNBLFFBQU8sRUFBRTtNQUNkeEMsTUFBTSxDQUFDTSxLQUFLLENBQUMsV0FBVyxFQUFFa0MsUUFBTyxDQUFDO01BQ2xDLElBQUksT0FBT0EsUUFBTyxLQUFLLFdBQVcsRUFBRTtRQUNoQyxJQUFJLENBQUNuQixTQUFTLENBQUNvQixLQUFLLENBQUNELE9BQU8sR0FBSUEsUUFBTyxHQUFJLE1BQU0sR0FBRyxNQUFNO01BQzlEO01BQ0EsT0FBUSxJQUFJLENBQUNuQixTQUFTLENBQUNvQixLQUFLLENBQUNELE9BQU8sS0FBSyxNQUFNO0lBQ25EOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBekIsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTBCLGFBQUEsRUFBZ0I7TUFDWixPQUFPLElBQUksQ0FBQ3JCLFNBQVM7SUFDekI7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFUSTtJQUFBTixHQUFBO0lBQUFDLEtBQUEsRUFVQSxTQUFBMkIsMkJBQTRCQyxDQUFDLEVBQUU7TUFDM0I1QyxNQUFNLENBQUNNLEtBQUssQ0FBQyw0QkFBNEIsRUFBRXNDLENBQUMsQ0FBQztNQUM3Q0EsQ0FBQyxDQUFDQyxRQUFRLEdBQUcsSUFBSSxDQUFDNUIsRUFBRTtNQUNwQjJCLENBQUMsQ0FBQ0UsSUFBSSxHQUFHLElBQUksQ0FBQzFDLE9BQU87TUFDckIyQyxpREFBUSxDQUFDQyxRQUFRLENBQUNDLDhDQUFXLENBQUNDLE1BQU0sQ0FBQ0MsUUFBUSxFQUFFUCxDQUFDLENBQUM7SUFDckQ7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFUSTtJQUFBN0IsR0FBQTtJQUFBQyxLQUFBLEVBVUEsU0FBQW9DLGlDQUFrQ1IsQ0FBQyxFQUFFO01BQ2pDNUMsTUFBTSxDQUFDTSxLQUFLLENBQUMsa0NBQWtDLEVBQUVzQyxDQUFDLENBQUM7TUFDbkRBLENBQUMsQ0FBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQzVCLEVBQUU7TUFDcEIyQixDQUFDLENBQUNFLElBQUksR0FBRyxJQUFJLENBQUMxQyxPQUFPO01BQ3JCMkMsaURBQVEsQ0FBQ0MsUUFBUSxDQUFDQyw4Q0FBVyxDQUFDQyxNQUFNLENBQUNHLGNBQWMsRUFBRVQsQ0FBQyxDQUFDO0lBQzNEO0VBQUM7QUFBQTtBQUVKO0FBRWN6QyxxRUFBTSIsImZpbGUiOiIuL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9TZWFyY2guanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRCdXMgZnJvbSBcImV2ZW50YnVzanNcIjtcbmltcG9ydCBFdmVudEVkaXRvciBmcm9tIFwiLi9FdmVudFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJlZGl0b3Itc2VhcmNoXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBUT0RPIE1hcEJveCBzZWFyY2ggbWFuYWdlbWVudFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnN0eWxlLmVkaXRvci5TZWFyY2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEB0b2RvXG4gKiBAZXhhbXBsZVxuICogICB2YXIgU2VhcmNoID0gbmV3IFNlYXJjaCAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHRvb2xzIDoge1xuICogICAgICAgICAgLy8gLi4uXG4gKiAgICAgIH1cbiAqICAgICAgdGl0bGUgOiBcIkZpbHRyZXMgZGUgcmVjaGVyY2hlIDpcIixcbiAqICAgICAgb2JqIDoge31cbiAqICAgfSk7XG4gKiAgU2VhcmNoLmFkZCgpO1xuICogIFNlYXJjaC5kaXNwbGF5KHRydWUpO1xuICogIFNlYXJjaC5nZXRDb250YWluZXIoKTtcbiAqL1xuY2xhc3MgU2VhcmNoIHtcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIltjb25zdHJ1Y3Rvcl0gU2VhcmNoXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgdG9vbHMgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGUgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZWFyY2gpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGNmLiBhZGQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF90b29sc0RlZmF1bHQgPSB7fTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29scykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xzID0gX3Rvb2xzRGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucy50b29scywgX3Rvb2xzRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLm9iaikge1xuICAgICAgICAgICAgLy8gY2hvaXggZCdhdm9pciB1biBvYmpldCB2aWRlIHBvdXIgdW5lIGVkaXRpb24gZnV0dXIuLi5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vYmogPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGl0bGUgPSBcIlJlY2hlcmNoZSBkZSBjb3VjaGVzIDpcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hTZWFyY2hUYXJnZXRcIixcbiAgICAgICAgICAgIGNvbnRhaW5lciA6IFwiR1BFZGl0b3JNYXBCb3hTZWFyY2hDb250YWluZXJcIlxuICAgICAgICAgICAgLy8gVE9ETyAuLi5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveFNlYXJjaENvbnRhaW5lclwiPlxuICAgICAqICAvLyAuLi5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIC8vIGNvbnRleHRlXG4gICAgICAgIC8vIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIF9zZWFyY2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5vYmopKTsgLy8gb24gbWFuaXB1bGUgdW5lIGNvcGllICAhXG5cbiAgICAgICAgaWYgKF9zZWFyY2gubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoX3NlYXJjaC5sYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ0YWcgJ2xheWVycycgaXMgZW1wdHkgIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICAvLyBUT0RPLi4uXG4gICAgICAgIC8vIG91dGlsIGRlIHJlY2hlcmNoZSBkZXMgY291Y2hlcyBtYXBib3guXG4gICAgICAgIC8vIDIgbW9kZXMgZGUgcmVjaGVyY2hlcyA6IGV4YWN0IG91IHBhciBhdXRvY29tcGxldGlvblxuICAgICAgICAvLyBhZmZpY2hhZ2UgZGVzIHJlc3VsdGF0cyBkaXJlY3RlbWVudCBkYW5zIGxhIGxpc3RlIGRlcyBjb3VjaGVzXG4gICAgICAgIC8vIGxhIHJlY2hlcmNoZSBwb3J0ZSBzdXIgbGVzIGNoYW1wcyBzdWlhdm50cyAob3B0aW9ucyk6XG4gICAgICAgIC8vICogaWQgKHBhciBkZWZhdXQpXG4gICAgICAgIC8vICogc291cmNlLWxheWVyIChwYXIgZGVmYXV0KVxuICAgICAgICAvLyAqIHR5cGUgKGV4LiBTeW1ib2wpXG4gICAgICAgIC8vICogZmllbGQgKGV4LiBIT1BJVEFMX1BPTkMpID4gcmVjaGVyY2hlIGRhbnMgbGUgY2hhbXBzIGZpbHRyZVxuICAgICAgICAvLyBtYWluIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRpdjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiBBZGQgZWxlbWVudCBpbnRvIHRhcmdldCBET01cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIFNlYXJjaCBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdi5pZCA9IHRoaXMubmFtZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGlzcGxheSBjb250YWluZXIgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzaG93L2hpZGRlbiBjb250YWluZXIgb3IgZ2V0IHN0YXR1c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICBkaXNwbGF5IChkaXNwbGF5KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcImRpc3BsYXkoKVwiLCBkaXNwbGF5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwbGF5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkpID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09IFwiZmxleFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIChET00pXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGhhbmRsZXJzIGV2ZW50cyB0byBkb20gIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgU2VhcmNoI2VkaXRvcjpzZWFyY2g6b25zdWJtaXRcbiAgICAgKi9cbiAgICBvblN1Ym1pdFNlYXJjaExheWVyc01hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvblN1Ym1pdFNlYXJjaExheWVyc01hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3Iuc2VhcmNoLm9uc3VibWl0LCBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBTZWFyY2gjZWRpdG9yOnNlYXJjaDpvbmF1dG9jb21wbGV0ZVxuICAgICAqL1xuICAgIG9uQXV0b2NvbXBsZXRlU2VhcmNoTGF5ZXJzTWFwQm94IChlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIm9uQXV0b2NvbXBsZXRlU2VhcmNoTGF5ZXJzTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5zZWFyY2gub25hdXRvY29tcGxldGUsIGUpO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2VhcmNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Search.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"editor-search\");\n\n/**\n * @classdesc\n *\n * TODO MapBox search management\n *\n * @constructor\n * @alias ol.style.editor.Search\n * @param {Object} options - options for function call.\n * @todo\n * @example\n * var Search = new Search ({\n * target : ...,\n * tools : {\n * // ...\n * }\n * title : \"Filtres de recherche :\",\n * obj : {}\n * });\n * Search.add();\n * Search.display(true);\n * Search.getContainer();\n */\nvar Search = /*#__PURE__*/function () {\n function Search(options) {\n _classCallCheck(this, Search);\n logger.trace(\"[constructor] Search\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n tools: null,\n title: null,\n obj: null\n };\n if (!(this instanceof Search)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Search, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n var _toolsDefault = {};\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition futur...\n this.options.obj = {};\n }\n if (!this.options.title) {\n this.options.title = \"Recherche de couches :\";\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxSearchTarget\",\n container: \"GPEditorMapBoxSearchContainer\"\n // TODO ...\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n * // ...\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n // var self = this;\n var _search = JSON.parse(JSON.stringify(this.options.obj)); // on manipule une copie !\n\n if (_search.layers) {\n if (_search.layers.length === 0) {\n logger.info(\"tag 'layers' is empty !\");\n }\n }\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n\n // TODO...\n // outil de recherche des couches mapbox.\n // 2 modes de recherches : exact ou par autocompletion\n // affichage des resultats directement dans la liste des couches\n // la recherche porte sur les champs suiavnts (options):\n // * id (par defaut)\n // * source-layer (par defaut)\n // * type (ex. Symbol)\n // * field (ex. HOPITAL_PONC) > recherche dans le champs filtre\n // main container\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Search instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Search#editor:search:onsubmit\n */\n }, {\n key: \"onSubmitSearchLayersMapBox\",\n value: function onSubmitSearchLayersMapBox(e) {\n logger.trace(\"onSubmitSearchLayersMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].search.onsubmit, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Search#editor:search:onautocomplete\n */\n }, {\n key: \"onAutocompleteSearchLayersMapBox\",\n value: function onAutocompleteSearchLayersMapBox(e) {\n logger.trace(\"onAutocompleteSearchLayersMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].search.onautocomplete, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Search);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9TZWFyY2guanM/ODM4NSJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJTZWFyY2giLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJ0YXJnZXQiLCJ0b29scyIsInRpdGxlIiwib2JqIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJfdG9vbHNEZWZhdWx0IiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsImNvbnRhaW5lciIsIm5hbWUiLCJfc2VhcmNoIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibGF5ZXJzIiwibGVuZ3RoIiwiaW5mbyIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImFkZCIsImdldEVsZW1lbnRCeUlkIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJkaXNwbGF5Iiwic3R5bGUiLCJnZXRDb250YWluZXIiLCJvblN1Ym1pdFNlYXJjaExheWVyc01hcEJveCIsImUiLCJlZGl0b3JJRCIsImRhdGEiLCJFdmVudEJ1cyIsImRpc3BhdGNoIiwiRXZlbnRFZGl0b3IiLCJzZWFyY2giLCJvbnN1Ym1pdCIsIm9uQXV0b2NvbXBsZXRlU2VhcmNoTGF5ZXJzTWFwQm94Iiwib25hdXRvY29tcGxldGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ1E7QUFDaUI7QUFFM0QsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsZUFBZSxDQUFDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LENBQUNHLGNBQWMsRUFBRVQsQ0FBQyxDQUFDO0lBQzNEO0VBQUM7QUFBQTtBQUVKO0FBRWN6QyxxRUFBTSIsImZpbGUiOiIuL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9TZWFyY2guanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRCdXMgZnJvbSBcImV2ZW50YnVzanNcIjtcbmltcG9ydCBFdmVudEVkaXRvciBmcm9tIFwiLi9FdmVudFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJlZGl0b3Itc2VhcmNoXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBUT0RPIE1hcEJveCBzZWFyY2ggbWFuYWdlbWVudFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnN0eWxlLmVkaXRvci5TZWFyY2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEB0b2RvXG4gKiBAZXhhbXBsZVxuICogICB2YXIgU2VhcmNoID0gbmV3IFNlYXJjaCAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHRvb2xzIDoge1xuICogICAgICAgICAgLy8gLi4uXG4gKiAgICAgIH1cbiAqICAgICAgdGl0bGUgOiBcIkZpbHRyZXMgZGUgcmVjaGVyY2hlIDpcIixcbiAqICAgICAgb2JqIDoge31cbiAqICAgfSk7XG4gKiAgU2VhcmNoLmFkZCgpO1xuICogIFNlYXJjaC5kaXNwbGF5KHRydWUpO1xuICogIFNlYXJjaC5nZXRDb250YWluZXIoKTtcbiAqL1xuY2xhc3MgU2VhcmNoIHtcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIltjb25zdHJ1Y3Rvcl0gU2VhcmNoXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgdG9vbHMgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGUgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZWFyY2gpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY29tcG9uZW50XG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemUgKCkge1xuICAgICAgICAvLyB1bmlxdWUgZWRpdG9yIGlkIChvcHRpb25hbCEpXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGNmLiBhZGQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF90b29sc0RlZmF1bHQgPSB7fTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29scykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xzID0gX3Rvb2xzRGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucy50b29scywgX3Rvb2xzRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLm9iaikge1xuICAgICAgICAgICAgLy8gY2hvaXggZCdhdm9pciB1biBvYmpldCB2aWRlIHBvdXIgdW5lIGVkaXRpb24gZnV0dXIuLi5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vYmogPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGl0bGUgPSBcIlJlY2hlcmNoZSBkZSBjb3VjaGVzIDpcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hTZWFyY2hUYXJnZXRcIixcbiAgICAgICAgICAgIGNvbnRhaW5lciA6IFwiR1BFZGl0b3JNYXBCb3hTZWFyY2hDb250YWluZXJcIlxuICAgICAgICAgICAgLy8gVE9ETyAuLi5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveFNlYXJjaENvbnRhaW5lclwiPlxuICAgICAqICAvLyAuLi5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIC8vIGNvbnRleHRlXG4gICAgICAgIC8vIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIF9zZWFyY2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5vYmopKTsgLy8gb24gbWFuaXB1bGUgdW5lIGNvcGllICAhXG5cbiAgICAgICAgaWYgKF9zZWFyY2gubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoX3NlYXJjaC5sYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ0YWcgJ2xheWVycycgaXMgZW1wdHkgIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcjtcblxuICAgICAgICAvLyBUT0RPLi4uXG4gICAgICAgIC8vIG91dGlsIGRlIHJlY2hlcmNoZSBkZXMgY291Y2hlcyBtYXBib3guXG4gICAgICAgIC8vIDIgbW9kZXMgZGUgcmVjaGVyY2hlcyA6IGV4YWN0IG91IHBhciBhdXRvY29tcGxldGlvblxuICAgICAgICAvLyBhZmZpY2hhZ2UgZGVzIHJlc3VsdGF0cyBkaXJlY3RlbWVudCBkYW5zIGxhIGxpc3RlIGRlcyBjb3VjaGVzXG4gICAgICAgIC8vIGxhIHJlY2hlcmNoZSBwb3J0ZSBzdXIgbGVzIGNoYW1wcyBzdWlhdm50cyAob3B0aW9ucyk6XG4gICAgICAgIC8vICogaWQgKHBhciBkZWZhdXQpXG4gICAgICAgIC8vICogc291cmNlLWxheWVyIChwYXIgZGVmYXV0KVxuICAgICAgICAvLyAqIHR5cGUgKGV4LiBTeW1ib2wpXG4gICAgICAgIC8vICogZmllbGQgKGV4LiBIT1BJVEFMX1BPTkMpID4gcmVjaGVyY2hlIGRhbnMgbGUgY2hhbXBzIGZpbHRyZVxuICAgICAgICAvLyBtYWluIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRpdjtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiBBZGQgZWxlbWVudCBpbnRvIHRhcmdldCBET01cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIFNlYXJjaCBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdi5pZCA9IHRoaXMubmFtZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGlzcGxheSBjb250YWluZXIgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzaG93L2hpZGRlbiBjb250YWluZXIgb3IgZ2V0IHN0YXR1c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICBkaXNwbGF5IChkaXNwbGF5KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcImRpc3BsYXkoKVwiLCBkaXNwbGF5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwbGF5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkpID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09IFwiZmxleFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIChET00pXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGhhbmRsZXJzIGV2ZW50cyB0byBkb20gIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgU2VhcmNoI2VkaXRvcjpzZWFyY2g6b25zdWJtaXRcbiAgICAgKi9cbiAgICBvblN1Ym1pdFNlYXJjaExheWVyc01hcEJveCAoZSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJvblN1Ym1pdFNlYXJjaExheWVyc01hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3Iuc2VhcmNoLm9uc3VibWl0LCBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBTZWFyY2gjZWRpdG9yOnNlYXJjaDpvbmF1dG9jb21wbGV0ZVxuICAgICAqL1xuICAgIG9uQXV0b2NvbXBsZXRlU2VhcmNoTGF5ZXJzTWFwQm94IChlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIm9uQXV0b2NvbXBsZXRlU2VhcmNoTGF5ZXJzTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5zZWFyY2gub25hdXRvY29tcGxldGUsIGUpO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2VhcmNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Search.js\n"); /***/ }), @@ -2429,7 +2429,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var even /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"editor-style\");\n\n/**\n * @classdesc\n *\n * MapBox styles management\n *\n * @constructor\n * @alias ol.style.editor.Style\n * @param {Object} options - options for function call.\n * @example\n * var style = new Style ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * tools : {\n * edition : false,\n * scale : true\n * },\n * title : \"Styles (JSON)\",\n * obj : {\n * paint : {},\n * layout : {}\n * }\n * });\n * style.add();\n * style.display(true);\n * style.getContainer();\n */\nvar Style = /*#__PURE__*/function () {\n function Style(options) {\n _classCallCheck(this, Style);\n logger.trace(\"[constructor] Style\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n position: 0,\n tools: null,\n title: null,\n obj: null\n };\n if (!(this instanceof Style)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Style, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.position) {\n this.options.position = 0;\n }\n var _toolsDefault = {\n scale: true,\n edition: false\n };\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition futur...\n this.options.obj = {\n paint: {},\n layout: {}\n };\n }\n if (!this.options.title) {\n this.options.title = \"JSON Styles :\";\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxStyleTarget\",\n container: \"GPEditorMapBoxStyleContainer\",\n containerjson: \"GPEditorMapBoxStyleJsonContainer\",\n jsonlabel: \"GPEditorMapBoxStyleJsonTitle\",\n jsondisplay: \"GPEditorMapBoxStyleJsonDisplay\",\n containertoolsscale: \"GPEditorMapBoxStyleToolsScaleContainer\",\n scaletitle: \"GPEditorMapBoxStyleScaleTitle\",\n containertoolsminscale: \"GPEditorMapBoxStyleToolsScaleMinContainer\",\n scalelabelmin: \"GPEditorMapBoxStyleScaleLabelMin\",\n scaleinputmin: \"GPEditorMapBoxStyleScaleInputMin\",\n containertoolsmaxscale: \"GPEditorMapBoxStyleToolsScaleMaxContainer\",\n scalelabelmax: \"GPEditorMapBoxStyleScaleLabelMax\",\n scaleinputmax: \"GPEditorMapBoxStyleScaleInputMax\",\n containertoolsedit: \"GPEditorMapBoxStyleToolsEditionContainer\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * ie. this.container\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n * \n *
...
\n *
\n *
\n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var _found = false;\n var _obj = JSON.parse(JSON.stringify(this.options.obj)); // on manipule une copie !\n var _style = {};\n\n // styles into tag 'paint' ?\n if (_obj.paint) {\n _found = true;\n _style.paint = _obj.paint;\n if (Object.keys(_obj.paint).length === 0) {\n logger.info(\"tag 'paint' is empty !\");\n }\n }\n\n // if not, search into tag 'layout' !\n if (_obj.layout) {\n _found = true;\n _style.layout = _obj.layout;\n // FIXME delete visibility from display ?\n if (_obj.layout.visibility) {\n delete _style.visibility;\n }\n if (Object.keys(_obj.layout).length === 0) {\n logger.info(\"tag 'layout' is empty !\");\n }\n }\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n var json = null;\n if (_found) {\n var strJson = JSON.stringify(_style, null, 4);\n json = this._syntaxHighlight(strJson);\n }\n var divJson = document.createElement(\"div\");\n divJson.className = this.name.containerjson;\n var label = document.createElement(\"label\");\n label.className = this.name.jsonlabel;\n label.innerHTML = this.options.title;\n divJson.appendChild(label);\n var pre = document.createElement(\"pre\");\n pre.className = this.name.jsondisplay;\n pre.innerHTML = json;\n if (pre.addEventListener) {\n pre.addEventListener(\"click\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonStyleMapBox(e);\n }\n });\n } else if (pre.attachEvent) {\n pre.attachEvent(\"onclick\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonStyleMapBox(e);\n }\n });\n }\n divJson.appendChild(pre);\n div.appendChild(divJson);\n\n // scale\n if (this.options.tools.scale) {\n div.appendChild(this._createElementToolsScale({\n min: _style.layout ? _style.layout.minzoom : 0,\n max: _style.layout ? _style.layout.maxzoom : 21\n }));\n }\n\n // TODO menu d'edition\n if (this.options.tools.edition) {\n div.appendChild(this._createElementToolsEdition());\n }\n\n // main container\n this.container = div;\n }\n\n /**\n * Graphical rendering of the scale tools\n *\n * @param {Object} scale - {min,max} or 0|21\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n */\n }, {\n key: \"_createElementToolsScale\",\n value: function _createElementToolsScale(scale) {\n logger.trace(\"_createElementToolsScale\");\n var self = this;\n var obj = this.options.obj;\n var divToolsScale = document.createElement(\"div\");\n divToolsScale.className = this.name.containertoolsscale;\n\n // FIXME Titre ?\n // var label = document.createElement(\"label\");\n // label.className = this.name.scaletitle;\n // label.innerHTML = \"Scale :\";\n // divToolsScale.appendChild(label);\n var divMin = document.createElement(\"div\");\n divMin.className = this.name.containertoolsminscale;\n var labelMin = document.createElement(\"label\");\n labelMin.className = this.name.scalelabelmin;\n labelMin.innerHTML = \"min :\";\n divMin.appendChild(labelMin);\n var inputMin = document.createElement(\"input\");\n inputMin.className = this.name.scaleinputmin;\n inputMin.type = \"range\";\n inputMin.value = scale.min || 0;\n inputMin.title = scale.min || 0;\n inputMin.disabled = false;\n inputMin.min = 0;\n inputMin.max = 21;\n inputMin.data = obj; // on lie le DOM et la couche, utile lors d'evenement !\n if (inputMin.addEventListener) {\n inputMin.addEventListener(\"change\", function (e) {\n self.onChangeStyleScaleMinMapBox(e);\n });\n } else if (inputMin.appendChild) {\n inputMin.appendChild(\"onchange\", function (e) {\n self.onChangeStyleScaleMinMapBox(e);\n });\n }\n divMin.appendChild(inputMin);\n divToolsScale.appendChild(divMin);\n var divMax = document.createElement(\"div\");\n divMax.className = this.name.containertoolsmaxscale;\n var labelMax = document.createElement(\"label\");\n labelMax.className = this.name.scalelabelmax;\n labelMax.innerHTML = \"max :\";\n divMax.appendChild(labelMax);\n var inputMax = document.createElement(\"input\");\n inputMax.className = this.name.scaleinputmin;\n inputMax.type = \"range\";\n inputMax.value = scale.max || 21;\n inputMax.title = scale.max || 21;\n inputMax.disabled = false;\n inputMax.min = 0;\n inputMax.max = 21;\n inputMax.data = obj; // on lie le DOM et la couche, utile lors d'evenement !\n if (inputMax.addEventListener) {\n inputMax.addEventListener(\"change\", function (e) {\n self.onChangeStyleScaleMaxMapBox(e);\n });\n } else if (inputMax.appendChild) {\n inputMax.appendChild(\"onchange\", function (e) {\n self.onChangeStyleScaleMaxMapBox(e);\n });\n }\n divMax.appendChild(inputMax);\n divToolsScale.appendChild(divMax);\n return divToolsScale;\n }\n\n /**\n * Graphical rendering of the edition tools\n *\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n */\n }, {\n key: \"_createElementToolsEdition\",\n value: function _createElementToolsEdition() {\n logger.warn(\"_createElementToolsEdition, it's not yet implemented !\");\n var divToolsEdit = document.createElement(\"div\");\n divToolsEdit.className = this.name.containertoolsedit;\n return divToolsEdit;\n }\n\n // ################################################################### //\n // ##################### private methods ############################# //\n // ################################################################### //\n /**\n * Transform a JSON into a DOM with a syntax in color\n *\n * @private\n * @param {Object} json - json.\n * @returns {DOMElement} dom element\n */\n }, {\n key: \"_syntaxHighlight\",\n value: function _syntaxHighlight(json) {\n json = json.replace(/&/g, \"&\").replace(//g, \">\");\n return json.replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/g, function (match) {\n var cls = \"gp-json-number\";\n if (/^\"/.test(match)) {\n if (/:$/.test(match)) {\n cls = \"gp-json-key\";\n } else {\n cls = \"gp-json-string\";\n }\n } else if (/true|false/.test(match)) {\n cls = \"gp-json-boolean\";\n } else if (/null/.test(match)) {\n cls = \"gp-json-null\";\n }\n return \"\" + match + \"\";\n });\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Style#editor:style:oneditjson\n */\n }, {\n key: \"onEditJsonStyleMapBox\",\n value: function onEditJsonStyleMapBox(e) {\n logger.trace(\"onEditJsonStyleMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].style.oneditjson, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Style#editor:style:scale:onchangemin\n */\n }, {\n key: \"onChangeStyleScaleMinMapBox\",\n value: function onChangeStyleScaleMinMapBox(e) {\n logger.trace(\"onChangeStyleScaleMinMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].style.scale.onchangemin, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Style#editor:style:scale:onchangemax\n */\n }, {\n key: \"onChangeStyleScaleMaxMapBox\",\n value: function onChangeStyleScaleMaxMapBox(e) {\n logger.trace(\"onChangeStyleScaleMaxMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].style.scale.onchangemax, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Style);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9TdHlsZS5qcz84Zjc3Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIlN0eWxlIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInRyYWNlIiwidGFyZ2V0IiwicG9zaXRpb24iLCJ0b29scyIsInRpdGxlIiwib2JqIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJfdG9vbHNEZWZhdWx0Iiwic2NhbGUiLCJlZGl0aW9uIiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsInBhaW50IiwibGF5b3V0IiwiY29udGFpbmVyIiwibmFtZSIsImNvbnRhaW5lcmpzb24iLCJqc29ubGFiZWwiLCJqc29uZGlzcGxheSIsImNvbnRhaW5lcnRvb2xzc2NhbGUiLCJzY2FsZXRpdGxlIiwiY29udGFpbmVydG9vbHNtaW5zY2FsZSIsInNjYWxlbGFiZWxtaW4iLCJzY2FsZWlucHV0bWluIiwiY29udGFpbmVydG9vbHNtYXhzY2FsZSIsInNjYWxlbGFiZWxtYXgiLCJzY2FsZWlucHV0bWF4IiwiY29udGFpbmVydG9vbHNlZGl0Iiwic2VsZiIsIl9mb3VuZCIsIl9vYmoiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJfc3R5bGUiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiaW5mbyIsInZpc2liaWxpdHkiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJqc29uIiwic3RySnNvbiIsIl9zeW50YXhIaWdobGlnaHQiLCJkaXZKc29uIiwibGFiZWwiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInByZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwib25FZGl0SnNvblN0eWxlTWFwQm94IiwiYXR0YWNoRXZlbnQiLCJfY3JlYXRlRWxlbWVudFRvb2xzU2NhbGUiLCJtaW4iLCJtaW56b29tIiwibWF4IiwibWF4em9vbSIsIl9jcmVhdGVFbGVtZW50VG9vbHNFZGl0aW9uIiwiZGl2VG9vbHNTY2FsZSIsImRpdk1pbiIsImxhYmVsTWluIiwiaW5wdXRNaW4iLCJ0eXBlIiwiZGlzYWJsZWQiLCJkYXRhIiwib25DaGFuZ2VTdHlsZVNjYWxlTWluTWFwQm94IiwiZGl2TWF4IiwibGFiZWxNYXgiLCJpbnB1dE1heCIsIm9uQ2hhbmdlU3R5bGVTY2FsZU1heE1hcEJveCIsIndhcm4iLCJkaXZUb29sc0VkaXQiLCJyZXBsYWNlIiwibWF0Y2giLCJjbHMiLCJ0ZXN0IiwiYWRkIiwiZ2V0RWxlbWVudEJ5SWQiLCJub2RlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkaXNwbGF5Iiwic3R5bGUiLCJnZXRDb250YWluZXIiLCJlZGl0b3JJRCIsIkV2ZW50QnVzIiwiZGlzcGF0Y2giLCJFdmVudEVkaXRvciIsIm9uZWRpdGpzb24iLCJvbmNoYW5nZW1pbiIsIm9uY2hhbmdlbWF4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBa0M7QUFDQTtBQUNRO0FBQ2lCO0FBRTNELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGNBQWMsQ0FBQzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpCQSxJQTBCTUMsS0FBSztFQUVQLFNBQUFBLE1BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLEtBQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHFCQUFxQixFQUFFRixPQUFPLENBQUM7O0lBRTVDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtNQUNBRyxNQUFNLEVB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QUM1RSxPQUFPO01BQ3JCaUcsaURBQVEsQ0FBQ0MsUUFBUSxDQUFDQyw4Q0FBVyxDQUFDTCxLQUFLLENBQUM5RSxLQUFLLENBQUNzRixXQUFXLEVBQUV6QyxDQUFDLENBQUM7SUFDN0Q7RUFBQztBQUFBO0FBRUo7QUFFYzlELG9FQUFLIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRWRpdG9yL1N0eWxlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vLi4vQ29tbW9uL1V0aWxzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLXN0eWxlXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBNYXBCb3ggc3R5bGVzIG1hbmFnZW1lbnRcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBvbC5zdHlsZS5lZGl0b3IuU3R5bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEBleGFtcGxlXG4gKiAgIHZhciBzdHlsZSA9IG5ldyBTdHlsZSAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHBvc2l0aW9uIDogMSwgLy8gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gKHVuaXF1ZSAhKVxuICogICAgICB0b29scyA6IHtcbiAqICAgICAgICAgIGVkaXRpb24gOiBmYWxzZSxcbiAqICAgICAgICAgIHNjYWxlIDogdHJ1ZVxuICogICAgICB9LFxuICogICAgICB0aXRsZSA6IFwiU3R5bGVzIChKU09OKVwiLFxuICogICAgICBvYmogOiB7XG4gKiAgICAgICAgICBwYWludCA6IHt9LFxuICogICAgICAgICAgbGF5b3V0IDoge31cbiAqICAgICAgfVxuICogICB9KTtcbiAqICBzdHlsZS5hZGQoKTtcbiAqICBzdHlsZS5kaXNwbGF5KHRydWUpO1xuICogIHN0eWxlLmdldENvbnRhaW5lcigpO1xuICovXG5jbGFzcyBTdHlsZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIFN0eWxlXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgcG9zaXRpb24gOiAwLFxuICAgICAgICAgICAgdG9vbHMgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGUgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUlJPUiBDTEFTU19DT05TVFJVQ1RPUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUoKTtcblxuICAgICAgICB0aGlzLl9pbml0Q29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdGlhbGl6ZSAoKSB7XG4gICAgICAgIC8vIHVuaXF1ZSBlZGl0b3IgaWQgKG9wdGlvbmFsISlcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZCB8fCBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gY2YuIGFkZCgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfdG9vbHNEZWZhdWx0ID0ge1xuICAgICAgICAgICAgc2NhbGUgOiB0cnVlLFxuICAgICAgICAgICAgZWRpdGlvbiA6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29scyA9IF90b29sc0RlZmF1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy5tZXJnZVBhcmFtcyh0aGlzLm9wdGlvbnMudG9vbHMsIF90b29sc0RlZmF1bHQsIGZhbHNlKTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5vYmopIHtcbiAgICAgICAgICAgIC8vIGNob2l4IGQnYXZvaXIgdW4gb2JqZXQgdmlkZSBwb3VyIHVuZSBlZGl0aW9uIGZ1dHVyLi4uXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub2JqID0ge1xuICAgICAgICAgICAgICAgIHBhaW50IDoge30sXG4gICAgICAgICAgICAgICAgbGF5b3V0IDoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gXCJKU09OIFN0eWxlcyA6XCI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVRhcmdldFwiLFxuICAgICAgICAgICAgY29udGFpbmVyIDogXCJHUEVkaXRvck1hcEJveFN0eWxlQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJqc29uIDogXCJHUEVkaXRvck1hcEJveFN0eWxlSnNvbkNvbnRhaW5lclwiLFxuICAgICAgICAgICAganNvbmxhYmVsIDogXCJHUEVkaXRvck1hcEJveFN0eWxlSnNvblRpdGxlXCIsXG4gICAgICAgICAgICBqc29uZGlzcGxheSA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZUpzb25EaXNwbGF5XCIsXG4gICAgICAgICAgICBjb250YWluZXJ0b29sc3NjYWxlIDogXCJHUEVkaXRvck1hcEJveFN0eWxlVG9vbHNTY2FsZUNvbnRhaW5lclwiLFxuICAgICAgICAgICAgc2NhbGV0aXRsZSA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVNjYWxlVGl0bGVcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzbWluc2NhbGUgOiBcIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc1NjYWxlTWluQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBzY2FsZWxhYmVsbWluIDogXCJHUEVkaXRvck1hcEJveFN0eWxlU2NhbGVMYWJlbE1pblwiLFxuICAgICAgICAgICAgc2NhbGVpbnB1dG1pbiA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVNjYWxlSW5wdXRNaW5cIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzbWF4c2NhbGUgOiBcIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc1NjYWxlTWF4Q29udGFpbmVyXCIsXG4gICAgICAgICAgICBzY2FsZWxhYmVsbWF4IDogXCJHUEVkaXRvck1hcEJveFN0eWxlU2NhbGVMYWJlbE1heFwiLFxuICAgICAgICAgICAgc2NhbGVpbnB1dG1heCA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVNjYWxlSW5wdXRNYXhcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzZWRpdCA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVRvb2xzRWRpdGlvbkNvbnRhaW5lclwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JhcGhpY2FsIHJlbmRlcmluZyBvZiB0aGUgY29tcG9uZW50XG4gICAgICogaWUuIHRoaXMuY29udGFpbmVyXG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hTdHlsZUNvbnRhaW5lclwiPlxuICAgICAqICAgPGRpdiBjbGFzcyA9XCJHUEVkaXRvck1hcEJveFN0eWxlSnNvbkNvbnRhaW5lclwiPlxuICAgICAqICAgICAgPGxhYmVsIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hTdHlsZUpzb25UaXRsZVwiPkpTT04gU3R5bGVzIDo8L2xhYmVsPlxuICAgICAqICAgICAgPHByZSBjbGFzcz1cIkdQRWRpdG9yTWFwQm94U3R5bGVKc29uRGlzcGxheVwiPi4uLjwvcHJlPlxuICAgICAqICAgPC9kaXY+XG4gICAgICogICA8ZGl2IGNsYXNzID1cIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc1NjYWxlQ29udGFpbmVyXCI+PC9kaXY+XG4gICAgICogICA8ZGl2IGNsYXNzID1cIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc0VkaXRpb25Db250YWluZXJcIj48L2Rpdj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIC8vIGNvbnRleHRlXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB2YXIgX2ZvdW5kID0gZmFsc2U7XG4gICAgICAgIHZhciBfb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMub2JqKSk7IC8vIG9uIG1hbmlwdWxlIHVuZSBjb3BpZSAgIVxuICAgICAgICB2YXIgX3N0eWxlID0ge307XG5cbiAgICAgICAgLy8gc3R5bGVzIGludG8gdGFnICdwYWludCcgP1xuICAgICAgICBpZiAoX29iai5wYWludCkge1xuICAgICAgICAgICAgX2ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIF9zdHlsZS5wYWludCA9IF9vYmoucGFpbnQ7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX29iai5wYWludCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ0YWcgJ3BhaW50JyBpcyBlbXB0eSAhXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm90LCBzZWFyY2ggaW50byB0YWcgJ2xheW91dCcgIVxuICAgICAgICBpZiAoX29iai5sYXlvdXQpIHtcbiAgICAgICAgICAgIF9mb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBfc3R5bGUubGF5b3V0ID0gX29iai5sYXlvdXQ7XG4gICAgICAgICAgICAvLyBGSVhNRSBkZWxldGUgdmlzaWJpbGl0eSBmcm9tIGRpc3BsYXkgP1xuICAgICAgICAgICAgaWYgKF9vYmoubGF5b3V0LnZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgX3N0eWxlLnZpc2liaWxpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX29iai5sYXlvdXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwidGFnICdsYXlvdXQnIGlzIGVtcHR5ICFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXI7XG5cbiAgICAgICAgdmFyIGpzb24gPSBudWxsO1xuICAgICAgICBpZiAoX2ZvdW5kKSB7XG4gICAgICAgICAgICB2YXIgc3RySnNvbiA9IEpTT04uc3RyaW5naWZ5KF9zdHlsZSwgbnVsbCwgNCk7XG4gICAgICAgICAgICBqc29uID0gdGhpcy5fc3ludGF4SGlnaGxpZ2h0KHN0ckpzb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpdkpzb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZKc29uLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJqc29uO1xuXG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmpzb25sYWJlbDtcbiAgICAgICAgbGFiZWwuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnRpdGxlO1xuICAgICAgICBkaXZKc29uLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgICAgICB2YXIgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgcHJlLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5qc29uZGlzcGxheTtcbiAgICAgICAgcHJlLmlubmVySFRNTCA9IGpzb247XG4gICAgICAgIGlmIChwcmUuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgcHJlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRWRpdEpzb25TdHlsZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmUuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgIHByZS5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvb2xzLmVkaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkVkaXRKc29uU3R5bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2SnNvbi5hcHBlbmRDaGlsZChwcmUpO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGl2SnNvbik7XG5cbiAgICAgICAgLy8gc2NhbGVcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5zY2FsZSkge1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRUb29sc1NjYWxlKHtcbiAgICAgICAgICAgICAgICBtaW4gOiAoX3N0eWxlLmxheW91dCkgPyBfc3R5bGUubGF5b3V0Lm1pbnpvb20gOiAwLFxuICAgICAgICAgICAgICAgIG1heCA6IChfc3R5bGUubGF5b3V0KSA/IF9zdHlsZS5sYXlvdXQubWF4em9vbSA6IDIxXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPIG1lbnUgZCdlZGl0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRUb29sc0VkaXRpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWluIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRpdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBzY2FsZSB0b29sc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNjYWxlIC0ge21pbixtYXh9IG9yIDB8MjFcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIDxkaXYgY2xhc3MgPVwiR1BFZGl0b3JNYXBCb3hTdHlsZVRvb2xzU2NhbGVDb250YWluZXJcIj48L2Rpdj5cbiAgICAgKi9cbiAgICBfY3JlYXRlRWxlbWVudFRvb2xzU2NhbGUgKHNjYWxlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIl9jcmVhdGVFbGVtZW50VG9vbHNTY2FsZVwiKTtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9iaiA9IHRoaXMub3B0aW9ucy5vYmo7XG5cbiAgICAgICAgdmFyIGRpdlRvb2xzU2NhbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZUb29sc1NjYWxlLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0b29sc3NjYWxlO1xuXG4gICAgICAgIC8vIEZJWE1FIFRpdHJlID9cbiAgICAgICAgLy8gdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAvLyBsYWJlbC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuc2NhbGV0aXRsZTtcbiAgICAgICAgLy8gbGFiZWwuaW5uZXJIVE1MID0gXCJTY2FsZSA6XCI7XG4gICAgICAgIC8vIGRpdlRvb2xzU2NhbGUuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgICAgICB2YXIgZGl2TWluID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2TWluLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0b29sc21pbnNjYWxlO1xuXG4gICAgICAgIHZhciBsYWJlbE1pbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWxNaW4uY2xhc3NOYW1lID0gdGhpcy5uYW1lLnNjYWxlbGFiZWxtaW47XG4gICAgICAgIGxhYmVsTWluLmlubmVySFRNTCA9IFwibWluIDpcIjtcbiAgICAgICAgZGl2TWluLmFwcGVuZENoaWxkKGxhYmVsTWluKTtcblxuICAgICAgICB2YXIgaW5wdXRNaW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGlucHV0TWluLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5zY2FsZWlucHV0bWluO1xuICAgICAgICBpbnB1dE1pbi50eXBlID0gXCJyYW5nZVwiO1xuICAgICAgICBpbnB1dE1pbi52YWx1ZSA9IHNjYWxlLm1pbiB8fCAwO1xuICAgICAgICBpbnB1dE1pbi50aXRsZSA9IHNjYWxlLm1pbiB8fCAwO1xuICAgICAgICBpbnB1dE1pbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBpbnB1dE1pbi5taW4gPSAwO1xuICAgICAgICBpbnB1dE1pbi5tYXggPSAyMTtcbiAgICAgICAgaW5wdXRNaW4uZGF0YSA9IG9iajsgLy8gb24gbGllIGxlIERPTSBldCBsYSBjb3VjaGUsIHV0aWxlIGxvcnMgZCdldmVuZW1lbnQgIVxuICAgICAgICBpZiAoaW5wdXRNaW4uYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgaW5wdXRNaW4uYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2VTdHlsZVNjYWxlTWluTWFwQm94KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRNaW4uYXBwZW5kQ2hpbGQpIHtcbiAgICAgICAgICAgIGlucHV0TWluLmFwcGVuZENoaWxkKFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlU3R5bGVTY2FsZU1pbk1hcEJveChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRpdk1pbi5hcHBlbmRDaGlsZChpbnB1dE1pbik7XG5cbiAgICAgICAgZGl2VG9vbHNTY2FsZS5hcHBlbmRDaGlsZChkaXZNaW4pO1xuXG4gICAgICAgIHZhciBkaXZNYXggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZNYXguY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRvb2xzbWF4c2NhbGU7XG5cbiAgICAgICAgdmFyIGxhYmVsTWF4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBsYWJlbE1heC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuc2NhbGVsYWJlbG1heDtcbiAgICAgICAgbGFiZWxNYXguaW5uZXJIVE1MID0gXCJtYXggOlwiO1xuICAgICAgICBkaXZNYXguYXBwZW5kQ2hpbGQobGFiZWxNYXgpO1xuXG4gICAgICAgIHZhciBpbnB1dE1heCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXRNYXguY2xhc3NOYW1lID0gdGhpcy5uYW1lLnNjYWxlaW5wdXRtaW47XG4gICAgICAgIGlucHV0TWF4LnR5cGUgPSBcInJhbmdlXCI7XG4gICAgICAgIGlucHV0TWF4LnZhbHVlID0gc2NhbGUubWF4IHx8IDIxO1xuICAgICAgICBpbnB1dE1heC50aXRsZSA9IHNjYWxlLm1heCB8fCAyMTtcbiAgICAgICAgaW5wdXRNYXguZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaW5wdXRNYXgubWluID0gMDtcbiAgICAgICAgaW5wdXRNYXgubWF4ID0gMjE7XG4gICAgICAgIGlucHV0TWF4LmRhdGEgPSBvYmo7IC8vIG9uIGxpZSBsZSBET00gZXQgbGEgY291Y2hlLCB1dGlsZSBsb3JzIGQnZXZlbmVtZW50ICFcbiAgICAgICAgaWYgKGlucHV0TWF4LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlucHV0TWF4LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlU3R5bGVTY2FsZU1heE1hcEJveChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0TWF4LmFwcGVuZENoaWxkKSB7XG4gICAgICAgICAgICBpbnB1dE1heC5hcHBlbmRDaGlsZChcIm9uY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVN0eWxlU2NhbGVNYXhNYXBCb3goZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkaXZNYXguYXBwZW5kQ2hpbGQoaW5wdXRNYXgpO1xuXG4gICAgICAgIGRpdlRvb2xzU2NhbGUuYXBwZW5kQ2hpbGQoZGl2TWF4KTtcblxuICAgICAgICByZXR1cm4gZGl2VG9vbHNTY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBlZGl0aW9uIHRvb2xzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIDxkaXYgY2xhc3MgPVwiR1BFZGl0b3JNYXBCb3hTdHlsZVRvb2xzU2NhbGVDb250YWluZXJcIj48L2Rpdj5cbiAgICAgKi9cbiAgICBfY3JlYXRlRWxlbWVudFRvb2xzRWRpdGlvbiAoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiX2NyZWF0ZUVsZW1lbnRUb29sc0VkaXRpb24sIGl0J3Mgbm90IHlldCBpbXBsZW1lbnRlZCAhXCIpO1xuXG4gICAgICAgIHZhciBkaXZUb29sc0VkaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZUb29sc0VkaXQuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRvb2xzZWRpdDtcblxuICAgICAgICByZXR1cm4gZGl2VG9vbHNFZGl0O1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHJpdmF0ZSBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBhIEpTT04gaW50byBhIERPTSB3aXRoIGEgc3ludGF4IGluIGNvbG9yXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0ganNvbi5cbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gZG9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBfc3ludGF4SGlnaGxpZ2h0IChqc29uKSB7XG4gICAgICAgIGpzb24gPSBqc29uLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKTtcbiAgICAgICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvKFwiKFxcXFx1W2EtekEtWjAtOV17NH18XFxcXFtedV18W15cXFxcXCJdKSpcIihcXHMqOik/fFxcYih0cnVlfGZhbHNlfG51bGwpXFxifC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPykvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICB2YXIgY2xzID0gXCJncC1qc29uLW51bWJlclwiO1xuICAgICAgICAgICAgaWYgKC9eXCIvLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKC86JC8udGVzdChtYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xzID0gXCJncC1qc29uLWtleVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNscyA9IFwiZ3AtanNvbi1zdHJpbmdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC90cnVlfGZhbHNlLy50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgICAgICAgIGNscyA9IFwiZ3AtanNvbi1ib29sZWFuXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9udWxsLy50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgICAgICAgIGNscyA9IFwiZ3AtanNvbi1udWxsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz0nXCIgKyBjbHMgKyBcIic+XCIgKyBtYXRjaCArIFwiPC9zcGFuPlwiO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiBBZGQgZWxlbWVudCBpbnRvIHRhcmdldCBET01cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIExlZ2VuZCBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdi5pZCA9IHRoaXMubmFtZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGlzcGxheSBjb250YWluZXIgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzaG93L2hpZGRlbiBjb250YWluZXIgb3IgZ2V0IHN0YXR1c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICBkaXNwbGF5IChkaXNwbGF5KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcImRpc3BsYXkoKVwiLCBkaXNwbGF5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwbGF5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkpID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09IFwiZmxleFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIChET00pXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGhhbmRsZXJzIGV2ZW50cyB0byBkb20gIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgU3R5bGUjZWRpdG9yOnN0eWxlOm9uZWRpdGpzb25cbiAgICAgKi9cbiAgICBvbkVkaXRKc29uU3R5bGVNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25FZGl0SnNvblN0eWxlTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5zdHlsZS5vbmVkaXRqc29uLCBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBTdHlsZSNlZGl0b3I6c3R5bGU6c2NhbGU6b25jaGFuZ2VtaW5cbiAgICAgKi9cbiAgICBvbkNoYW5nZVN0eWxlU2NhbGVNaW5NYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DaGFuZ2VTdHlsZVNjYWxlTWluTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5zdHlsZS5zY2FsZS5vbmNoYW5nZW1pbiwgZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgU3R5bGUjZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWF4XG4gICAgICovXG4gICAgb25DaGFuZ2VTdHlsZVNjYWxlTWF4TWFwQm94IChlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIm9uQ2hhbmdlU3R5bGVTY2FsZU1heE1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3Iuc3R5bGUuc2NhbGUub25jaGFuZ2VtYXgsIGUpO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3R5bGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Style.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"editor-style\");\n\n/**\n * @classdesc\n *\n * MapBox styles management\n *\n * @constructor\n * @alias ol.style.editor.Style\n * @param {Object} options - options for function call.\n * @example\n * var style = new Style ({\n * target : ...,\n * position : 1, // identifiant de position (unique !)\n * tools : {\n * edition : false,\n * scale : true\n * },\n * title : \"Styles (JSON)\",\n * obj : {\n * paint : {},\n * layout : {}\n * }\n * });\n * style.add();\n * style.display(true);\n * style.getContainer();\n */\nvar Style = /*#__PURE__*/function () {\n function Style(options) {\n _classCallCheck(this, Style);\n logger.trace(\"[constructor] Style\", options);\n\n // options\n this.options = options || {\n // default...\n target: null,\n position: 0,\n tools: null,\n title: null,\n obj: null\n };\n if (!(this instanceof Style)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Style, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n if (!this.options.position) {\n this.options.position = 0;\n }\n var _toolsDefault = {\n scale: true,\n edition: false\n };\n if (!this.options.tools) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (!this.options.obj) {\n // choix d'avoir un objet vide pour une edition futur...\n this.options.obj = {\n paint: {},\n layout: {}\n };\n }\n if (!this.options.title) {\n this.options.title = \"JSON Styles :\";\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxStyleTarget\",\n container: \"GPEditorMapBoxStyleContainer\",\n containerjson: \"GPEditorMapBoxStyleJsonContainer\",\n jsonlabel: \"GPEditorMapBoxStyleJsonTitle\",\n jsondisplay: \"GPEditorMapBoxStyleJsonDisplay\",\n containertoolsscale: \"GPEditorMapBoxStyleToolsScaleContainer\",\n scaletitle: \"GPEditorMapBoxStyleScaleTitle\",\n containertoolsminscale: \"GPEditorMapBoxStyleToolsScaleMinContainer\",\n scalelabelmin: \"GPEditorMapBoxStyleScaleLabelMin\",\n scaleinputmin: \"GPEditorMapBoxStyleScaleInputMin\",\n containertoolsmaxscale: \"GPEditorMapBoxStyleToolsScaleMaxContainer\",\n scalelabelmax: \"GPEditorMapBoxStyleScaleLabelMax\",\n scaleinputmax: \"GPEditorMapBoxStyleScaleInputMax\",\n containertoolsedit: \"GPEditorMapBoxStyleToolsEditionContainer\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * ie. this.container\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n * \n *
...
\n *
\n *
\n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var _found = false;\n var _obj = JSON.parse(JSON.stringify(this.options.obj)); // on manipule une copie !\n var _style = {};\n\n // styles into tag 'paint' ?\n if (_obj.paint) {\n _found = true;\n _style.paint = _obj.paint;\n if (Object.keys(_obj.paint).length === 0) {\n logger.info(\"tag 'paint' is empty !\");\n }\n }\n\n // if not, search into tag 'layout' !\n if (_obj.layout) {\n _found = true;\n _style.layout = _obj.layout;\n // FIXME delete visibility from display ?\n if (_obj.layout.visibility) {\n delete _style.visibility;\n }\n if (Object.keys(_obj.layout).length === 0) {\n logger.info(\"tag 'layout' is empty !\");\n }\n }\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n var json = null;\n if (_found) {\n var strJson = JSON.stringify(_style, null, 4);\n json = this._syntaxHighlight(strJson);\n }\n var divJson = document.createElement(\"div\");\n divJson.className = this.name.containerjson;\n var label = document.createElement(\"label\");\n label.className = this.name.jsonlabel;\n label.innerHTML = this.options.title;\n divJson.appendChild(label);\n var pre = document.createElement(\"pre\");\n pre.className = this.name.jsondisplay;\n pre.innerHTML = json;\n if (pre.addEventListener) {\n pre.addEventListener(\"click\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonStyleMapBox(e);\n }\n });\n } else if (pre.attachEvent) {\n pre.attachEvent(\"onclick\", function (e) {\n if (self.options.tools.edition) {\n self.onEditJsonStyleMapBox(e);\n }\n });\n }\n divJson.appendChild(pre);\n div.appendChild(divJson);\n\n // scale\n if (this.options.tools.scale) {\n div.appendChild(this._createElementToolsScale({\n min: _style.layout ? _style.layout.minzoom : 0,\n max: _style.layout ? _style.layout.maxzoom : 21\n }));\n }\n\n // TODO menu d'edition\n if (this.options.tools.edition) {\n div.appendChild(this._createElementToolsEdition());\n }\n\n // main container\n this.container = div;\n }\n\n /**\n * Graphical rendering of the scale tools\n *\n * @param {Object} scale - {min,max} or 0|21\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n */\n }, {\n key: \"_createElementToolsScale\",\n value: function _createElementToolsScale(scale) {\n logger.trace(\"_createElementToolsScale\");\n var self = this;\n var obj = this.options.obj;\n var divToolsScale = document.createElement(\"div\");\n divToolsScale.className = this.name.containertoolsscale;\n\n // FIXME Titre ?\n // var label = document.createElement(\"label\");\n // label.className = this.name.scaletitle;\n // label.innerHTML = \"Scale :\";\n // divToolsScale.appendChild(label);\n var divMin = document.createElement(\"div\");\n divMin.className = this.name.containertoolsminscale;\n var labelMin = document.createElement(\"label\");\n labelMin.className = this.name.scalelabelmin;\n labelMin.innerHTML = \"min :\";\n divMin.appendChild(labelMin);\n var inputMin = document.createElement(\"input\");\n inputMin.className = this.name.scaleinputmin;\n inputMin.type = \"range\";\n inputMin.value = scale.min || 0;\n inputMin.title = scale.min || 0;\n inputMin.disabled = false;\n inputMin.min = 0;\n inputMin.max = 21;\n inputMin.data = obj; // on lie le DOM et la couche, utile lors d'evenement !\n if (inputMin.addEventListener) {\n inputMin.addEventListener(\"change\", function (e) {\n self.onChangeStyleScaleMinMapBox(e);\n });\n } else if (inputMin.appendChild) {\n inputMin.appendChild(\"onchange\", function (e) {\n self.onChangeStyleScaleMinMapBox(e);\n });\n }\n divMin.appendChild(inputMin);\n divToolsScale.appendChild(divMin);\n var divMax = document.createElement(\"div\");\n divMax.className = this.name.containertoolsmaxscale;\n var labelMax = document.createElement(\"label\");\n labelMax.className = this.name.scalelabelmax;\n labelMax.innerHTML = \"max :\";\n divMax.appendChild(labelMax);\n var inputMax = document.createElement(\"input\");\n inputMax.className = this.name.scaleinputmin;\n inputMax.type = \"range\";\n inputMax.value = scale.max || 21;\n inputMax.title = scale.max || 21;\n inputMax.disabled = false;\n inputMax.min = 0;\n inputMax.max = 21;\n inputMax.data = obj; // on lie le DOM et la couche, utile lors d'evenement !\n if (inputMax.addEventListener) {\n inputMax.addEventListener(\"change\", function (e) {\n self.onChangeStyleScaleMaxMapBox(e);\n });\n } else if (inputMax.appendChild) {\n inputMax.appendChild(\"onchange\", function (e) {\n self.onChangeStyleScaleMaxMapBox(e);\n });\n }\n divMax.appendChild(inputMax);\n divToolsScale.appendChild(divMax);\n return divToolsScale;\n }\n\n /**\n * Graphical rendering of the edition tools\n *\n * @returns {DOMElement} DOM element\n *\n * @private\n * @example\n *
\n */\n }, {\n key: \"_createElementToolsEdition\",\n value: function _createElementToolsEdition() {\n logger.warn(\"_createElementToolsEdition, it's not yet implemented !\");\n var divToolsEdit = document.createElement(\"div\");\n divToolsEdit.className = this.name.containertoolsedit;\n return divToolsEdit;\n }\n\n // ################################################################### //\n // ##################### private methods ############################# //\n // ################################################################### //\n /**\n * Transform a JSON into a DOM with a syntax in color\n *\n * @private\n * @param {Object} json - json.\n * @returns {DOMElement} dom element\n */\n }, {\n key: \"_syntaxHighlight\",\n value: function _syntaxHighlight(json) {\n json = json.replace(/&/g, \"&\").replace(//g, \">\");\n return json.replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/g, function (match) {\n var cls = \"gp-json-number\";\n if (/^\"/.test(match)) {\n if (/:$/.test(match)) {\n cls = \"gp-json-key\";\n } else {\n cls = \"gp-json-string\";\n }\n } else if (/true|false/.test(match)) {\n cls = \"gp-json-boolean\";\n } else if (/null/.test(match)) {\n cls = \"gp-json-null\";\n }\n return \"\" + match + \"\";\n });\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Style#editor:style:oneditjson\n */\n }, {\n key: \"onEditJsonStyleMapBox\",\n value: function onEditJsonStyleMapBox(e) {\n logger.trace(\"onEditJsonStyleMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].style.oneditjson, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Style#editor:style:scale:onchangemin\n */\n }, {\n key: \"onChangeStyleScaleMinMapBox\",\n value: function onChangeStyleScaleMinMapBox(e) {\n logger.trace(\"onChangeStyleScaleMinMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].style.scale.onchangemin, e);\n }\n\n /**\n * this method is called by event '' on '' tag form...\n *\n * 'e' contains the option object into 'e.target.data' !\n * 'e' contains the id editor into 'e.target.editorID' !\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Style#editor:style:scale:onchangemax\n */\n }, {\n key: \"onChangeStyleScaleMaxMapBox\",\n value: function onChangeStyleScaleMaxMapBox(e) {\n logger.trace(\"onChangeStyleScaleMaxMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].style.scale.onchangemax, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Style);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9TdHlsZS5qcz84Zjc3Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIlN0eWxlIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInRyYWNlIiwidGFyZ2V0IiwicG9zaXRpb24iLCJ0b29scyIsInRpdGxlIiwib2JqIiwiVHlwZUVycm9yIiwiX2luaXRpYWxpemUiLCJfaW5pdENvbnRhaW5lciIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiaWQiLCJfdG9vbHNEZWZhdWx0Iiwic2NhbGUiLCJlZGl0aW9uIiwiVXRpbHMiLCJtZXJnZVBhcmFtcyIsInBhaW50IiwibGF5b3V0IiwiY29udGFpbmVyIiwibmFtZSIsImNvbnRhaW5lcmpzb24iLCJqc29ubGFiZWwiLCJqc29uZGlzcGxheSIsImNvbnRhaW5lcnRvb2xzc2NhbGUiLCJzY2FsZXRpdGxlIiwiY29udGFpbmVydG9vbHNtaW5zY2FsZSIsInNjYWxlbGFiZWxtaW4iLCJzY2FsZWlucHV0bWluIiwiY29udGFpbmVydG9vbHNtYXhzY2FsZSIsInNjYWxlbGFiZWxtYXgiLCJzY2FsZWlucHV0bWF4IiwiY29udGFpbmVydG9vbHNlZGl0Iiwic2VsZiIsIl9mb3VuZCIsIl9vYmoiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJfc3R5bGUiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiaW5mbyIsInZpc2liaWxpdHkiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJqc29uIiwic3RySnNvbiIsIl9zeW50YXhIaWdobGlnaHQiLCJkaXZKc29uIiwibGFiZWwiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInByZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwib25FZGl0SnNvblN0eWxlTWFwQm94IiwiYXR0YWNoRXZlbnQiLCJfY3JlYXRlRWxlbWVudFRvb2xzU2NhbGUiLCJtaW4iLCJtaW56b29tIiwibWF4IiwibWF4em9vbSIsIl9jcmVhdGVFbGVtZW50VG9vbHNFZGl0aW9uIiwiZGl2VG9vbHNTY2FsZSIsImRpdk1pbiIsImxhYmVsTWluIiwiaW5wdXRNaW4iLCJ0eXBlIiwiZGlzYWJsZWQiLCJkYXRhIiwib25DaGFuZ2VTdHlsZVNjYWxlTWluTWFwQm94IiwiZGl2TWF4IiwibGFiZWxNYXgiLCJpbnB1dE1heCIsIm9uQ2hhbmdlU3R5bGVTY2FsZU1heE1hcEJveCIsIndhcm4iLCJkaXZUb29sc0VkaXQiLCJyZXBsYWNlIiwibWF0Y2giLCJjbHMiLCJ0ZXN0IiwiYWRkIiwiZ2V0RWxlbWVudEJ5SWQiLCJub2RlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJkaXNwbGF5Iiwic3R5bGUiLCJnZXRDb250YWluZXIiLCJlZGl0b3JJRCIsIkV2ZW50QnVzIiwiZGlzcGF0Y2giLCJFdmVudEVkaXRvciIsIm9uZWRpdGpzb24iLCJvbmNoYW5nZW1pbiIsIm9uY2hhbmdlbWF4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBa0M7QUFDQTtBQUNRO0FBQ2lCO0FBRTNELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGNBQWMsQ0FBQzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpCQSxJQTBCTUMsS0FBSztFQUVQLFNBQUFBLE1BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLEtBQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHFCQUFxQixFQUFFRixPQUFPLENBQUM7O0lBRTVDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtNQUNBRyxNQUFNLEVB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QUM1RSxPQUFPO01BQ3JCaUcsaURBQVEsQ0FBQ0MsUUFBUSxDQUFDQyw4Q0FBVyxDQUFDTCxLQUFLLENBQUM5RSxLQUFLLENBQUNzRixXQUFXLEVBQUV6QyxDQUFDLENBQUM7SUFDN0Q7RUFBQztBQUFBO0FBRUo7QUFFYzlELG9FQUFLIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRWRpdG9yL1N0eWxlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vLi4vQ29tbW9uL1V0aWxzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLXN0eWxlXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBNYXBCb3ggc3R5bGVzIG1hbmFnZW1lbnRcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBvbC5zdHlsZS5lZGl0b3IuU3R5bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEBleGFtcGxlXG4gKiAgIHZhciBzdHlsZSA9IG5ldyBTdHlsZSAoe1xuICogICAgICB0YXJnZXQgOiAuLi4sXG4gKiAgICAgIHBvc2l0aW9uIDogMSwgLy8gaWRlbnRpZmlhbnQgZGUgcG9zaXRpb24gKHVuaXF1ZSAhKVxuICogICAgICB0b29scyA6IHtcbiAqICAgICAgICAgIGVkaXRpb24gOiBmYWxzZSxcbiAqICAgICAgICAgIHNjYWxlIDogdHJ1ZVxuICogICAgICB9LFxuICogICAgICB0aXRsZSA6IFwiU3R5bGVzIChKU09OKVwiLFxuICogICAgICBvYmogOiB7XG4gKiAgICAgICAgICBwYWludCA6IHt9LFxuICogICAgICAgICAgbGF5b3V0IDoge31cbiAqICAgICAgfVxuICogICB9KTtcbiAqICBzdHlsZS5hZGQoKTtcbiAqICBzdHlsZS5kaXNwbGF5KHRydWUpO1xuICogIHN0eWxlLmdldENvbnRhaW5lcigpO1xuICovXG5jbGFzcyBTdHlsZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIFN0eWxlXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0Li4uXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgcG9zaXRpb24gOiAwLFxuICAgICAgICAgICAgdG9vbHMgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGUgOiBudWxsLFxuICAgICAgICAgICAgb2JqIDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUlJPUiBDTEFTU19DT05TVFJVQ1RPUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUoKTtcblxuICAgICAgICB0aGlzLl9pbml0Q29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdGlhbGl6ZSAoKSB7XG4gICAgICAgIC8vIHVuaXF1ZSBlZGl0b3IgaWQgKG9wdGlvbmFsISlcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZCB8fCBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gY2YuIGFkZCgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfdG9vbHNEZWZhdWx0ID0ge1xuICAgICAgICAgICAgc2NhbGUgOiB0cnVlLFxuICAgICAgICAgICAgZWRpdGlvbiA6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29scyA9IF90b29sc0RlZmF1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy5tZXJnZVBhcmFtcyh0aGlzLm9wdGlvbnMudG9vbHMsIF90b29sc0RlZmF1bHQsIGZhbHNlKTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5vYmopIHtcbiAgICAgICAgICAgIC8vIGNob2l4IGQnYXZvaXIgdW4gb2JqZXQgdmlkZSBwb3VyIHVuZSBlZGl0aW9uIGZ1dHVyLi4uXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub2JqID0ge1xuICAgICAgICAgICAgICAgIHBhaW50IDoge30sXG4gICAgICAgICAgICAgICAgbGF5b3V0IDoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gXCJKU09OIFN0eWxlcyA6XCI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gRE9NIDogY2xhc3NOYW1lIG9yIGlkXG4gICAgICAgIHRoaXMubmFtZSA9IHtcbiAgICAgICAgICAgIHRhcmdldCA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVRhcmdldFwiLFxuICAgICAgICAgICAgY29udGFpbmVyIDogXCJHUEVkaXRvck1hcEJveFN0eWxlQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJqc29uIDogXCJHUEVkaXRvck1hcEJveFN0eWxlSnNvbkNvbnRhaW5lclwiLFxuICAgICAgICAgICAganNvbmxhYmVsIDogXCJHUEVkaXRvck1hcEJveFN0eWxlSnNvblRpdGxlXCIsXG4gICAgICAgICAgICBqc29uZGlzcGxheSA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZUpzb25EaXNwbGF5XCIsXG4gICAgICAgICAgICBjb250YWluZXJ0b29sc3NjYWxlIDogXCJHUEVkaXRvck1hcEJveFN0eWxlVG9vbHNTY2FsZUNvbnRhaW5lclwiLFxuICAgICAgICAgICAgc2NhbGV0aXRsZSA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVNjYWxlVGl0bGVcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzbWluc2NhbGUgOiBcIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc1NjYWxlTWluQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBzY2FsZWxhYmVsbWluIDogXCJHUEVkaXRvck1hcEJveFN0eWxlU2NhbGVMYWJlbE1pblwiLFxuICAgICAgICAgICAgc2NhbGVpbnB1dG1pbiA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVNjYWxlSW5wdXRNaW5cIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzbWF4c2NhbGUgOiBcIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc1NjYWxlTWF4Q29udGFpbmVyXCIsXG4gICAgICAgICAgICBzY2FsZWxhYmVsbWF4IDogXCJHUEVkaXRvck1hcEJveFN0eWxlU2NhbGVMYWJlbE1heFwiLFxuICAgICAgICAgICAgc2NhbGVpbnB1dG1heCA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVNjYWxlSW5wdXRNYXhcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRvb2xzZWRpdCA6IFwiR1BFZGl0b3JNYXBCb3hTdHlsZVRvb2xzRWRpdGlvbkNvbnRhaW5lclwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JhcGhpY2FsIHJlbmRlcmluZyBvZiB0aGUgY29tcG9uZW50XG4gICAgICogaWUuIHRoaXMuY29udGFpbmVyXG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8ZGl2IGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hTdHlsZUNvbnRhaW5lclwiPlxuICAgICAqICAgPGRpdiBjbGFzcyA9XCJHUEVkaXRvck1hcEJveFN0eWxlSnNvbkNvbnRhaW5lclwiPlxuICAgICAqICAgICAgPGxhYmVsIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hTdHlsZUpzb25UaXRsZVwiPkpTT04gU3R5bGVzIDo8L2xhYmVsPlxuICAgICAqICAgICAgPHByZSBjbGFzcz1cIkdQRWRpdG9yTWFwQm94U3R5bGVKc29uRGlzcGxheVwiPi4uLjwvcHJlPlxuICAgICAqICAgPC9kaXY+XG4gICAgICogICA8ZGl2IGNsYXNzID1cIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc1NjYWxlQ29udGFpbmVyXCI+PC9kaXY+XG4gICAgICogICA8ZGl2IGNsYXNzID1cIkdQRWRpdG9yTWFwQm94U3R5bGVUb29sc0VkaXRpb25Db250YWluZXJcIj48L2Rpdj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKi9cbiAgICBfaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIC8vIGNvbnRleHRlXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB2YXIgX2ZvdW5kID0gZmFsc2U7XG4gICAgICAgIHZhciBfb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMub2JqKSk7IC8vIG9uIG1hbmlwdWxlIHVuZSBjb3BpZSAgIVxuICAgICAgICB2YXIgX3N0eWxlID0ge307XG5cbiAgICAgICAgLy8gc3R5bGVzIGludG8gdGFnICdwYWludCcgP1xuICAgICAgICBpZiAoX29iai5wYWludCkge1xuICAgICAgICAgICAgX2ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIF9zdHlsZS5wYWludCA9IF9vYmoucGFpbnQ7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX29iai5wYWludCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ0YWcgJ3BhaW50JyBpcyBlbXB0eSAhXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm90LCBzZWFyY2ggaW50byB0YWcgJ2xheW91dCcgIVxuICAgICAgICBpZiAoX29iai5sYXlvdXQpIHtcbiAgICAgICAgICAgIF9mb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBfc3R5bGUubGF5b3V0ID0gX29iai5sYXlvdXQ7XG4gICAgICAgICAgICAvLyBGSVhNRSBkZWxldGUgdmlzaWJpbGl0eSBmcm9tIGRpc3BsYXkgP1xuICAgICAgICAgICAgaWYgKF9vYmoubGF5b3V0LnZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgX3N0eWxlLnZpc2liaWxpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX29iai5sYXlvdXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwidGFnICdsYXlvdXQnIGlzIGVtcHR5ICFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXI7XG5cbiAgICAgICAgdmFyIGpzb24gPSBudWxsO1xuICAgICAgICBpZiAoX2ZvdW5kKSB7XG4gICAgICAgICAgICB2YXIgc3RySnNvbiA9IEpTT04uc3RyaW5naWZ5KF9zdHlsZSwgbnVsbCwgNCk7XG4gICAgICAgICAgICBqc29uID0gdGhpcy5fc3ludGF4SGlnaGxpZ2h0KHN0ckpzb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpdkpzb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZKc29uLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJqc29uO1xuXG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmpzb25sYWJlbDtcbiAgICAgICAgbGFiZWwuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnRpdGxlO1xuICAgICAgICBkaXZKc29uLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgICAgICB2YXIgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgcHJlLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5qc29uZGlzcGxheTtcbiAgICAgICAgcHJlLmlubmVySFRNTCA9IGpzb247XG4gICAgICAgIGlmIChwcmUuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgcHJlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRWRpdEpzb25TdHlsZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmUuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgIHByZS5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvb2xzLmVkaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkVkaXRKc29uU3R5bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2SnNvbi5hcHBlbmRDaGlsZChwcmUpO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGl2SnNvbik7XG5cbiAgICAgICAgLy8gc2NhbGVcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5zY2FsZSkge1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRUb29sc1NjYWxlKHtcbiAgICAgICAgICAgICAgICBtaW4gOiAoX3N0eWxlLmxheW91dCkgPyBfc3R5bGUubGF5b3V0Lm1pbnpvb20gOiAwLFxuICAgICAgICAgICAgICAgIG1heCA6IChfc3R5bGUubGF5b3V0KSA/IF9zdHlsZS5sYXlvdXQubWF4em9vbSA6IDIxXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPIG1lbnUgZCdlZGl0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuZWRpdGlvbikge1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUVsZW1lbnRUb29sc0VkaXRpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWluIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRpdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBzY2FsZSB0b29sc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNjYWxlIC0ge21pbixtYXh9IG9yIDB8MjFcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIDxkaXYgY2xhc3MgPVwiR1BFZGl0b3JNYXBCb3hTdHlsZVRvb2xzU2NhbGVDb250YWluZXJcIj48L2Rpdj5cbiAgICAgKi9cbiAgICBfY3JlYXRlRWxlbWVudFRvb2xzU2NhbGUgKHNjYWxlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIl9jcmVhdGVFbGVtZW50VG9vbHNTY2FsZVwiKTtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9iaiA9IHRoaXMub3B0aW9ucy5vYmo7XG5cbiAgICAgICAgdmFyIGRpdlRvb2xzU2NhbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZUb29sc1NjYWxlLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0b29sc3NjYWxlO1xuXG4gICAgICAgIC8vIEZJWE1FIFRpdHJlID9cbiAgICAgICAgLy8gdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAvLyBsYWJlbC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuc2NhbGV0aXRsZTtcbiAgICAgICAgLy8gbGFiZWwuaW5uZXJIVE1MID0gXCJTY2FsZSA6XCI7XG4gICAgICAgIC8vIGRpdlRvb2xzU2NhbGUuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgICAgICB2YXIgZGl2TWluID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2TWluLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXJ0b29sc21pbnNjYWxlO1xuXG4gICAgICAgIHZhciBsYWJlbE1pbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWxNaW4uY2xhc3NOYW1lID0gdGhpcy5uYW1lLnNjYWxlbGFiZWxtaW47XG4gICAgICAgIGxhYmVsTWluLmlubmVySFRNTCA9IFwibWluIDpcIjtcbiAgICAgICAgZGl2TWluLmFwcGVuZENoaWxkKGxhYmVsTWluKTtcblxuICAgICAgICB2YXIgaW5wdXRNaW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGlucHV0TWluLmNsYXNzTmFtZSA9IHRoaXMubmFtZS5zY2FsZWlucHV0bWluO1xuICAgICAgICBpbnB1dE1pbi50eXBlID0gXCJyYW5nZVwiO1xuICAgICAgICBpbnB1dE1pbi52YWx1ZSA9IHNjYWxlLm1pbiB8fCAwO1xuICAgICAgICBpbnB1dE1pbi50aXRsZSA9IHNjYWxlLm1pbiB8fCAwO1xuICAgICAgICBpbnB1dE1pbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBpbnB1dE1pbi5taW4gPSAwO1xuICAgICAgICBpbnB1dE1pbi5tYXggPSAyMTtcbiAgICAgICAgaW5wdXRNaW4uZGF0YSA9IG9iajsgLy8gb24gbGllIGxlIERPTSBldCBsYSBjb3VjaGUsIHV0aWxlIGxvcnMgZCdldmVuZW1lbnQgIVxuICAgICAgICBpZiAoaW5wdXRNaW4uYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgaW5wdXRNaW4uYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2VTdHlsZVNjYWxlTWluTWFwQm94KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRNaW4uYXBwZW5kQ2hpbGQpIHtcbiAgICAgICAgICAgIGlucHV0TWluLmFwcGVuZENoaWxkKFwib25jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlU3R5bGVTY2FsZU1pbk1hcEJveChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRpdk1pbi5hcHBlbmRDaGlsZChpbnB1dE1pbik7XG5cbiAgICAgICAgZGl2VG9vbHNTY2FsZS5hcHBlbmRDaGlsZChkaXZNaW4pO1xuXG4gICAgICAgIHZhciBkaXZNYXggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZNYXguY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRvb2xzbWF4c2NhbGU7XG5cbiAgICAgICAgdmFyIGxhYmVsTWF4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBsYWJlbE1heC5jbGFzc05hbWUgPSB0aGlzLm5hbWUuc2NhbGVsYWJlbG1heDtcbiAgICAgICAgbGFiZWxNYXguaW5uZXJIVE1MID0gXCJtYXggOlwiO1xuICAgICAgICBkaXZNYXguYXBwZW5kQ2hpbGQobGFiZWxNYXgpO1xuXG4gICAgICAgIHZhciBpbnB1dE1heCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXRNYXguY2xhc3NOYW1lID0gdGhpcy5uYW1lLnNjYWxlaW5wdXRtaW47XG4gICAgICAgIGlucHV0TWF4LnR5cGUgPSBcInJhbmdlXCI7XG4gICAgICAgIGlucHV0TWF4LnZhbHVlID0gc2NhbGUubWF4IHx8IDIxO1xuICAgICAgICBpbnB1dE1heC50aXRsZSA9IHNjYWxlLm1heCB8fCAyMTtcbiAgICAgICAgaW5wdXRNYXguZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaW5wdXRNYXgubWluID0gMDtcbiAgICAgICAgaW5wdXRNYXgubWF4ID0gMjE7XG4gICAgICAgIGlucHV0TWF4LmRhdGEgPSBvYmo7IC8vIG9uIGxpZSBsZSBET00gZXQgbGEgY291Y2hlLCB1dGlsZSBsb3JzIGQnZXZlbmVtZW50ICFcbiAgICAgICAgaWYgKGlucHV0TWF4LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlucHV0TWF4LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlU3R5bGVTY2FsZU1heE1hcEJveChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0TWF4LmFwcGVuZENoaWxkKSB7XG4gICAgICAgICAgICBpbnB1dE1heC5hcHBlbmRDaGlsZChcIm9uY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZVN0eWxlU2NhbGVNYXhNYXBCb3goZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkaXZNYXguYXBwZW5kQ2hpbGQoaW5wdXRNYXgpO1xuXG4gICAgICAgIGRpdlRvb2xzU2NhbGUuYXBwZW5kQ2hpbGQoZGl2TWF4KTtcblxuICAgICAgICByZXR1cm4gZGl2VG9vbHNTY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFwaGljYWwgcmVuZGVyaW5nIG9mIHRoZSBlZGl0aW9uIHRvb2xzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIDxkaXYgY2xhc3MgPVwiR1BFZGl0b3JNYXBCb3hTdHlsZVRvb2xzU2NhbGVDb250YWluZXJcIj48L2Rpdj5cbiAgICAgKi9cbiAgICBfY3JlYXRlRWxlbWVudFRvb2xzRWRpdGlvbiAoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiX2NyZWF0ZUVsZW1lbnRUb29sc0VkaXRpb24sIGl0J3Mgbm90IHlldCBpbXBsZW1lbnRlZCAhXCIpO1xuXG4gICAgICAgIHZhciBkaXZUb29sc0VkaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXZUb29sc0VkaXQuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRvb2xzZWRpdDtcblxuICAgICAgICByZXR1cm4gZGl2VG9vbHNFZGl0O1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHJpdmF0ZSBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBhIEpTT04gaW50byBhIERPTSB3aXRoIGEgc3ludGF4IGluIGNvbG9yXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0ganNvbi5cbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gZG9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBfc3ludGF4SGlnaGxpZ2h0IChqc29uKSB7XG4gICAgICAgIGpzb24gPSBqc29uLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKTtcbiAgICAgICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvKFwiKFxcXFx1W2EtekEtWjAtOV17NH18XFxcXFtedV18W15cXFxcXCJdKSpcIihcXHMqOik/fFxcYih0cnVlfGZhbHNlfG51bGwpXFxifC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPykvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICB2YXIgY2xzID0gXCJncC1qc29uLW51bWJlclwiO1xuICAgICAgICAgICAgaWYgKC9eXCIvLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKC86JC8udGVzdChtYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xzID0gXCJncC1qc29uLWtleVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNscyA9IFwiZ3AtanNvbi1zdHJpbmdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC90cnVlfGZhbHNlLy50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgICAgICAgIGNscyA9IFwiZ3AtanNvbi1ib29sZWFuXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9udWxsLy50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgICAgICAgIGNscyA9IFwiZ3AtanNvbi1udWxsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz0nXCIgKyBjbHMgKyBcIic+XCIgKyBtYXRjaCArIFwiPC9zcGFuPlwiO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvKipcbiAgICAgKiBBZGQgZWxlbWVudCBpbnRvIHRhcmdldCBET01cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIExlZ2VuZCBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5hbWUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdi5pZCA9IHRoaXMubmFtZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGlzcGxheSBjb250YWluZXIgb3IgZ2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc3BsYXkgLSBzaG93L2hpZGRlbiBjb250YWluZXIgb3IgZ2V0IHN0YXR1c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUvZmFsc2VcbiAgICAgKi9cbiAgICBkaXNwbGF5IChkaXNwbGF5KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcImRpc3BsYXkoKVwiLCBkaXNwbGF5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwbGF5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkpID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09IFwiZmxleFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29udGFpbmVyIChET00pXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGhhbmRsZXJzIGV2ZW50cyB0byBkb20gIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgU3R5bGUjZWRpdG9yOnN0eWxlOm9uZWRpdGpzb25cbiAgICAgKi9cbiAgICBvbkVkaXRKc29uU3R5bGVNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25FZGl0SnNvblN0eWxlTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5zdHlsZS5vbmVkaXRqc29uLCBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJycgb24gJycgdGFnIGZvcm0uLi5cbiAgICAgKlxuICAgICAqICdlJyBjb250YWlucyB0aGUgb3B0aW9uIG9iamVjdCBpbnRvICdlLnRhcmdldC5kYXRhJyAhXG4gICAgICogJ2UnIGNvbnRhaW5zIHRoZSBpZCBlZGl0b3IgaW50byAnZS50YXJnZXQuZWRpdG9ySUQnICFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBmaXJlcyBTdHlsZSNlZGl0b3I6c3R5bGU6c2NhbGU6b25jaGFuZ2VtaW5cbiAgICAgKi9cbiAgICBvbkNoYW5nZVN0eWxlU2NhbGVNaW5NYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DaGFuZ2VTdHlsZVNjYWxlTWluTWFwQm94XCIsIGUpO1xuICAgICAgICBlLmVkaXRvcklEID0gdGhpcy5pZDtcbiAgICAgICAgZS5kYXRhID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci5zdHlsZS5zY2FsZS5vbmNoYW5nZW1pbiwgZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICcnIG9uICcnIHRhZyBmb3JtLi4uXG4gICAgICpcbiAgICAgKiAnZScgY29udGFpbnMgdGhlIG9wdGlvbiBvYmplY3QgaW50byAnZS50YXJnZXQuZGF0YScgIVxuICAgICAqICdlJyBjb250YWlucyB0aGUgaWQgZWRpdG9yIGludG8gJ2UudGFyZ2V0LmVkaXRvcklEJyAhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZmlyZXMgU3R5bGUjZWRpdG9yOnN0eWxlOnNjYWxlOm9uY2hhbmdlbWF4XG4gICAgICovXG4gICAgb25DaGFuZ2VTdHlsZVNjYWxlTWF4TWFwQm94IChlKSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcIm9uQ2hhbmdlU3R5bGVTY2FsZU1heE1hcEJveFwiLCBlKTtcbiAgICAgICAgZS5lZGl0b3JJRCA9IHRoaXMuaWQ7XG4gICAgICAgIGUuZGF0YSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgRXZlbnRCdXMuZGlzcGF0Y2goRXZlbnRFZGl0b3Iuc3R5bGUuc2NhbGUub25jaGFuZ2VtYXgsIGUpO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3R5bGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Style.js\n"); /***/ }), @@ -2441,7 +2441,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var even /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLogger(\"editor-themes\");\n\n/**\n * @classdesc\n *\n * Mapbox Themes management\n *\n * @constructor\n * @alias ol.style.editor.Theme\n * @param {Object} options - options for function call.\n * @example\n * var theme = new Themes ({\n * \"target\": \"\",\n * \"tools\": {\n * \"thumbnails\": true,\n * \"button\" : {\n * \"visible\" : true,\n * \"type\" : \"radio\" (par defaut) | \"checkbox\"\n * }\n * },\n * \"obj\": {\n * \"themesSummary\": \"\", // Titre du composant (non graphique !)\n * \"themes\": [{\n * \"thumbnail\": \"data/images/layer0.png\",\n * \"name\": \"standard0\",\n * \"url\": \"data/styles/layer0.json\",\n * \"description\": \"\",\n * \"selected\" : true\n * },{\n * \"thumbnail\": \"data/images/layer1.png\",\n * \"name\": \"standard1\",\n * \"url\": \"data/styles/layer1.json\",\n * \"description\": \"\"\n * }]\n * }\n * });\n * theme.add();\n * theme.display(true);\n * theme.getContainer();\n */\nvar Themes = /*#__PURE__*/function () {\n function Themes(options) {\n _classCallCheck(this, Themes);\n logger.trace(\"[constructor] Themes\", options);\n\n // options\n this.options = options || {\n // TODO default...\n };\n if (!(this instanceof Themes)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Themes, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n var _toolsDefault = {\n thumbnails: true,\n button: {\n visible: true,\n type: \"radio\"\n }\n };\n if (!this.options.tools || Object.keys(this.options.tools).length === 0) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (typeof this.options.obj === \"undefined\" || this.options.obj === null || !this.options.obj) {\n // vide par defaut ?\n this.options.obj = {\n themesSummary: \"\",\n themes: []\n };\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxThemeTarget\",\n container: \"GPEditorMapBoxThemesContainer\",\n containertheme: \"GPEditorMapBoxThemeContainer\",\n containerthemeID: \"GPEditorMapBoxThemeContainer_ID_\",\n input: \"GPEditorMapBoxThemeInput\",\n inputID: \"GPEditorMapBoxThemeInput_ID_\",\n label: \"GPEditorMapBoxThemeTitle\",\n labelID: \"GPEditorMapBoxThemeTitle_ID_\",\n image: \"GPEditorMapBoxThemeImage\",\n imageID: \"GPEditorMapBoxThemeImage_ID_\",\n message: \"GPEditorMapBoxThemeMessage\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n * \n * \"Description1\"\n * \n *
\n *
\n * \n * \"Description2\"\n * \n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var obj = this.options.obj;\n var id = this.id || _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__[\"default\"].generate();\n\n // div principale\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n div.title = obj.themesSummary || \"\";\n var _lstThemes = obj.themes;\n if (_lstThemes) {\n for (var i = 0; i < _lstThemes.length; i++) {\n var _theme = _lstThemes[i];\n\n // div pour chaque theme\n var divTheme = document.createElement(\"div\");\n divTheme.id = this.name.containerthemeID + i + \"_\" + id;\n divTheme.className = this.name.containertheme;\n divTheme.tabIndex = i;\n\n // url du style est obligatoire !\n var _url = _theme.url;\n // style selectionné par defaut (uniquement en mode radio-button !?)\n var _selected = _theme.selected || false;\n if (_url) {\n // bouton\n var button = this.options.tools.button;\n if (button.visible) {\n var _type = button.type === \"checkbox\" ? \"checkbox\" : \"radio\";\n var _button = document.createElement(\"input\");\n _button.type = _type;\n _button.id = this.name.inputID + i + \"_\" + id;\n _button.className = this.name.input;\n _button.name = id;\n _button.checked = _selected;\n _button.data = _url; // on lie le DOM et la couche, utile lors d'evenement !\n if (_button.addEventListener) {\n _button.addEventListener(\"click\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n } else if (_button.attachEvent) {\n _button.attachEvent(\"onclick\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n }\n divTheme.appendChild(_button);\n }\n // vignette\n if (this.options.tools.thumbnails) {\n if (_theme.thumbnail) {\n var _img = document.createElement(\"img\");\n _img.id = this.name.imageID + i + \"_\" + id;\n _img.className = this.name.image;\n _img.src = _theme.thumbnail;\n _img.alt = _theme.thumbnail;\n _img.title = _theme.description || \"\"; // une description au survol de l'image ou titre...\n _img.data = _url; // on lie le DOM et la couche, utile lors d'evenement !\n if (_img.addEventListener) {\n _img.addEventListener(\"click\", function (e) {\n self.onClickThemeImageMapBox(e);\n // maj du radio button\n var nodes = e.target.parentElement.childNodes;\n if (nodes) {\n var node = nodes[0];\n if (node.tagName.toLowerCase() === \"input\") {\n node.checked = !node.checked;\n }\n }\n });\n } else if (_img.attachEvent) {\n _img.attachEvent(\"onclick\", function (e) {\n self.onClickThemeImageMapBox(e);\n var nodes = e.target.parentElement.childNodes;\n if (nodes) {\n var node = nodes[0];\n if (node.tagName.toLowerCase() === \"input\") {\n node.checked = !node.checked;\n }\n }\n });\n }\n divTheme.appendChild(_img);\n }\n }\n // label\n if (_theme.name) {\n var _label = document.createElement(\"label\");\n _label.id = this.name.labelID + i + \"_\" + id;\n if (this.options.tools.button.visible) {\n _label.htmlFor = _button.id;\n }\n _label.className = this.name.label;\n _label.innerHTML = _theme.name;\n _label.title = _theme.description || \"\"; // une description au survol de l'image ou titre...\n _label.data = _url; // on lie le DOM et la couche, utile lors d'evenement !\n if (!this.options.tools.button.visible) {\n if (_label.addEventListener) {\n _label.addEventListener(\"click\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n } else if (_label.attachEvent) {\n _label.attachEvent(\"onclick\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n }\n }\n divTheme.appendChild(_label);\n }\n } else {\n var _msg = document.createElement(\"label\");\n _msg.className = this.name.message;\n _msg.innerHTML = \"Thème non disponible...\";\n divTheme.appendChild(_msg);\n }\n div.appendChild(divTheme);\n }\n }\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Themes#editor:themes:image\n */\n }, {\n key: \"onClickThemeImageMapBox\",\n value: function onClickThemeImageMapBox(e) {\n logger.trace(\"onClickThemeImageMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n if (this.options.tools.button.type === \"checkbox\") {\n // GPEditorMapBoxThemeInput_ID_0_1571317605868\n var targetIDX = e.target.previousSibling.id.substring(e.target.previousSibling.id.lastIndexOf(\"_\") + 1);\n var _inputs = document.getElementsByClassName(this.name.input);\n for (var i = 0; i < _inputs.length; i++) {\n var el = _inputs[i];\n if (el.id === e.target.previousSibling.id) {\n continue;\n }\n var elIDX = el.id.substring(el.id.lastIndexOf(\"_\") + 1);\n if (elIDX !== targetIDX) {\n continue;\n }\n el.checked = false;\n }\n }\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].themes.onclickimage, e);\n }\n\n /**\n * this method is called by event '' on '' tag form\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Themes#editor:themes:title\n */\n }, {\n key: \"onClickThemeTitleMapBox\",\n value: function onClickThemeTitleMapBox(e) {\n logger.trace(\"onClickThemeTitleMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n if (this.options.tools.button.type === \"checkbox\") {\n // GPEditorMapBoxThemeInput_ID_0_1571317605868\n var targetIDX = e.target.id.substring(e.target.id.lastIndexOf(\"_\") + 1);\n var _inputs = document.getElementsByClassName(this.name.input);\n for (var i = 0; i < _inputs.length; i++) {\n var el = _inputs[i];\n if (el.id === e.target.id) {\n continue;\n }\n var elIDX = el.id.substring(el.id.lastIndexOf(\"_\") + 1);\n if (elIDX !== targetIDX) {\n continue;\n }\n el.checked = false;\n }\n }\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].themes.onclicktitle, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Themes);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9UaGVtZXMuanM/Y2JmZCJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJUaGVtZXMiLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJUeXBlRXJyb3IiLCJfaW5pdGlhbGl6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJpZCIsInRhcmdldCIsIl90b29sc0RlZmF1bHQiLCJ0aHVtYm5haWxzIiwiYnV0dG9uIiwidmlzaWJsZSIsInR5cGUiLCJ0b29scyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJVdGlscyIsIm1lcmdlUGFyYW1zIiwib2JqIiwidGhlbWVzU3VtbWFyeSIsInRoZW1lcyIsImNvbnRhaW5lciIsIm5hbWUiLCJjb250YWluZXJ0aGVtZSIsImNvbnRhaW5lcnRoZW1lSUQiLCJpbnB1dCIsImlucHV0SUQiLCJsYWJlbCIsImxhYmVsSUQiLCJpbWFnZSIsImltYWdlSUQiLCJtZXNzYWdlIiwic2VsZiIsIklEIiwiZ2VuZXJhdGUiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0aXRsZSIsIl9sc3RUaGVtZXMiLCJpIiwiX3RoZW1lIiwiZGl2VGhlbWUiLCJ0YWJJbmRleCIsIl91cmwiLCJ1cmwiLCJfc2VsZWN0ZWQiLCJzZWxlY3RlZCIsIl90eXBlIiwiX2J1dHRvbiIsImNoZWNrZWQiLCJkYXRhIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJvbkNsaWNrVGhlbWVUaXRsZU1hcEJveCIsImF0dGFjaEV2ZW50IiwiYXBwZW5kQ2hpbGQiLCJ0aHVtYm5haWwiLCJfaW1nIiwic3JjIiwiYWx0IiwiZGVzY3JpcHRpb24iLCJvbkNsaWNrVGhlbWVJbWFnZU1hcEJveCIsIm5vZGVzIiwicGFyZW50RWxlbWVudCIsImNoaWxkTm9kZXMiLCJub2RlIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiX2xhYmVsIiwiaHRtbEZvciIsImlubmVySFRNTCIsIl9tc2ciLCJhZGQiLCJnZXRFbGVtZW50QnlJZCIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGlzcGxheSIsInN0eWxlIiwiZ2V0Q29udGFpbmVyIiwiZWRpdG9ySUQiLCJ0YXJnZXRJRFgiLCJwcmV2aW91c1NpYmxpbmciLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsIl9pbnB1dHMiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiZWwiLCJlbElEWCIsIkV2ZW50QnVzIiwiZGlzcGF0Y2giLCJFdmVudEVkaXRvciIsIm9uY2xpY2tpbWFnZSIsIm9uY2xpY2t0aXRsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ1E7QUFDUTtBQUNTO0FBRTNELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGVBQWUsQ0FBQzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJDQSxJQXNDTUMsTUFBTTtFQUVSLFNBQUFBLE9BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLE1BQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHNCQUFzQixFQUFFRixPQUFPLENBQUM7O0lBRTdDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtJQUFBLENBQ0g7SUFFRCxJQUFJLEVBQUUsSUFBSSxZQUFZRCxNQUFNLENBQUMsRUFBRTtNQUMzQixNQUFNLElBQUlJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FB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VyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUN2RCxJQUFJSSxLQUFLLEtBQUtQLFNBQVMsRUFBRTtZQUNyQjtVQUNKO1VBQ0FNLEVBQUUsQ0FBQ3JDLE9BQU8sR0FBRyxLQUFLO1FBQ3RCO01BQ0o7TUFDQXVDLGlEQUFRLENBQUNDLFFBQVEsQ0FBQ0MsOENBQVcsQ0FBQ3hFLE1BQU0sQ0FBQzBFLFlBQVksRUFBRXhDLENBQUMsQ0FBQztJQUN6RDtFQUFDO0FBQUE7QUFFSjtBQUVjM0QscUVBQU0iLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9Db250cm9scy9FZGl0b3IvVGhlbWVzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vLi4vQ29tbW9uL1V0aWxzXCI7XG5pbXBvcnQgSUQgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9TZWxlY3RvcklEXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLXRoZW1lc1wiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogTWFwYm94IFRoZW1lcyBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLlRoZW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogICB2YXIgdGhlbWUgPSBuZXcgVGhlbWVzICh7XG4gKiAgICAgICAgXCJ0YXJnZXRcIjogXCJcIixcbiAqICAgICAgICBcInRvb2xzXCI6IHtcbiAqICAgICAgICAgIFwidGh1bWJuYWlsc1wiOiB0cnVlLFxuICogICAgICAgICAgXCJidXR0b25cIiA6IHtcbiAqICAgICAgICAgICAgICBcInZpc2libGVcIiA6IHRydWUsXG4gKiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJhZGlvXCIgKHBhciBkZWZhdXQpIHwgXCJjaGVja2JveFwiXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfSxcbiAqICAgICAgICBcIm9ialwiOiB7XG4gKiAgICAgICAgICBcInRoZW1lc1N1bW1hcnlcIjogXCJcIiwgLy8gVGl0cmUgZHUgY29tcG9zYW50IChub24gZ3JhcGhpcXVlICEpXG4gKiAgICAgICAgICBcInRoZW1lc1wiOiBbe1xuICogICAgICAgICAgICAgXCJ0aHVtYm5haWxcIjogXCJkYXRhL2ltYWdlcy9sYXllcjAucG5nXCIsXG4gKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFuZGFyZDBcIixcbiAqICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS9zdHlsZXMvbGF5ZXIwLmpzb25cIixcbiAqICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAqICAgICAgICAgICAgIFwic2VsZWN0ZWRcIiA6IHRydWVcbiAqICAgICAgICAgIH0se1xuICogICAgICAgICAgICAgXCJ0aHVtYm5haWxcIjogXCJkYXRhL2ltYWdlcy9sYXllcjEucG5nXCIsXG4gKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFuZGFyZDFcIixcbiAqICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS9zdHlsZXMvbGF5ZXIxLmpzb25cIixcbiAqICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxuICogICAgICAgICAgfV1cbiAqICAgICAgICB9XG4gKiAgIH0pO1xuICogIHRoZW1lLmFkZCgpO1xuICogIHRoZW1lLmRpc3BsYXkodHJ1ZSk7XG4gKiAgdGhlbWUuZ2V0Q29udGFpbmVyKCk7XG4gKi9cbmNsYXNzIFRoZW1lcyB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIFRoZW1lc1wiLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgLy8gVE9ETyBkZWZhdWx0Li4uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRoZW1lcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUlJPUiBDTEFTU19DT05TVFJVQ1RPUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUoKTtcblxuICAgICAgICB0aGlzLl9pbml0Q29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdGlhbGl6ZSAoKSB7XG4gICAgICAgIC8vIHVuaXF1ZSBlZGl0b3IgaWQgKG9wdGlvbmFsISlcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZCB8fCBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gY2YuIGFkZCgpXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3Rvb2xzRGVmYXVsdCA9IHtcbiAgICAgICAgICAgIHRodW1ibmFpbHMgOiB0cnVlLFxuICAgICAgICAgICAgYnV0dG9uIDoge1xuICAgICAgICAgICAgICAgIHZpc2libGUgOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGUgOiBcInJhZGlvXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29scyB8fCBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMudG9vbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xzID0gX3Rvb2xzRGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucy50b29scywgX3Rvb2xzRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLm9iaiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9iaiA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgIXRoaXMub3B0aW9ucy5vYmopIHtcbiAgICAgICAgICAgIC8vIHZpZGUgcGFyIGRlZmF1dCA/XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub2JqID0ge1xuICAgICAgICAgICAgICAgIHRoZW1lc1N1bW1hcnkgOiBcIlwiLFxuICAgICAgICAgICAgICAgIHRoZW1lcyA6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIERPTSA6IGNsYXNzTmFtZSBvciBpZFxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVUYXJnZXRcIixcbiAgICAgICAgICAgIGNvbnRhaW5lciA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZXNDb250YWluZXJcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRoZW1lIDogXCJHUEVkaXRvck1hcEJveFRoZW1lQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJ0aGVtZUlEIDogXCJHUEVkaXRvck1hcEJveFRoZW1lQ29udGFpbmVyX0lEX1wiLFxuICAgICAgICAgICAgaW5wdXQgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVJbnB1dFwiLFxuICAgICAgICAgICAgaW5wdXRJRCA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZUlucHV0X0lEX1wiLFxuICAgICAgICAgICAgbGFiZWwgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVUaXRsZVwiLFxuICAgICAgICAgICAgbGFiZWxJRCA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZVRpdGxlX0lEX1wiLFxuICAgICAgICAgICAgaW1hZ2UgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVJbWFnZVwiLFxuICAgICAgICAgICAgaW1hZ2VJRCA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZUltYWdlX0lEX1wiLFxuICAgICAgICAgICAgbWVzc2FnZSA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZU1lc3NhZ2VcIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyYXBoaWNhbCByZW5kZXJpbmcgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lc0NvbnRhaW5lclwiPlxuICAgICAqICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVDb250YWluZXItMVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZUNvbnRhaW5lclwiPlxuICAgICAqICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVJbnB1dC0xXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXRcIiBuYW1lPVwiMTU1MjkyMDE3NjkzM1wiPlxuICAgICAqICAgICAgICAgIDxpbWcgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW1hZ2VcIiBzcmM9XCJodHRwOi8vaW1hZ2UxLnBuZ1wiIGFsdD1cIkRlc2NyaXB0aW9uMVwiPjwvaW1nPlxuICAgICAqICAgICAgICAgIDxsYWJlbCBmb3I9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXQtMVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZVRpdGxlXCI+VGl0cmUxPC9sYWJlbD5cbiAgICAgKiAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVDb250YWluZXItMlwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZUNvbnRhaW5lclwiPlxuICAgICAqICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVJbnB1dC0yXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXRcIiBuYW1lPVwiMTU1MjkyMDE3NjkzNFwiPlxuICAgICAqICAgICAgICAgIDxpbWcgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW1hZ2VcIiBzcmM9XCJodHRwOi8vaW1hZ2UyLnBuZ1wiIGFsdD1cIkRlc2NyaXB0aW9uMlwiPjwvaW1nPlxuICAgICAqICAgICAgICAgIDxsYWJlbCBmb3I9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXQtMlwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZVRpdGxlXCI+VGl0cmUyPC9sYWJlbD5cbiAgICAgKiAgICAgIDwvZGl2PlxuICAgICAqIDwvZGl2PlxuICAgICAqL1xuICAgIF9pbml0Q29udGFpbmVyICgpIHtcbiAgICAgICAgLy8gY29udGV4dGVcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBvYmogPSB0aGlzLm9wdGlvbnMub2JqO1xuXG4gICAgICAgIHZhciBpZCA9IHRoaXMuaWQgfHwgSUQuZ2VuZXJhdGUoKTtcblxuICAgICAgICAvLyBkaXYgcHJpbmNpcGFsZVxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXI7XG4gICAgICAgIGRpdi50aXRsZSA9IG9iai50aGVtZXNTdW1tYXJ5IHx8IFwiXCI7XG5cbiAgICAgICAgdmFyIF9sc3RUaGVtZXMgPSBvYmoudGhlbWVzO1xuICAgICAgICBpZiAoX2xzdFRoZW1lcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbHN0VGhlbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF90aGVtZSA9IF9sc3RUaGVtZXNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBkaXYgcG91ciBjaGFxdWUgdGhlbWVcbiAgICAgICAgICAgICAgICB2YXIgZGl2VGhlbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdlRoZW1lLmlkID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRoZW1lSUQgKyBpICsgXCJfXCIgKyBpZDtcbiAgICAgICAgICAgICAgICBkaXZUaGVtZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVydGhlbWU7XG4gICAgICAgICAgICAgICAgZGl2VGhlbWUudGFiSW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgLy8gdXJsIGR1IHN0eWxlIGVzdCBvYmxpZ2F0b2lyZSAhXG4gICAgICAgICAgICAgICAgdmFyIF91cmwgPSBfdGhlbWUudXJsO1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlIHNlbGVjdGlvbm7DqSBwYXIgZGVmYXV0ICh1bmlxdWVtZW50IGVuIG1vZGUgcmFkaW8tYnV0dG9uICE/KVxuICAgICAgICAgICAgICAgIHZhciBfc2VsZWN0ZWQgPSBfdGhlbWUuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKF91cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYm91dG9uXG4gICAgICAgICAgICAgICAgICAgIHZhciBidXR0b24gPSB0aGlzLm9wdGlvbnMudG9vbHMuYnV0dG9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IChidXR0b24udHlwZSA9PT0gXCJjaGVja2JveFwiKSA/IFwiY2hlY2tib3hcIiA6IFwicmFkaW9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2J1dHRvbi50eXBlID0gX3R5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYnV0dG9uLmlkID0gdGhpcy5uYW1lLmlucHV0SUQgKyBpICsgXCJfXCIgKyBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9idXR0b24uY2xhc3NOYW1lID0gdGhpcy5uYW1lLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2J1dHRvbi5uYW1lID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYnV0dG9uLmNoZWNrZWQgPSBfc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYnV0dG9uLmRhdGEgPSBfdXJsOyAvLyBvbiBsaWUgbGUgRE9NIGV0IGxhIGNvdWNoZSwgdXRpbGUgbG9ycyBkJ2V2ZW5lbWVudCAhXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrVGhlbWVUaXRsZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2J1dHRvbi5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idXR0b24uYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja1RoZW1lVGl0bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXZUaGVtZS5hcHBlbmRDaGlsZChfYnV0dG9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB2aWduZXR0ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLnRodW1ibmFpbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhlbWUudGh1bWJuYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9pbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbWcuaWQgPSB0aGlzLm5hbWUuaW1hZ2VJRCArIGkgKyBcIl9cIiArIGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbWcuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbWcuc3JjID0gX3RoZW1lLnRodW1ibmFpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmFsdCA9IF90aGVtZS50aHVtYm5haWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ltZy50aXRsZSA9IF90aGVtZS5kZXNjcmlwdGlvbiB8fCBcIlwiOyAvLyB1bmUgZGVzY3JpcHRpb24gYXUgc3Vydm9sIGRlIGwnaW1hZ2Ugb3UgdGl0cmUuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmRhdGEgPSBfdXJsOyAvLyBvbiBsaWUgbGUgRE9NIGV0IGxhIGNvdWNoZSwgdXRpbGUgbG9ycyBkJ2V2ZW5lbWVudCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbWcuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrVGhlbWVJbWFnZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1haiBkdSByYWRpbyBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGVja2VkID0gIW5vZGUuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2ltZy5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmF0dGFjaEV2ZW50KFwib25jbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrVGhlbWVJbWFnZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGVja2VkID0gIW5vZGUuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZUaGVtZS5hcHBlbmRDaGlsZChfaW1nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbFxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoZW1lLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwuaWQgPSB0aGlzLm5hbWUubGFiZWxJRCArIGkgKyBcIl9cIiArIGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5idXR0b24udmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5odG1sRm9yID0gX2J1dHRvbi5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5jbGFzc05hbWUgPSB0aGlzLm5hbWUubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwuaW5uZXJIVE1MID0gX3RoZW1lLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwudGl0bGUgPSBfdGhlbWUuZGVzY3JpcHRpb24gfHwgXCJcIjsgLy8gdW5lIGRlc2NyaXB0aW9uIGF1IHN1cnZvbCBkZSBsJ2ltYWdlIG91IHRpdHJlLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwuZGF0YSA9IF91cmw7IC8vIG9uIGxpZSBsZSBET00gZXQgbGEgY291Y2hlLCB1dGlsZSBsb3JzIGQnZXZlbmVtZW50ICFcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzLmJ1dHRvbi52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9sYWJlbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja1RoZW1lVGl0bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xhYmVsLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja1RoZW1lVGl0bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdlRoZW1lLmFwcGVuZENoaWxkKF9sYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX21zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgX21zZy5jbGFzc05hbWUgPSB0aGlzLm5hbWUubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgX21zZy5pbm5lckhUTUwgPSBcIlRow6htZSBub24gZGlzcG9uaWJsZS4uLlwiO1xuICAgICAgICAgICAgICAgICAgICBkaXZUaGVtZS5hcHBlbmRDaGlsZChfbXNnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGl2VGhlbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQWRkIGVsZW1lbnQgaW50byB0YXJnZXQgRE9NXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBMZWdlbmQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGQgKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIG9yIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJkaXNwbGF5KClcIiwgZGlzcGxheSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiZmxleFwiIDogXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcImZsZXhcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgdG8gZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIFRoZW1lcyNlZGl0b3I6dGhlbWVzOmltYWdlXG4gICAgICovXG4gICAgb25DbGlja1RoZW1lSW1hZ2VNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DbGlja1RoZW1lSW1hZ2VNYXBCb3hcIiwgZSk7XG4gICAgICAgIGUuZWRpdG9ySUQgPSB0aGlzLmlkO1xuICAgICAgICBlLmRhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuYnV0dG9uLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgLy8gR1BFZGl0b3JNYXBCb3hUaGVtZUlucHV0X0lEXzBfMTU3MTMxNzYwNTg2OFxuICAgICAgICAgICAgdmFyIHRhcmdldElEWCA9IGUudGFyZ2V0LnByZXZpb3VzU2libGluZy5pZC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgZS50YXJnZXQucHJldmlvdXNTaWJsaW5nLmlkLmxhc3RJbmRleE9mKFwiX1wiKSArIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgX2lucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5uYW1lLmlucHV0KTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbCA9IF9pbnB1dHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVsLmlkID09PSBlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlbElEWCA9IGVsLmlkLnN1YnN0cmluZyhlbC5pZC5sYXN0SW5kZXhPZihcIl9cIikgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxJRFggIT09IHRhcmdldElEWCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWwuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50QnVzLmRpc3BhdGNoKEV2ZW50RWRpdG9yLnRoZW1lcy5vbmNsaWNraW1hZ2UsIGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIFRoZW1lcyNlZGl0b3I6dGhlbWVzOnRpdGxlXG4gICAgICovXG4gICAgb25DbGlja1RoZW1lVGl0bGVNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DbGlja1RoZW1lVGl0bGVNYXBCb3hcIiwgZSk7XG4gICAgICAgIGUuZWRpdG9ySUQgPSB0aGlzLmlkO1xuICAgICAgICBlLmRhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuYnV0dG9uLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgLy8gR1BFZGl0b3JNYXBCb3hUaGVtZUlucHV0X0lEXzBfMTU3MTMxNzYwNTg2OFxuICAgICAgICAgICAgdmFyIHRhcmdldElEWCA9IGUudGFyZ2V0LmlkLnN1YnN0cmluZyhlLnRhcmdldC5pZC5sYXN0SW5kZXhPZihcIl9cIikgKyAxKTtcbiAgICAgICAgICAgIHZhciBfaW5wdXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLm5hbWUuaW5wdXQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsID0gX2lucHV0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZWwuaWQgPT09IGUudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZWxJRFggPSBlbC5pZC5zdWJzdHJpbmcoZWwuaWQubGFzdEluZGV4T2YoXCJfXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGVsSURYICE9PSB0YXJnZXRJRFgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci50aGVtZXMub25jbGlja3RpdGxlLCBlKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRoZW1lcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Themes.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventbusjs */ \"./node_modules/eventbusjs/lib/eventbus.min.js-exposed\");\n/* harmony import */ var eventbusjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventbusjs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Event */ \"./src/OpenLayers/Controls/Editor/Event.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLogger(\"editor-themes\");\n\n/**\n * @classdesc\n *\n * Mapbox Themes management\n *\n * @constructor\n * @alias ol.style.editor.Theme\n * @param {Object} options - options for function call.\n * @example\n * var theme = new Themes ({\n * \"target\": \"\",\n * \"tools\": {\n * \"thumbnails\": true,\n * \"button\" : {\n * \"visible\" : true,\n * \"type\" : \"radio\" (par defaut) | \"checkbox\"\n * }\n * },\n * \"obj\": {\n * \"themesSummary\": \"\", // Titre du composant (non graphique !)\n * \"themes\": [{\n * \"thumbnail\": \"data/images/layer0.png\",\n * \"name\": \"standard0\",\n * \"url\": \"data/styles/layer0.json\",\n * \"description\": \"\",\n * \"selected\" : true\n * },{\n * \"thumbnail\": \"data/images/layer1.png\",\n * \"name\": \"standard1\",\n * \"url\": \"data/styles/layer1.json\",\n * \"description\": \"\"\n * }]\n * }\n * });\n * theme.add();\n * theme.display(true);\n * theme.getContainer();\n */\nvar Themes = /*#__PURE__*/function () {\n function Themes(options) {\n _classCallCheck(this, Themes);\n logger.trace(\"[constructor] Themes\", options);\n\n // options\n this.options = options || {\n // TODO default...\n };\n if (!(this instanceof Themes)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n this._initialize();\n this._initContainer();\n }\n\n /**\n * Initialize component\n * (called by constructor)\n *\n * @private\n */\n return _createClass(Themes, [{\n key: \"_initialize\",\n value: function _initialize() {\n // unique editor id (optional!)\n this.id = this.options.id || null;\n if (!this.options.target) {\n // cf. add()\n }\n var _toolsDefault = {\n thumbnails: true,\n button: {\n visible: true,\n type: \"radio\"\n }\n };\n if (!this.options.tools || Object.keys(this.options.tools).length === 0) {\n this.options.tools = _toolsDefault;\n }\n _Common_Utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].mergeParams(this.options.tools, _toolsDefault, false);\n if (typeof this.options.obj === \"undefined\" || this.options.obj === null || !this.options.obj) {\n // vide par defaut ?\n this.options.obj = {\n themesSummary: \"\",\n themes: []\n };\n }\n this.container = null;\n\n // DOM : className or id\n this.name = {\n target: \"GPEditorMapBoxThemeTarget\",\n container: \"GPEditorMapBoxThemesContainer\",\n containertheme: \"GPEditorMapBoxThemeContainer\",\n containerthemeID: \"GPEditorMapBoxThemeContainer_ID_\",\n input: \"GPEditorMapBoxThemeInput\",\n inputID: \"GPEditorMapBoxThemeInput_ID_\",\n label: \"GPEditorMapBoxThemeTitle\",\n labelID: \"GPEditorMapBoxThemeTitle_ID_\",\n image: \"GPEditorMapBoxThemeImage\",\n imageID: \"GPEditorMapBoxThemeImage_ID_\",\n message: \"GPEditorMapBoxThemeMessage\"\n };\n }\n\n /**\n * Graphical rendering of the component\n * (called by constructor)\n *\n * @private\n * @example\n *
\n *
\n * \n * \"Description1\"\n * \n *
\n *
\n * \n * \"Description2\"\n * \n *
\n *
\n */\n }, {\n key: \"_initContainer\",\n value: function _initContainer() {\n // contexte\n var self = this;\n var obj = this.options.obj;\n var id = this.id || _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__[\"default\"].generate();\n\n // div principale\n var div = document.createElement(\"div\");\n div.className = this.name.container;\n div.title = obj.themesSummary || \"\";\n var _lstThemes = obj.themes;\n if (_lstThemes) {\n for (var i = 0; i < _lstThemes.length; i++) {\n var _theme = _lstThemes[i];\n\n // div pour chaque theme\n var divTheme = document.createElement(\"div\");\n divTheme.id = this.name.containerthemeID + i + \"_\" + id;\n divTheme.className = this.name.containertheme;\n divTheme.tabIndex = i;\n\n // url du style est obligatoire !\n var _url = _theme.url;\n // style selectionné par defaut (uniquement en mode radio-button !?)\n var _selected = _theme.selected || false;\n if (_url) {\n // bouton\n var button = this.options.tools.button;\n if (button.visible) {\n var _type = button.type === \"checkbox\" ? \"checkbox\" : \"radio\";\n var _button = document.createElement(\"input\");\n _button.type = _type;\n _button.id = this.name.inputID + i + \"_\" + id;\n _button.className = this.name.input;\n _button.name = id;\n _button.checked = _selected;\n _button.data = _url; // on lie le DOM et la couche, utile lors d'evenement !\n if (_button.addEventListener) {\n _button.addEventListener(\"click\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n } else if (_button.attachEvent) {\n _button.attachEvent(\"onclick\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n }\n divTheme.appendChild(_button);\n }\n // vignette\n if (this.options.tools.thumbnails) {\n if (_theme.thumbnail) {\n var _img = document.createElement(\"img\");\n _img.id = this.name.imageID + i + \"_\" + id;\n _img.className = this.name.image;\n _img.src = _theme.thumbnail;\n _img.alt = _theme.thumbnail;\n _img.title = _theme.description || \"\"; // une description au survol de l'image ou titre...\n _img.data = _url; // on lie le DOM et la couche, utile lors d'evenement !\n if (_img.addEventListener) {\n _img.addEventListener(\"click\", function (e) {\n self.onClickThemeImageMapBox(e);\n // maj du radio button\n var nodes = e.target.parentElement.childNodes;\n if (nodes) {\n var node = nodes[0];\n if (node.tagName.toLowerCase() === \"input\") {\n node.checked = !node.checked;\n }\n }\n });\n } else if (_img.attachEvent) {\n _img.attachEvent(\"onclick\", function (e) {\n self.onClickThemeImageMapBox(e);\n var nodes = e.target.parentElement.childNodes;\n if (nodes) {\n var node = nodes[0];\n if (node.tagName.toLowerCase() === \"input\") {\n node.checked = !node.checked;\n }\n }\n });\n }\n divTheme.appendChild(_img);\n }\n }\n // label\n if (_theme.name) {\n var _label = document.createElement(\"label\");\n _label.id = this.name.labelID + i + \"_\" + id;\n if (this.options.tools.button.visible) {\n _label.htmlFor = _button.id;\n }\n _label.className = this.name.label;\n _label.innerHTML = _theme.name;\n _label.title = _theme.description || \"\"; // une description au survol de l'image ou titre...\n _label.data = _url; // on lie le DOM et la couche, utile lors d'evenement !\n if (!this.options.tools.button.visible) {\n if (_label.addEventListener) {\n _label.addEventListener(\"click\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n } else if (_label.attachEvent) {\n _label.attachEvent(\"onclick\", function (e) {\n self.onClickThemeTitleMapBox(e);\n });\n }\n }\n divTheme.appendChild(_label);\n }\n } else {\n var _msg = document.createElement(\"label\");\n _msg.className = this.name.message;\n _msg.innerHTML = \"Thème non disponible...\";\n divTheme.appendChild(_msg);\n }\n div.appendChild(divTheme);\n }\n }\n this.container = div;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n /**\n * Add element into target DOM\n * @returns {Object} - Legend instance\n */\n }, {\n key: \"add\",\n value: function add() {\n if (!this.options.target) {\n if (!document.getElementById(this.name.target)) {\n var div = document.createElement(\"div\");\n div.id = this.name.target;\n var node = document.documentElement || document.getElementsByTagName(\"body\")[0] || document.getElementsByTagName(\"head\")[0];\n node.appendChild(div);\n }\n this.options.target = document.getElementById(this.name.target);\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n return this;\n }\n\n /**\n * Set display container or get\n *\n * @param {Boolean} display - show/hidden container or get status\n * @returns {Boolean} - true/false\n */\n }, {\n key: \"display\",\n value: function display(_display) {\n logger.trace(\"display()\", _display);\n if (typeof _display !== \"undefined\") {\n this.container.style.display = _display ? \"flex\" : \"none\";\n }\n return this.container.style.display === \"flex\";\n }\n\n /**\n * Get container (DOM)\n *\n * @returns {DOMElement} DOM element\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n // ################################################################### //\n // ####################### handlers events to dom #################### //\n // ################################################################### //\n /**\n * this method is called by event '' on '' tag form\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Themes#editor:themes:image\n */\n }, {\n key: \"onClickThemeImageMapBox\",\n value: function onClickThemeImageMapBox(e) {\n logger.trace(\"onClickThemeImageMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n if (this.options.tools.button.type === \"checkbox\") {\n // GPEditorMapBoxThemeInput_ID_0_1571317605868\n var targetIDX = e.target.previousSibling.id.substring(e.target.previousSibling.id.lastIndexOf(\"_\") + 1);\n var _inputs = document.getElementsByClassName(this.name.input);\n for (var i = 0; i < _inputs.length; i++) {\n var el = _inputs[i];\n if (el.id === e.target.previousSibling.id) {\n continue;\n }\n var elIDX = el.id.substring(el.id.lastIndexOf(\"_\") + 1);\n if (elIDX !== targetIDX) {\n continue;\n }\n el.checked = false;\n }\n }\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].themes.onclickimage, e);\n }\n\n /**\n * this method is called by event '' on '' tag form\n *\n * @param {Object} e - HTMLElement\n * @private\n * @fires Themes#editor:themes:title\n */\n }, {\n key: \"onClickThemeTitleMapBox\",\n value: function onClickThemeTitleMapBox(e) {\n logger.trace(\"onClickThemeTitleMapBox\", e);\n e.editorID = this.id;\n e.data = this.options;\n if (this.options.tools.button.type === \"checkbox\") {\n // GPEditorMapBoxThemeInput_ID_0_1571317605868\n var targetIDX = e.target.id.substring(e.target.id.lastIndexOf(\"_\") + 1);\n var _inputs = document.getElementsByClassName(this.name.input);\n for (var i = 0; i < _inputs.length; i++) {\n var el = _inputs[i];\n if (el.id === e.target.id) {\n continue;\n }\n var elIDX = el.id.substring(el.id.lastIndexOf(\"_\") + 1);\n if (elIDX !== targetIDX) {\n continue;\n }\n el.checked = false;\n }\n }\n eventbusjs__WEBPACK_IMPORTED_MODULE_0___default.a.dispatch(_Event__WEBPACK_IMPORTED_MODULE_1__[\"default\"].themes.onclicktitle, e);\n }\n }]);\n}();\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Themes);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0VkaXRvci9UaGVtZXMuanM/Y2JmZCJdLCJuYW1lcyI6WyJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJUaGVtZXMiLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwidHJhY2UiLCJUeXBlRXJyb3IiLCJfaW5pdGlhbGl6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJpZCIsInRhcmdldCIsIl90b29sc0RlZmF1bHQiLCJ0aHVtYm5haWxzIiwiYnV0dG9uIiwidmlzaWJsZSIsInR5cGUiLCJ0b29scyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJVdGlscyIsIm1lcmdlUGFyYW1zIiwib2JqIiwidGhlbWVzU3VtbWFyeSIsInRoZW1lcyIsImNvbnRhaW5lciIsIm5hbWUiLCJjb250YWluZXJ0aGVtZSIsImNvbnRhaW5lcnRoZW1lSUQiLCJpbnB1dCIsImlucHV0SUQiLCJsYWJlbCIsImxhYmVsSUQiLCJpbWFnZSIsImltYWdlSUQiLCJtZXNzYWdlIiwic2VsZiIsIklEIiwiZ2VuZXJhdGUiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0aXRsZSIsIl9sc3RUaGVtZXMiLCJpIiwiX3RoZW1lIiwiZGl2VGhlbWUiLCJ0YWJJbmRleCIsIl91cmwiLCJ1cmwiLCJfc2VsZWN0ZWQiLCJzZWxlY3RlZCIsIl90eXBlIiwiX2J1dHRvbiIsImNoZWNrZWQiLCJkYXRhIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJvbkNsaWNrVGhlbWVUaXRsZU1hcEJveCIsImF0dGFjaEV2ZW50IiwiYXBwZW5kQ2hpbGQiLCJ0aHVtYm5haWwiLCJfaW1nIiwic3JjIiwiYWx0IiwiZGVzY3JpcHRpb24iLCJvbkNsaWNrVGhlbWVJbWFnZU1hcEJveCIsIm5vZGVzIiwicGFyZW50RWxlbWVudCIsImNoaWxkTm9kZXMiLCJub2RlIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiX2xhYmVsIiwiaHRtbEZvciIsImlubmVySFRNTCIsIl9tc2ciLCJhZGQiLCJnZXRFbGVtZW50QnlJZCIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGlzcGxheSIsInN0eWxlIiwiZ2V0Q29udGFpbmVyIiwiZWRpdG9ySUQiLCJ0YXJnZXRJRFgiLCJwcmV2aW91c1NpYmxpbmciLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsIl9pbnB1dHMiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiZWwiLCJlbElEWCIsIkV2ZW50QnVzIiwiZGlzcGF0Y2giLCJFdmVudEVkaXRvciIsIm9uY2xpY2tpbWFnZSIsIm9uY2xpY2t0aXRsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFrQztBQUNBO0FBQ1E7QUFDUTtBQUNTO0FBRTNELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGVBQWUsQ0FBQzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJDQSxJQXNDTUMsTUFBTTtFQUVSLFNBQUFBLE9BQWFDLE9BQU8sRUFBRTtJQUFBQyxlQUFBLE9BQUFGLE1BQUE7SUFDbEJILE1BQU0sQ0FBQ00sS0FBSyxDQUFDLHNCQUFzQixFQUFFRixPQUFPLENBQUM7O0lBRTdDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU8sSUFBSTtNQUN0QjtJQUFBLENBQ0g7SUFFRCxJQUFJLEVBQUUsSUFBSSxZQUFZRCxNQUFNLENBQUMsRUFBRTtNQUMzQixNQUFNLElBQUlJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FB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VyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUN2RCxJQUFJSSxLQUFLLEtBQUtQLFNBQVMsRUFBRTtZQUNyQjtVQUNKO1VBQ0FNLEVBQUUsQ0FBQ3JDLE9BQU8sR0FBRyxLQUFLO1FBQ3RCO01BQ0o7TUFDQXVDLGlEQUFRLENBQUNDLFFBQVEsQ0FBQ0MsOENBQVcsQ0FBQ3hFLE1BQU0sQ0FBQzBFLFlBQVksRUFBRXhDLENBQUMsQ0FBQztJQUN6RDtFQUFDO0FBQUE7QUFFSjtBQUVjM0QscUVBQU0iLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9Db250cm9scy9FZGl0b3IvVGhlbWVzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50QnVzIGZyb20gXCJldmVudGJ1c2pzXCI7XG5pbXBvcnQgRXZlbnRFZGl0b3IgZnJvbSBcIi4vRXZlbnRcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vLi4vQ29tbW9uL1V0aWxzXCI7XG5pbXBvcnQgSUQgZnJvbSBcIi4uLy4uLy4uL0NvbW1vbi9VdGlscy9TZWxlY3RvcklEXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZWRpdG9yLXRoZW1lc1wiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogTWFwYm94IFRoZW1lcyBtYW5hZ2VtZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc3R5bGUuZWRpdG9yLlRoZW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogICB2YXIgdGhlbWUgPSBuZXcgVGhlbWVzICh7XG4gKiAgICAgICAgXCJ0YXJnZXRcIjogXCJcIixcbiAqICAgICAgICBcInRvb2xzXCI6IHtcbiAqICAgICAgICAgIFwidGh1bWJuYWlsc1wiOiB0cnVlLFxuICogICAgICAgICAgXCJidXR0b25cIiA6IHtcbiAqICAgICAgICAgICAgICBcInZpc2libGVcIiA6IHRydWUsXG4gKiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJhZGlvXCIgKHBhciBkZWZhdXQpIHwgXCJjaGVja2JveFwiXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfSxcbiAqICAgICAgICBcIm9ialwiOiB7XG4gKiAgICAgICAgICBcInRoZW1lc1N1bW1hcnlcIjogXCJcIiwgLy8gVGl0cmUgZHUgY29tcG9zYW50IChub24gZ3JhcGhpcXVlICEpXG4gKiAgICAgICAgICBcInRoZW1lc1wiOiBbe1xuICogICAgICAgICAgICAgXCJ0aHVtYm5haWxcIjogXCJkYXRhL2ltYWdlcy9sYXllcjAucG5nXCIsXG4gKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFuZGFyZDBcIixcbiAqICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS9zdHlsZXMvbGF5ZXIwLmpzb25cIixcbiAqICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAqICAgICAgICAgICAgIFwic2VsZWN0ZWRcIiA6IHRydWVcbiAqICAgICAgICAgIH0se1xuICogICAgICAgICAgICAgXCJ0aHVtYm5haWxcIjogXCJkYXRhL2ltYWdlcy9sYXllcjEucG5nXCIsXG4gKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFuZGFyZDFcIixcbiAqICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS9zdHlsZXMvbGF5ZXIxLmpzb25cIixcbiAqICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxuICogICAgICAgICAgfV1cbiAqICAgICAgICB9XG4gKiAgIH0pO1xuICogIHRoZW1lLmFkZCgpO1xuICogIHRoZW1lLmRpc3BsYXkodHJ1ZSk7XG4gKiAgdGhlbWUuZ2V0Q29udGFpbmVyKCk7XG4gKi9cbmNsYXNzIFRoZW1lcyB7XG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbY29uc3RydWN0b3JdIFRoZW1lc1wiLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgLy8gVE9ETyBkZWZhdWx0Li4uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRoZW1lcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUlJPUiBDTEFTU19DT05TVFJVQ1RPUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUoKTtcblxuICAgICAgICB0aGlzLl9pbml0Q29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdGlhbGl6ZSAoKSB7XG4gICAgICAgIC8vIHVuaXF1ZSBlZGl0b3IgaWQgKG9wdGlvbmFsISlcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZCB8fCBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gY2YuIGFkZCgpXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3Rvb2xzRGVmYXVsdCA9IHtcbiAgICAgICAgICAgIHRodW1ibmFpbHMgOiB0cnVlLFxuICAgICAgICAgICAgYnV0dG9uIDoge1xuICAgICAgICAgICAgICAgIHZpc2libGUgOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGUgOiBcInJhZGlvXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29scyB8fCBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMudG9vbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xzID0gX3Rvb2xzRGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucy50b29scywgX3Rvb2xzRGVmYXVsdCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLm9iaiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9iaiA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgIXRoaXMub3B0aW9ucy5vYmopIHtcbiAgICAgICAgICAgIC8vIHZpZGUgcGFyIGRlZmF1dCA/XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub2JqID0ge1xuICAgICAgICAgICAgICAgIHRoZW1lc1N1bW1hcnkgOiBcIlwiLFxuICAgICAgICAgICAgICAgIHRoZW1lcyA6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIERPTSA6IGNsYXNzTmFtZSBvciBpZFxuICAgICAgICB0aGlzLm5hbWUgPSB7XG4gICAgICAgICAgICB0YXJnZXQgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVUYXJnZXRcIixcbiAgICAgICAgICAgIGNvbnRhaW5lciA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZXNDb250YWluZXJcIixcbiAgICAgICAgICAgIGNvbnRhaW5lcnRoZW1lIDogXCJHUEVkaXRvck1hcEJveFRoZW1lQ29udGFpbmVyXCIsXG4gICAgICAgICAgICBjb250YWluZXJ0aGVtZUlEIDogXCJHUEVkaXRvck1hcEJveFRoZW1lQ29udGFpbmVyX0lEX1wiLFxuICAgICAgICAgICAgaW5wdXQgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVJbnB1dFwiLFxuICAgICAgICAgICAgaW5wdXRJRCA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZUlucHV0X0lEX1wiLFxuICAgICAgICAgICAgbGFiZWwgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVUaXRsZVwiLFxuICAgICAgICAgICAgbGFiZWxJRCA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZVRpdGxlX0lEX1wiLFxuICAgICAgICAgICAgaW1hZ2UgOiBcIkdQRWRpdG9yTWFwQm94VGhlbWVJbWFnZVwiLFxuICAgICAgICAgICAgaW1hZ2VJRCA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZUltYWdlX0lEX1wiLFxuICAgICAgICAgICAgbWVzc2FnZSA6IFwiR1BFZGl0b3JNYXBCb3hUaGVtZU1lc3NhZ2VcIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyYXBoaWNhbCByZW5kZXJpbmcgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChjYWxsZWQgYnkgY29uc3RydWN0b3IpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogIDxkaXYgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lc0NvbnRhaW5lclwiPlxuICAgICAqICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVDb250YWluZXItMVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZUNvbnRhaW5lclwiPlxuICAgICAqICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVJbnB1dC0xXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXRcIiBuYW1lPVwiMTU1MjkyMDE3NjkzM1wiPlxuICAgICAqICAgICAgICAgIDxpbWcgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW1hZ2VcIiBzcmM9XCJodHRwOi8vaW1hZ2UxLnBuZ1wiIGFsdD1cIkRlc2NyaXB0aW9uMVwiPjwvaW1nPlxuICAgICAqICAgICAgICAgIDxsYWJlbCBmb3I9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXQtMVwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZVRpdGxlXCI+VGl0cmUxPC9sYWJlbD5cbiAgICAgKiAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPGRpdiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVDb250YWluZXItMlwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZUNvbnRhaW5lclwiPlxuICAgICAqICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cIkdQRWRpdG9yTWFwQm94VGhlbWVJbnB1dC0yXCIgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXRcIiBuYW1lPVwiMTU1MjkyMDE3NjkzNFwiPlxuICAgICAqICAgICAgICAgIDxpbWcgY2xhc3M9XCJHUEVkaXRvck1hcEJveFRoZW1lSW1hZ2VcIiBzcmM9XCJodHRwOi8vaW1hZ2UyLnBuZ1wiIGFsdD1cIkRlc2NyaXB0aW9uMlwiPjwvaW1nPlxuICAgICAqICAgICAgICAgIDxsYWJlbCBmb3I9XCJHUEVkaXRvck1hcEJveFRoZW1lSW5wdXQtMlwiIGNsYXNzPVwiR1BFZGl0b3JNYXBCb3hUaGVtZVRpdGxlXCI+VGl0cmUyPC9sYWJlbD5cbiAgICAgKiAgICAgIDwvZGl2PlxuICAgICAqIDwvZGl2PlxuICAgICAqL1xuICAgIF9pbml0Q29udGFpbmVyICgpIHtcbiAgICAgICAgLy8gY29udGV4dGVcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBvYmogPSB0aGlzLm9wdGlvbnMub2JqO1xuXG4gICAgICAgIHZhciBpZCA9IHRoaXMuaWQgfHwgSUQuZ2VuZXJhdGUoKTtcblxuICAgICAgICAvLyBkaXYgcHJpbmNpcGFsZVxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZS5jb250YWluZXI7XG4gICAgICAgIGRpdi50aXRsZSA9IG9iai50aGVtZXNTdW1tYXJ5IHx8IFwiXCI7XG5cbiAgICAgICAgdmFyIF9sc3RUaGVtZXMgPSBvYmoudGhlbWVzO1xuICAgICAgICBpZiAoX2xzdFRoZW1lcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbHN0VGhlbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF90aGVtZSA9IF9sc3RUaGVtZXNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBkaXYgcG91ciBjaGFxdWUgdGhlbWVcbiAgICAgICAgICAgICAgICB2YXIgZGl2VGhlbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIGRpdlRoZW1lLmlkID0gdGhpcy5uYW1lLmNvbnRhaW5lcnRoZW1lSUQgKyBpICsgXCJfXCIgKyBpZDtcbiAgICAgICAgICAgICAgICBkaXZUaGVtZS5jbGFzc05hbWUgPSB0aGlzLm5hbWUuY29udGFpbmVydGhlbWU7XG4gICAgICAgICAgICAgICAgZGl2VGhlbWUudGFiSW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgLy8gdXJsIGR1IHN0eWxlIGVzdCBvYmxpZ2F0b2lyZSAhXG4gICAgICAgICAgICAgICAgdmFyIF91cmwgPSBfdGhlbWUudXJsO1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlIHNlbGVjdGlvbm7DqSBwYXIgZGVmYXV0ICh1bmlxdWVtZW50IGVuIG1vZGUgcmFkaW8tYnV0dG9uICE/KVxuICAgICAgICAgICAgICAgIHZhciBfc2VsZWN0ZWQgPSBfdGhlbWUuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKF91cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYm91dG9uXG4gICAgICAgICAgICAgICAgICAgIHZhciBidXR0b24gPSB0aGlzLm9wdGlvbnMudG9vbHMuYnV0dG9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IChidXR0b24udHlwZSA9PT0gXCJjaGVja2JveFwiKSA/IFwiY2hlY2tib3hcIiA6IFwicmFkaW9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2J1dHRvbi50eXBlID0gX3R5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYnV0dG9uLmlkID0gdGhpcy5uYW1lLmlucHV0SUQgKyBpICsgXCJfXCIgKyBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9idXR0b24uY2xhc3NOYW1lID0gdGhpcy5uYW1lLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2J1dHRvbi5uYW1lID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYnV0dG9uLmNoZWNrZWQgPSBfc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYnV0dG9uLmRhdGEgPSBfdXJsOyAvLyBvbiBsaWUgbGUgRE9NIGV0IGxhIGNvdWNoZSwgdXRpbGUgbG9ycyBkJ2V2ZW5lbWVudCAhXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrVGhlbWVUaXRsZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2J1dHRvbi5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idXR0b24uYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja1RoZW1lVGl0bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXZUaGVtZS5hcHBlbmRDaGlsZChfYnV0dG9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB2aWduZXR0ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvb2xzLnRodW1ibmFpbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhlbWUudGh1bWJuYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9pbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbWcuaWQgPSB0aGlzLm5hbWUuaW1hZ2VJRCArIGkgKyBcIl9cIiArIGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbWcuY2xhc3NOYW1lID0gdGhpcy5uYW1lLmltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbWcuc3JjID0gX3RoZW1lLnRodW1ibmFpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmFsdCA9IF90aGVtZS50aHVtYm5haWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ltZy50aXRsZSA9IF90aGVtZS5kZXNjcmlwdGlvbiB8fCBcIlwiOyAvLyB1bmUgZGVzY3JpcHRpb24gYXUgc3Vydm9sIGRlIGwnaW1hZ2Ugb3UgdGl0cmUuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmRhdGEgPSBfdXJsOyAvLyBvbiBsaWUgbGUgRE9NIGV0IGxhIGNvdWNoZSwgdXRpbGUgbG9ycyBkJ2V2ZW5lbWVudCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbWcuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrVGhlbWVJbWFnZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1haiBkdSByYWRpbyBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGVja2VkID0gIW5vZGUuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2ltZy5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW1nLmF0dGFjaEV2ZW50KFwib25jbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrVGhlbWVJbWFnZU1hcEJveChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGVja2VkID0gIW5vZGUuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZUaGVtZS5hcHBlbmRDaGlsZChfaW1nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbFxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoZW1lLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwuaWQgPSB0aGlzLm5hbWUubGFiZWxJRCArIGkgKyBcIl9cIiArIGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29scy5idXR0b24udmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5odG1sRm9yID0gX2J1dHRvbi5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5jbGFzc05hbWUgPSB0aGlzLm5hbWUubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwuaW5uZXJIVE1MID0gX3RoZW1lLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwudGl0bGUgPSBfdGhlbWUuZGVzY3JpcHRpb24gfHwgXCJcIjsgLy8gdW5lIGRlc2NyaXB0aW9uIGF1IHN1cnZvbCBkZSBsJ2ltYWdlIG91IHRpdHJlLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBfbGFiZWwuZGF0YSA9IF91cmw7IC8vIG9uIGxpZSBsZSBET00gZXQgbGEgY291Y2hlLCB1dGlsZSBsb3JzIGQnZXZlbmVtZW50ICFcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xzLmJ1dHRvbi52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9sYWJlbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja1RoZW1lVGl0bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xhYmVsLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYWJlbC5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGlja1RoZW1lVGl0bGVNYXBCb3goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdlRoZW1lLmFwcGVuZENoaWxkKF9sYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX21zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgX21zZy5jbGFzc05hbWUgPSB0aGlzLm5hbWUubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgX21zZy5pbm5lckhUTUwgPSBcIlRow6htZSBub24gZGlzcG9uaWJsZS4uLlwiO1xuICAgICAgICAgICAgICAgICAgICBkaXZUaGVtZS5hcHBlbmRDaGlsZChfbXNnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGl2VGhlbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLyoqXG4gICAgICogQWRkIGVsZW1lbnQgaW50byB0YXJnZXQgRE9NXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBMZWdlbmQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGQgKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uYW1lLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBkaXYuaWQgPSB0aGlzLm5hbWUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubmFtZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3BsYXkgY29udGFpbmVyIG9yIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5IC0gc2hvdy9oaWRkZW4gY29udGFpbmVyIG9yIGdldCBzdGF0dXNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlL2ZhbHNlXG4gICAgICovXG4gICAgZGlzcGxheSAoZGlzcGxheSkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJkaXNwbGF5KClcIiwgZGlzcGxheSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IChkaXNwbGF5KSA/IFwiZmxleFwiIDogXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcImZsZXhcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvbnRhaW5lciAoRE9NKVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgdG8gZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIFRoZW1lcyNlZGl0b3I6dGhlbWVzOmltYWdlXG4gICAgICovXG4gICAgb25DbGlja1RoZW1lSW1hZ2VNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DbGlja1RoZW1lSW1hZ2VNYXBCb3hcIiwgZSk7XG4gICAgICAgIGUuZWRpdG9ySUQgPSB0aGlzLmlkO1xuICAgICAgICBlLmRhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuYnV0dG9uLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgLy8gR1BFZGl0b3JNYXBCb3hUaGVtZUlucHV0X0lEXzBfMTU3MTMxNzYwNTg2OFxuICAgICAgICAgICAgdmFyIHRhcmdldElEWCA9IGUudGFyZ2V0LnByZXZpb3VzU2libGluZy5pZC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgZS50YXJnZXQucHJldmlvdXNTaWJsaW5nLmlkLmxhc3RJbmRleE9mKFwiX1wiKSArIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgX2lucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5uYW1lLmlucHV0KTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbCA9IF9pbnB1dHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVsLmlkID09PSBlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlbElEWCA9IGVsLmlkLnN1YnN0cmluZyhlbC5pZC5sYXN0SW5kZXhPZihcIl9cIikgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxJRFggIT09IHRhcmdldElEWCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWwuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50QnVzLmRpc3BhdGNoKEV2ZW50RWRpdG9yLnRoZW1lcy5vbmNsaWNraW1hZ2UsIGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnJyBvbiAnJyB0YWcgZm9ybVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGZpcmVzIFRoZW1lcyNlZGl0b3I6dGhlbWVzOnRpdGxlXG4gICAgICovXG4gICAgb25DbGlja1RoZW1lVGl0bGVNYXBCb3ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwib25DbGlja1RoZW1lVGl0bGVNYXBCb3hcIiwgZSk7XG4gICAgICAgIGUuZWRpdG9ySUQgPSB0aGlzLmlkO1xuICAgICAgICBlLmRhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9vbHMuYnV0dG9uLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgLy8gR1BFZGl0b3JNYXBCb3hUaGVtZUlucHV0X0lEXzBfMTU3MTMxNzYwNTg2OFxuICAgICAgICAgICAgdmFyIHRhcmdldElEWCA9IGUudGFyZ2V0LmlkLnN1YnN0cmluZyhlLnRhcmdldC5pZC5sYXN0SW5kZXhPZihcIl9cIikgKyAxKTtcbiAgICAgICAgICAgIHZhciBfaW5wdXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLm5hbWUuaW5wdXQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsID0gX2lucHV0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZWwuaWQgPT09IGUudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZWxJRFggPSBlbC5pZC5zdWJzdHJpbmcoZWwuaWQubGFzdEluZGV4T2YoXCJfXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGVsSURYICE9PSB0YXJnZXRJRFgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBFdmVudEJ1cy5kaXNwYXRjaChFdmVudEVkaXRvci50aGVtZXMub25jbGlja3RpdGxlLCBlKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRoZW1lcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Editor/Themes.js\n"); /***/ }), @@ -2465,7 +2465,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS_Controls_Export_GPexportOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CSS/Controls/Export/GPexportOpenLayers.css */ \"./src/OpenLayers/CSS/Controls/Export/GPexportOpenLayers.css\");\n/* harmony import */ var _CSS_Controls_Export_GPexportOpenLayers_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_Export_GPexportOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ol/control/Control */ \"ol/control/Control\");\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ol_control_Control__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Formats_KML__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Formats/KML */ \"./src/OpenLayers/Formats/KML.js\");\n/* harmony import */ var _Formats_GeoJSON__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Formats/GeoJSON */ \"./src/OpenLayers/Formats/GeoJSON.js\");\n/* harmony import */ var _Formats_GPX__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Formats/GPX */ \"./src/OpenLayers/Formats/GPX.js\");\n/* harmony import */ var _Common_Controls_ExportDOM__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Common/Controls/ExportDOM */ \"./src/Common/Controls/ExportDOM.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n// import CSS\n\n\n// import OpenLayers\n\n\n// import local\n\n\n\n\n// import local with ol dependencies\n\n\n\n\n// DOM\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLogger(\"export\");\n\n/**\n * @classdesc\n *\n * Export button\n *\n * @constructor\n * @alias ol.control.Export\n * @param {Object} options - options for function call.\n * @param {String} [options.format = \"geojson\"] - geojson / kml / gpx\n * @param {String} [options.name = \"export\"] - export name\n * @param {String} [options.title = \"Exporter\"] - button name\n * @param {Boolean} [options.menu = false] - displays the format choice menu\n * @param {Function} [options.onExport] - callback\n * @param {DOMElement} [options.target] - target\n * @param {Object} options.control - instance of control\n * @fires export:compute\n * @example\n * // pluggued widget Export into control Isocurve\n * var iso = new ol.control.Isocurve();\n * map.addControl(iso);\n *\n * // method : call render()\n * var export = new ButtonExport();\n * export.setControl(iso);\n * export.setTarget();\n * export.setName(\"export\");\n * export.setFormat(\"geojson\");\n * export.setTitle(\"Exporter\");\n * export.setMenu(false);\n * export.render(); // <-- direct call to render function !\n * export.on(\"export:compute\", (data) => { console.log(data); });\n *\n * // method : call map.addControl()\n * var export = new ButtonExport();\n * export.setControl(iso);\n * export.setTarget();\n * export.setName(\"export\");\n * export.setFormat(\"geojson\");\n * export.setTitle(\"Exporter\");\n * export.setMenu(false);\n * export.on(\"export:compute\", (data) => { console.log(data); });\n * map.addControl(export); // <-- using the OpenLayers mechanism, don't call to render function !\n *\n * // use control options instead of setters\n * var export = new ButtonExport({\n * control : iso,\n * target : ,\n * name : \"export\",\n * format : \"geojson\",\n * title : \"Exporter\",\n * menu : false\n * });\n * map.addControl(export);\n *\n * // method with passing option into the control Isocurve\n * var iso = new ol.control.Isocurve({ export : true });\n * // with control options :\n * var iso = new ol.control.Isocurve({ export : {\n * name : \"export\",\n * format : \"geojson\",\n * title : \"Exporter\",\n * menu : false\n * }});\n */\nvar ButtonExport = /*#__PURE__*/function (_Control) {\n /**\n * See {@link ol.control.Export}\n * @module ButtonExport\n * @alias module:~Controls/ButtonExport\n * @param {Object} [options] - options\n * @example\n * import ButtonExport from \"src/OpenLayers/Controls/Export\"\n */\n function ButtonExport(options) {\n var _this;\n _classCallCheck(this, ButtonExport);\n options = options || {\n control: null,\n target: null,\n format: \"geojson\",\n name: \"export\",\n title: \"Exporter\",\n menu: false,\n onExport: null\n };\n logger.trace(\"[constructor] Export\", options);\n _this = _callSuper(this, ButtonExport, [{\n element: document.createElement(\"div\"),\n render: options.render,\n target: options.target\n }]);\n if (!(_this instanceof ButtonExport)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n\n /**\n * Response to the export of the route calculation\n * (only for jsdoc)\n *\n * @example\n * // GeoJSON format\n * {\n * \"type\":\"FeatureCollection\",\n * \"features\":[...],\n * \"geoportail:compute\":{\n * \"points\":[ [2.588024210134887, 48.84192678293002 ] ],\n * \"transport\":\"Voiture\",\n * \"exclusions\":[...],\n * \"computation\":\"fastest\",\n * \"results\":{ }\n * }\n *\n * @see {@link https://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.RouteResponse.html|Service}\n */\n // eslint-disable-next-line no-undef\n _this.EXPORT_ROUTE = {};\n\n /**\n * Response to the export of the isochron calculation\n * (only for jsdoc)\n *\n * @example\n * // GeoJSON format\n * {\n * \"type\":\"FeatureCollection\",\n * \"features\":[...],\n * \"geoportail:compute\":{\n * \"transport\":\"Pieton\",\n * \"computation\":\"time\",\n * \"exclusions\":[\n *\n * ],\n * \"direction\":\"departure\",\n * \"point\":[ 2.587835382718464, 48.84192678293002 ],\n * \"results\":{\n * \"message\":\"\",\n * \"id\":\"\",\n * \"location\":{\n * \"x\":\"2.587835382718464\",\n * \"y\":\"48.84192678293002\"\n * },\n * \"srs\":\"EPSG:4326\",\n * \"geometry\":{\n * \"type\":\"Polygon\",\n * \"coordinates\":[[...]]\n * },\n * \"time\":180,\n * \"distance\":\"\"\n * }\n * }\n * }\n *\n * @see {@link https://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.IsoCurveResponse.html|Service}\n */\n // eslint-disable-next-line no-undef\n _this.EXPORT_ISOCHRON = {};\n\n /**\n * Response to the export of the profile calculation\n * (only for jsdoc)\n *\n * @example\n * // GeoJSON format\n * {\n * \"type\":\"FeatureCollection\",\n * \"features\":[...],\n * \"geoportail:compute\":{\n * \"greaterSlope\":76,\n * \"meanSlope\":7,\n * \"distancePlus\":84,\n * \"distanceMinus\":48,\n * \"ascendingElevation\":5,\n * \"descendingElevation\":-4,\n * \"altMin\":\"92,04\",\n * \"altMax\":\"96,71\",\n * \"distance\":163,\n * \"unit\":\"m\",\n * \"points\":[\n * {\n * \"z\":95.68,\n * \"lon\":2.5874,\n * \"lat\":48.8419,\n * \"acc\":2.5,\n * \"dist\":0,\n * \"slope\":0\n * }\n * ]\n * }\n * }\n *\n * @see {@link https://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.AltiResponse.html|Service}\n */\n // eslint-disable-next-line no-undef\n _this.EXPORT_PROFILE = {};\n\n // id unique\n _this.uid = options.id || _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__[\"default\"].generate();\n\n // export\n _this.extension = null;\n _this.mimeType = null;\n\n // dom\n _this.container = null;\n _this.button = null;\n _this.menu = null;\n _this.icon = \"\\u2630 \";\n _this.menuClassHidden = \"GPexportMenuHidden\";\n _this.initOptions(options);\n _this.initContainer();\n return _this;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n\n /**\n * Render DOM\n *\n * @public\n */\n _inherits(ButtonExport, _Control);\n return _createClass(ButtonExport, [{\n key: \"render\",\n value: function render() {\n // container principal\n if (!this.options.target) {\n if (this.options.control) {\n // insertion du composant dans le panneau du controle\n var container = this.options.control.getContainer();\n // ex. GP(iso|route)Panel-\n this.options.target = container.lastChild;\n }\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n }\n\n // ################################################################### //\n // #################### privates methods ############################# //\n // ################################################################### //\n\n /**\n * Initialize options\n * (called by constructor)\n *\n * @param {Object} options - options\n * @private\n */\n }, {\n key: \"initOptions\",\n value: function initOptions(options) {\n // options\n this.options = options;\n if (this.options.control) {\n // ...\n }\n if (this.options.target) {\n // ...\n }\n var format = this.options.format;\n format ? this.setFormat(format) : this.setFormat(\"\");\n if (!this.options.name) {\n this.setName(\"export\");\n }\n if (!this.options.title) {\n this.setTitle(\"Exporter\");\n }\n if (this.options.menu === undefined) {\n this.setMenu(false);\n }\n }\n\n /**\n * Initialize container\n * (called by constructor)\n *\n * @private\n * @todo menu des options\n */\n }, {\n key: \"initContainer\",\n value: function initContainer() {\n var _this2 = this;\n // TODO\n // menu des options de l'export :\n // * [ nom ]\n // * format\n // https://www.w3schools.com/howto/howto_css_dropdown.asp\n // https://www.w3schools.com/howto/howto_css_custom_checkbox.asp\n\n // afficher l'icone du menu\n var title = this.options.title;\n if (this.options.menu) {\n title = this.icon + this.options.title;\n }\n var div = document.createElement(\"div\");\n div.id = this._addUID(\"GPexportContainer\");\n div.className = \"GPexportMenuContainer\";\n\n // bouton Exporter\n // utiliser les templates literals avec la substitution ${...}\n var button = this.stringToHTML(\"\\n \\n \"));\n\n // add event click button\n this.button = button.firstChild;\n if (this.button) {\n this.button.addEventListener(\"click\", function (e) {\n return _this2.onClickButtonExport(e);\n });\n }\n div.appendChild(button.firstChild);\n\n // menu des options\n // utiliser les templates literals avec la substitution ${...}\n var menu = this.stringToHTML(\"\\n
\\n \\n \\n \\n
\\n \"));\n this.menu = menu.firstChild;\n if (this.menu) {\n if (this.options.menu) {\n var className = this.menu.className;\n this.menu.className = className.replace(this.menuClassHidden, \"\");\n }\n var radios = this.menu.querySelectorAll(\"input[type=radio][name=\\\"format\\\"]\");\n radios.forEach(function (radio) {\n // radio checked par defaut\n if (radio.id.toUpperCase().includes(_this2.options.format.toUpperCase())) {\n radio.checked = true;\n }\n // ecouteur pour changer de format\n radio.addEventListener(\"change\", function (e) {\n _this2.setFormat(e.target.value);\n });\n });\n }\n div.appendChild(menu.firstChild);\n this.container = div;\n }\n\n /**\n * ...\n *\n * @param {String} str - ...\n * @returns {DOMElement} - ...\n * @private\n */\n }, {\n key: \"stringToHTML\",\n value: function stringToHTML(str) {\n var support = function support() {\n if (!window.DOMParser) return false;\n var parser = new DOMParser();\n try {\n parser.parseFromString(\"x\", \"text/html\");\n } catch (err) {\n return false;\n }\n return true;\n };\n\n // If DOMParser is supported, use it\n if (support()) {\n var parser = new DOMParser();\n var doc = parser.parseFromString(str, \"text/html\");\n return doc.body;\n }\n\n // Otherwise, fallback to old-school method\n var dom = document.createElement(\"div\");\n dom.innerHTML = str;\n return dom;\n }\n\n /**\n * ...\n * @returns {Boolean} - ...\n * @private\n */\n }, {\n key: \"isPluggableControl\",\n value: function isPluggableControl() {\n // tester toutes les méthodes des widgets pluggable\n // la méthode getData() n'est pas obligatoire car certains widgets\n // n'ont pas de configuration.\n if (this.options.control && typeof this.options.control.getContainer === \"function\" && typeof this.options.control.getLayer === \"function\") {\n return true;\n }\n return false;\n }\n\n /**\n * ...\n * @param {Object} layer - ...\n * @param {Object} [data] - ...\n * @param {Object} [style] - ...\n * @returns {String} - ...\n * @private\n */\n }, {\n key: \"exportFeatures\",\n value: function exportFeatures(layer, data, style) {\n var _this3 = this;\n var result = null;\n if (!layer) {\n logger.warn(\"Impossible to export : no layer is hosting features.\");\n return result;\n }\n if (!layer.getSource() || !layer.getSource().getFeatures() || !layer.getSource().getFeatures().length) {\n logger.warn(\"Impossible to export : no features found.\");\n return result;\n }\n\n // INFO\n // les styles sont bien transmis pour l'outil de dessin\n // mais, ce n'est pas toujours le cas pour certains widgets !?\n // donc, on y ajoute les styles par defaut...\n layer.getSource().getFeatures().forEach(function (feature) {\n var style = feature.getStyle();\n if (!style && typeof _this3.options.control.getStyle === \"function\") {\n feature.setStyle(_this3.options.control.getStyle());\n }\n });\n\n // ajouter les metadonnées de calcul et de configuration\n var options = {\n defaultStyle: style\n };\n if (data) {\n // properties ajoutées à la racine :\n // ex. \"geoportail:compute\" : {}\n options.extensions = {\n \"geoportail:compute\": data\n };\n }\n var ClassName = null;\n switch (this.options.format.toUpperCase()) {\n case \"KML\":\n options.writeStyles = true;\n options.showPointNames = true;\n ClassName = new _Formats_KML__WEBPACK_IMPORTED_MODULE_5__[\"default\"](options);\n break;\n case \"GPX\":\n ClassName = new _Formats_GPX__WEBPACK_IMPORTED_MODULE_7__[\"default\"](options);\n break;\n case \"GEOJSON\":\n ClassName = new _Formats_GeoJSON__WEBPACK_IMPORTED_MODULE_6__[\"default\"](options);\n break;\n default:\n break;\n }\n if (!ClassName) {\n logger.warn(\"Impossible to export : format unknown !?\");\n return result;\n }\n var featProj = layer.getSource().getProjection();\n\n // INFO\n // on determine la projection de la carte\n // si le composant a été ajouté sur la carte via le mécanisme d'OpenLayer...\n var map = this.getMap();\n if (map) {\n featProj = featProj || map.getView().getProjection();\n }\n var features = layer.getSource().getFeatures();\n\n // INFO\n // par defaut, webmercator ou \"EPSG:3857\"\n result = ClassName.writeFeatures(features, {\n dataProjection: \"EPSG:4326\",\n featureProjection: featProj || \"EPSG:3857\"\n });\n return result;\n }\n // ################################################################### //\n // ######################## event dom ################################ //\n // ################################################################### //\n\n /**\n * ...\n * @param {*} e - Click\n */\n }, {\n key: \"onClickButtonExport\",\n value: function onClickButtonExport(e) {\n if (!this.isPluggableControl()) {\n logger.warn(\"Componant not pluggable with the control !\");\n return;\n }\n var layer = this.options.control.getLayer();\n var data = this.options.control.getData !== undefined ? this.options.control.getData() : {};\n var style = this.options.control.getStyle !== undefined ? this.options.control.getStyle() : {};\n var content = this.exportFeatures(layer, data, style);\n if (!content || content === \"null\") {\n return;\n }\n\n /**\n * event triggered when the export is finished\n *\n * @event export:compute\n * @typedef {Object}\n * @property {Object} type - event\n * @property {Object} target - instance Export\n * @property {String} content - export data\n * @example\n * Export.on(\"export:compute\", function (e) {\n * console.log(e.target);\n * })\n */\n this.dispatchEvent({\n type: \"export:compute\",\n content: content\n });\n\n // INFO\n // la callback annule le download du fichier.\n if (this.options.onExport && typeof this.options.onExport === \"function\") {\n this.options.onExport(content);\n return;\n }\n var link = document.createElement(\"a\");\n // determiner le bon charset !\n var charset = \"utf-8\";\n link.setAttribute(\"href\", \"data:\" + this.mimeType + \";charset=\" + charset + \",\" + encodeURIComponent(content));\n link.setAttribute(\"download\", this.options.name + this.extension);\n if (document.createEvent) {\n var event = document.createEvent(\"MouseEvents\");\n event.initEvent(\"click\", true, true);\n link.dispatchEvent(event);\n } else {\n link.click();\n }\n }\n\n // ################################################################### //\n // ##################### public setters ############################## //\n // ################################################################### //\n /**\n * ...\n * @param {Object} control - ...\n * @public\n */\n }, {\n key: \"setControl\",\n value: function setControl(control) {\n this.options.control = control;\n }\n\n /**\n * ...\n * @param {DOMElement} target - ...\n * @public\n */\n }, {\n key: \"setTarget\",\n value: function setTarget(target) {\n this.options.target = target;\n }\n\n /**\n * ...\n * @param {String} format - ...\n * @public\n */\n }, {\n key: \"setFormat\",\n value: function setFormat(format) {\n this.options.format = format.toUpperCase();\n switch (this.options.format) {\n case \"KML\":\n this.extension = \".kml\";\n this.mimeType = \"application/vnd.google-earth.kml+xml\";\n break;\n case \"GPX\":\n this.extension = \".gpx\";\n this.mimeType = \"application/gpx+xml\";\n break;\n case \"GEOJSON\":\n this.extension = \".geojson\";\n this.mimeType = \"application/geo+json\";\n break;\n default:\n // redefine format by default !\n this.options.format = \"GEOJSON\";\n this.extension = \".geojson\";\n this.mimeType = \"application/geo+json\";\n break;\n }\n }\n\n /**\n * ...\n * @param {String} name - ...\n * @public\n */\n }, {\n key: \"setName\",\n value: function setName(name) {\n this.options.name = name;\n }\n\n /**\n * ...\n * @param {String} title - ...\n * @public\n */\n }, {\n key: \"setTitle\",\n value: function setTitle(title) {\n this.options.title = title;\n if (this.button) {\n // afficher l'icone du menu / titre\n this.button.value = this.options.menu ? this.icon + title : title;\n }\n }\n\n /**\n * ...\n * @param {Boolean} active - ...\n * @public\n */\n }, {\n key: \"setMenu\",\n value: function setMenu(active) {\n var _this4 = this;\n this.options.menu = active;\n if (this.button) {\n // afficher l'icone du menu / titre\n this.button.value = this.options.menu ? this.icon + this.options.title : this.options.title;\n }\n if (this.menu && this.options.menu) {\n // afficher le menu\n var className = this.menu.className;\n this.menu.className = className.replace(this.menuClassHidden, \"\");\n // format par defaut\n var radios = this.menu.querySelectorAll(\"input[type=radio][name=\\\"format\\\"]\");\n radios.forEach(function (radio) {\n // radio checked par defaut\n if (radio.id.toUpperCase().includes(_this4.options.format.toUpperCase())) {\n radio.checked = true;\n }\n });\n }\n }\n }]);\n}(ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default.a);\n;\n\n// on récupère les méthodes de la classe DOM\n_Common_Utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].assign(ButtonExport.prototype, _Common_Controls_ExportDOM__WEBPACK_IMPORTED_MODULE_8__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (ButtonExport);\n\n// Expose Export as ol.control.Export (for a build bundle)\nif (window.ol && window.ol.control) {\n window.ol.control.Export = ButtonExport;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0V4cG9ydC5qcz9hZjQ5Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkJ1dHRvbkV4cG9ydCIsIl9Db250cm9sIiwib3B0aW9ucyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiY29udHJvbCIsInRhcmdldCIsImZvcm1hdCIsIm5hbWUiLCJ0aXRsZSIsIm1lbnUiLCJvbkV4cG9ydCIsInRyYWNlIiwiX2NhbGxTdXBlciIsImVsZW1lbnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJUeXBlRXJyb3IiLCJFWFBPUlRfUk9VVEUiLCJFWFBPUlRfSVNPQ0hST04iLCJFWFBPUlRfUFJPRklMRSIsInVpZCIsImlkIiwiSUQiLCJnZW5lcmF0ZSIsImV4dGVuc2lvbiIsIm1pbWVUeXBlIiwiY29udGFpbmVyIiwiYnV0dG9uIiwiaWNvbiIsIm1lbnVDbGFzc0hpZGRlbiIsImluaXRPcHRpb25zIiwiaW5pdENvbnRhaW5lciIsIl9pbmhlcml0cyIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiZ2V0Q29udGFpbmVyIiwibGFzdENoaWxkIiwiYXBwZW5kQ2hpbGQiLCJzZXRGb3JtYXQiLCJzZXROYW1lIiwic2V0VGl0bGUiLCJ1bmRlZmluZWQiLCJzZXRNZW51IiwiX3RoaXMyIiwiZGl2IiwiX2FkZFVJRCIsImNsYXNzTmFtZSIsInN0cmluZ1RvSFRNTCIsImNvbmNhdCIsImZpcnN0Q2hpbGQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsIm9uQ2xpY2tCdXR0b25FeHBvcnQiLCJyZXBsYWNlIiwicmFkaW9zIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJyYWRpbyIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJjaGVja2VkIiwic3RyIiwic3VwcG9ydCIsIndpbmRvdyIsIkRPTVBhcnNlciIsInBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImVyciIsImRvYyIsImJvZHkiLCJkb20iLCJpbm5lckhUTUwiLCJpc1BsdWdnYWJsZUNvbnRyb2wiLCJnZXRMYXllciIsImV4cG9ydEZlYXR1cmVzIiwibGF5ZXIiLCJkYXRhIiwic3R5bGUiLCJfdGhpczMiLCJyZXN1bHQiLCJ3YXJuIiwiZ2V0U291cmNlIiwiZ2V0RmVhdHVyZXMiLCJsZW5ndGgiLCJmZWF0dXJlIiwiZ2V0U3R5bGUiLCJzZXRTdHlsZSIsImRlZmF1bHRTdHlsZSIsImV4dGVuc2lvbnMiLCJDbGFzc05hbWUiLCJ3cml0ZVN0eWxlcyIsInNob3dQb2ludE5hbWVzIiwiS01MRXh0ZW5kZWQiLCJHUFhFeHRlbmRlZCIsIkdlb0pTT05FeHRlbmRlZCIsImZlYXRQcm9qIiwiZ2V0UHJvamVjdGlvbiIsIm1hcCIsImdldE1hcCIsImdldFZpZXciLCJmZWF0dXJlcyIsIndyaXRlRmVhdHVyZXMiLCJkYXRhUHJvamVjdGlvbiIsImZlYXR1cmVQcm9qZWN0aW9uIiwiZ2V0RGF0YSIsImNvbnRlbnQiLCJkaXNwYXRjaEV2ZW50IiwidHlwZSIsImxpbmsiLCJjaGFyc2V0Iiwic2V0QXR0cmlidXRlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiY3JlYXRlRXZlbnQiLCJldmVudCIsImluaXRFdmVudCIsImNsaWNrIiwic2V0Q29udHJvbCIsInNldFRhcmdldCIsImFjdGl2ZSIsIl90aGlzNCIsIkNvbnRyb2wiLCJVdGlscyIsImFzc2lnbiIsInByb3RvdHlwZSIsIkV4cG9ydERPTSIsIm9sIiwiRXhwb3J0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDdUQ7O0FBRXZEO0FBQ3lDOztBQUV6QztBQUMrQztBQUNSO0FBQ2lCOztBQUV4RDtBQUN5QztBQUNRO0FBQ1I7O0FBRXpDO0FBQ3dEO0FBRXhELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvREEsSUFnRU1DLFlBQVksMEJBQUFDLFFBQUE7RUFFZDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksU0FBQUQsYUFBYUUsT0FBTyxFQUFFO0lBQUEsSUFBQUMsS0FBQTtJQUFBQyxlQUFBLE9BQUFKLFlBQUE7SUFDbEJFLE9BQU8sR0FBR0EsT0FBTyxJQUFJO01BQ2pCRyxPQUFPLEVBQUcsSUFBSTtNQUNkQyxNQUFNLEVBQUcsSUFBSTtNQUNiQyxNQUFNLEVBQUcsU0FBUztNQUNsQkMsSUFBSSxFQUFHLFFBQVE7TUFDZkMsS0FBSyxFQUFHLFVBQVU7TUFDbEJDLElBQUksRUFBRyxLQUFLO01BQ1pDLFFBQVEsRUFBRztJQUNmLENBQUM7SUFFRGQsTUFBTSxDQUFDZSxLQUFLLENBQUMsc0JBQXNCLEVBQUVWLE9BQU8sQ0FBQztJQUU3Q0MsS0FBQSxHQUFBVSxVQUFBLE9BQUFiLFlBQUEsR0FBTTtNQUNGYyxPQUFPLEVBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztNQUN2Q0MsTUFBTSxFQUFHZixPQUFPLENBQUNlLE1BQU07TUFDdkJYLE1BQU0sRUFBR0osT0FBTyxDQUFDSTtJQUNyQixDQUFDO0lBRUQsSUFBSSxFQUFFSCxLQUFBLFlBQWdCSCxZQUFZLENBQUMsRUFBRTtNQUNqQyxNQUFNLElBQUlrQixTQUFTLENBQUMseUJBQXlCLENBQUM7SUFDbEQ7O0lBRUE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDUTtJQUNBZixLQUFBLENBQUtnQixZQUFZLEdBQUcsQ0FBQyxDQUFDOztJQUV0QjtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNRO0lBQ0FoQixLQUFBLENBQUtpQixlQUFlLEdBQUcsQ0FBQyxDQUFDOztJQUV6QjtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ1E7SUFDQWpCLEtBQUEsQ0FBS2tCLGNBQWMsR0FBRyxDQUFDLENBQUM7O0lBRXhCO0lBQ0FsQixLQUFBLENBQUttQixHQUFHLEdBQUdwQixPQUFPLENBQUNxQixFQUFFLElBQUlDLGdFQUFFLENBQUNDLFFBQVEsQ0FBQyxDQUFDOztJQUV0QztJQUNBdEIsS0FBQSxDQUFLdUIsU0FBUyxHQUFHLElBQUk7SUFDckJ2QixLQUFBLENBQUt3QixRQUFRLEdBQUcsSUFBSTs7SUFFcEI7SUFDQXhCLEtBQUEsQ0FBS3lCLFNBQVMsR0FBRyxJQUFJO0lBQ3JCekIsS0FBQSxDQUFLMEIsTUFBTSxHQUFHLElBQUk7SUFDbEIxQixLQUFBLENBQUtPLElBQUksR0FBRyxJQUFJO0lBQ2hCUCxLQUFBLENBQUsyQixJQUFJLEdBQUcsU0FBUztJQUNyQjNCLEtBQUEsQ0FBSzRCLGVBQWUsR0FBRyxvQkFBb0I7SUFFM0M1QixLQUFBLENBQUs2QixXQUFXLENBQUM5QixPQUFPLENBQUM7SUFDekJDLEtBQUEsQ0FBSzhCLGFBQWEsQ0FBQyxDQUFDO0lBQUMsT0FBQTlCLEtBQUE7RUFDekI7O0VBRUE7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSStCLFNBQUEsQ0FBQWxDLFlBQUEsRUFBQUMsUUFBQTtFQUFBLE9BQUFrQyxZQUFBLENBQUFuQyxZQUFBO0lBQUFvQyxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBcEIsT0FBQSxFQUFVO01BQ047TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDZixPQUFPLENBQUNJLE1BQU0sRUFBRTtRQUN0QixJQUFJLElBQUksQ0FBQ0osT0FBTyxDQUFDRyxPQUFPLEVBQUU7VUFDdEI7VUFDQSxJQUFJdUIsU0FBUyxHQUFHLElBQUksQ0FBQzFCLE9BQU8sQ0FBQ0csT0FBTyxDQUFDaUMsWUFBWSxDQUFDLENBQUM7VUFDbkQ7VUFDQSxJQUFJLENBQUNwQyxPQUFPLENBQUNJLE1BQU0sR0FBR3NCLFNBQVMsQ0FBQ1csU0FBUztRQUM3QztNQUNKO01BQ0EsSUFBSSxJQUFJLENBQUNYLFNBQVMsRUFBRTtRQUNoQixJQUFJLENBQUMxQixPQUFPLENBQUNJLE1BQU0sQ0FBQ2tDLFdBQVcsQ0FBQyxJQUFJLENBQUNaLFNBQVMsQ0FBQztNQUNuRDtJQUNKOztJQUVBO0lBQ0E7SUFDQTs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUFRLEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUFMLFlBQWE5QixPQUFPLEVBQUU7TUFDbEI7TUFDQSxJQUFJLENBQUNBLE9BQU8sR0FBR0EsT0FBTztNQUV0QixJQUFJLElBQUksQ0FBQ0EsT0FBTyxDQUFDRyxPQUFPLEVBQUU7UUFDdEI7TUFBQTtNQUdKLElBQUksSUFBSSxDQUFDSCxPQUFPLENBQUNJLE1BQU0sRUFBRTtRQUNyQjtNQUFBO01BR0osSUFBSUMsTUFBTSxHQUFHLElBQUksQ0FBQ0wsT0FBTyxDQUFDSyxNQUFNO01BQy9CQSxNQUFNLEdBQUksSUFBSSxDQUFDa0MsU0FBUyxDQUFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDa0MsU0FBUyxDQUFDLEVBQUUsQ0FBQztNQUV0RCxJQUFJLENBQUMsSUFBSSxDQUFDdkMsT0FBTyxDQUFDTSxJQUFJLEVBQUU7UUFDcEIsSUFBSSxDQUFDa0MsT0FBTyxDQUFDLFFBQVEsQ0FBQztNQUMxQjtNQUVBLElBQUksQ0FBQyxJQUFJLENBQUN4QyxPQUFPLENBQUNPLEtBQUssRUFBRTtRQUNyQixJQUFJLENBQUNrQyxRQUFRLENBQUMsVUFBVSxDQUFDO01BQzdCO01BRUEsSUFBSSxJQUFJLENBQUN6QyxPQUFPLENBQUNRLElBQUksS0FBS2tDLFNBQVMsRUFBRTtRQUNqQyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7TUFDdkI7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUFULEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUFKLGNBQUEsRUFBaUI7TUFBQSxJQUFBYSxNQUFBO01BQ2I7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBOztNQUVBO01BQ0EsSUFBSXJDLEtBQUssR0FBRyxJQUFJLENBQUNQLE9BQU8sQ0FBQ08sS0FBSztNQUM5QixJQUFJLElBQUksQ0FBQ1AsT0FBTyxDQUFDUSxJQUFJLEVBQUU7UUFDbkJELEtBQUssR0FBRyxJQUFJLENBQUNxQixJQUFJLEdBQUcsSUFBSSxDQUFDNUIsT0FBTyxDQUFDTyxLQUFLO01BQzFDO01BRUEsSUFBSXNDLEdBQUcsR0FBR2hDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztNQUN2QytCLEdBQUcsQ0FBQ3hCLEVBQUUsR0FBRyxJQUFJLENBQUN5QixPQUFPLENBQUMsbUJBQW1CLENBQUM7TUFDMUNELEdBQUcsQ0FBQ0UsU0FBUyxHQUFHLHVCQUF1Qjs7TUFFdkM7TUFDQTtNQUNBLElBQUlwQixNQUFNLEdBQUcsSUFBSSxDQUFDcUIsWUFBWSwrREFBQUMsTUFBQSxDQUVoQixJQUFJLENBQUNILE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyw0RUFBQUcsTUFBQSxDQUUzQjFDLEtBQUssa0JBQ3JCLENBQUM7O01BRUY7TUFDQSxJQUFJLENBQUNvQixNQUFNLEdBQUdBLE1BQU0sQ0FBQ3VCLFVBQVU7TUFDL0IsSUFBSSxJQUFJLENBQUN2QixNQUFNLEVBQUU7UUFDYixJQUFJLENBQUNBLE1BQU0sQ0FBQ3dCLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxVQUFDQyxDQUFDO1VBQUEsT0FBS1IsTUFBSSxDQUFDUyxtQkFBbUIsQ0FBQ0QsQ0FBQyxDQUFDO1FBQUEsRUFBQztNQUM3RTtNQUNBUCxHQUFHLENBQUNQLFdBQVcsQ0FBQ1gsTUFBTSxDQUFDdUIsVUFBVSxDQUFDOztNQUVsQztNQUNBO01BQ0EsSUFBSTFDLElBQUksR0FBRyxJQUFJLENBQUN3QyxZQUFZLG1EQUFBQyxNQUFBLENBQ1UsSUFBSSxDQUFDcEIsZUFBZSw0SkFBQW9CLE1BQUEsQ0FHaEIsSUFBSSxDQUFDN0IsR0FBRywwVEFBQTZCLE1BQUEsQ0FPWixJQUFJLENBQUM3QixHQUFHLHNUQUFBNkIsTUFBQSxDQU9SLElBQUksQ0FBQzdCLEdBQUcsd01BTTdDLENBQUM7TUFFRixJQUFJLENBQUNaLElBQUksR0FBR0EsSUFBSSxDQUFDMEMsVUFBVTtNQUMzQixJQUFJLElBQUksQ0FBQzFDLElBQUksRUFBRTtRQUNYLElBQUksSUFBSSxDQUFDUixPQUFPLENBQUNRLElBQUksRUFBRTtVQUNuQixJQUFJdUMsU0FBUyxHQUFHLElBQUksQ0FBQ3ZDLElBQUksQ0FBQ3VDLFNBQVM7VUFDbkMsSUFBSSxDQUFDdkMsSUFBSSxDQUFDdUMsU0FBUyxHQUFHQSxTQUFTLENBQUNPLE9BQU8sQ0FBQyxJQUFJLENBQUN6QixlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ3JFO1FBQ0EsSUFBSTBCLE1BQU0sR0FBRyxJQUFJLENBQUMvQyxJQUFJLENBQUNnRCxnQkFBZ0IscUNBQW1DLENBQUM7UUFDM0VELE1BQU0sQ0FBQ0UsT0FBTyxDQUFDLFVBQUNDLEtBQUssRUFBSztVQUN0QjtVQUNBLElBQUlBLEtBQUssQ0FBQ3JDLEVBQUUsQ0FBQ3NDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLFFBQVEsQ0FBQ2hCLE1BQUksQ0FBQzVDLE9BQU8sQ0FBQ0ssTUFBTSxDQUFDc0QsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BFRCxLQUFLLENBQUNHLE9BQU8sR0FBRyxJQUFJO1VBQ3hCO1VBQ0E7VUFDQUgsS0FBSyxDQUFDUCxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsVUFBQ0MsQ0FBQyxFQUFLO1lBQ3BDUixNQUFJLENBQUNMLFNBQVMsQ0FBQ2EsQ0FBQyxDQUFDaEQsTUFBTSxDQUFDK0IsS0FBSyxDQUFDO1VBQ2xDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQztNQUNOO01BQ0FVLEdBQUcsQ0FBQ1AsV0FBVyxDQUFDOUIsSUFBSSxDQUFDMEMsVUFBVSxDQUFDO01BRWhDLElBQUksQ0FBQ3hCLFNBQVMsR0FBR21CLEdBQUc7SUFDeEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOSTtJQUFBWCxHQUFBO0lBQUFDLEtBQUEsRUFPQSxTQUFBYSxhQUFjYyxHQUFHLEVBQUU7TUFDZixJQUFJQyxPQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FBQSxFQUFlO1FBQ3RCLElBQUksQ0FBQ0MsTUFBTSxDQUFDQyxTQUFTLEVBQUUsT0FBTyxLQUFLO1FBQ25DLElBQUlDLE1BQU0sR0FBRyxJQUFJRCxTQUFTLENBQUMsQ0FBQztRQUM1QixJQUFJO1VBQ0FDLE1BQU0sQ0FBQ0MsZUFBZSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUM7UUFDNUMsQ0FBQyxDQUFDLE9BQU9DLEdBQUcsRUFBRTtVQUNWLE9BQU8sS0FBSztRQUNoQjtRQUNBLE9BQU8sSUFBSTtNQUNmLENBQUM7O01BRUQ7TUFDQSxJQUFJTCxPQUFPLENBQUMsQ0FBQyxFQUFFO1FBQ1gsSUFBSUcsTUFBTSxHQUFHLElBQUlELFNBQVMsQ0FBQyxDQUFDO1FBQzVCLElBQUlJLEdBQUcsR0FBR0gsTUFBTSxDQUFDQyxlQUFlLENBQUNMLEdBQUcsRUFBRSxXQUFXLENBQUM7UUFDbEQsT0FBT08sR0FBRyxDQUFDQyxJQUFJO01BQ25COztNQUVBO01BQ0EsSUFBSUMsR0FBRyxHQUFHMUQsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO01BQ3ZDeUQsR0FBRyxDQUFDQyxTQUFTLEdBQUdWLEdBQUc7TUFDbkIsT0FBT1MsR0FBRztJQUNkOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBckMsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQXNDLG1CQUFBLEVBQXNCO01BQ2xCO01BQ0E7TUFDQTtNQUNBLElBQUksSUFBSSxDQUFDekUsT0FBTyxDQUFDRyxPQUFPLElBQ3BCLE9BQU8sSUFBSSxDQUFDSCxPQUFPLENBQUNHLE9BQU8sQ0FBQ2lDLFlBQVksS0FBSyxVQUFVLElBQ3ZELE9BQU8sSUFBSSxDQUFDcEMsT0FBTyxDQUFDRyxPQUFPLENBQUN1RSxRQUFRLEtBQUssVUFBVSxFQUFFO1FBQ3JELE9BQU8sSUFBSTtNQUNmO01BQ0EsT0FBTyxLQUFLO0lBQ2hCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBeEMsR0FBQTtJQUFBQyxLQUFBLEVBUUEsU0FBQXdDLGVBQWdCQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFO01BQUEsSUFBQUMsTUFBQTtNQUNoQyxJQUFJQyxNQUFNLEdBQUcsSUFBSTtNQUNqQixJQUFJLENBQUNKLEtBQUssRUFBRTtRQUNSakYsTUFBTSxDQUFDc0YsSUFBSSxDQUFDLHNEQUFzRCxDQUFDO1FBQ25FLE9BQU9ELE1BQU07TUFDakI7TUFDQSxJQUFJLENBQUNKLEtBQUssQ0FBQ00sU0FBUyxDQUFDLENBQUMsSUFDbEIsQ0FBQ04sS0FBSyxDQUFDTSxTQUFTLENBQUMsQ0FBQyxDQUFDQyxXQUFXLENBQUMsQ0FBQyxJQUNoQyxDQUFDUCxLQUFLLENBQUNNLFNBQVMsQ0FBQyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE1BQU0sRUFBRTtRQUN6Q3pGLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQywyQ0FBMkMsQ0FBQztRQUN4RCxPQUFPRCxNQUFNO01BQ2pCOztNQUVBO01BQ0E7TUFDQTtNQUNBO01BQ0FKLEtBQUssQ0FBQ00sU0FBUyxDQUFDLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUMsQ0FBQzFCLE9BQU8sQ0FBQyxVQUFDNEIsT0FBTyxFQUFLO1FBQ2pELElBQUlQLEtBQUssR0FBR08sT0FBTyxDQUFDQyxRQUFRLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUNSLEtBQUssSUFBSSxPQUFPQyxNQUFJLENBQUMvRSxPQUFPLENBQUNHLE9BQU8sQ0FBQ21GLFFBQVEsS0FBSyxVQUFVLEVBQUU7VUFDL0RELE9BQU8sQ0FBQ0UsUUFBUSxDQUFDUixNQUFJLENBQUMvRSxPQUFPLENBQUNHLE9BQU8sQ0FBQ21GLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckQ7TUFDSixDQUFDLENBQUM7O01BRUY7TUFDQSxJQUFJdEYsT0FBTyxHQUFHO1FBQ1Z3RixZQUFZLEVBQUdWO01BQ25CLENBQUM7TUFDRCxJQUFJRCxJQUFJLEVBQUU7UUFDTjtRQUNBO1FBQ0E3RSxPQUFPLENBQUN5RixVQUFVLEdBQUc7VUFDakIsb0JBQW9CLEVBQUdaO1FBQzNCLENBQUM7TUFDTDtNQUVBLElBQUlhLFNBQVMsR0FBRyxJQUFJO01BQ3BCLFFBQVEsSUFBSSxDQUFDMUYsT0FBTyxDQUFDSyxNQUFNLENBQUNzRCxXQUFXLENBQUMsQ0FBQztRQUNyQyxLQUFLLEtBQUs7VUFDTjNELE9BQU8sQ0FBQzJGLFdBQVcsR0FBRyxJQUFJO1VBQzFCM0YsT0FBTyxDQUFDNEYsY0FBYyxHQUFHLElBQUk7VUFDN0JGLFNBQVMsR0FBRyxJQUFJRyxvREFBVyxDQUFDN0YsT0FBTyxDQUFDO1VBQ3BDO1FBQ0osS0FBSyxLQUFLO1VBQ04wRixTQUFTLEdBQUcsSUFBSUksb0RBQVcsQ0FBQzlGLE9BQU8sQ0FBQztVQUNwQztRQUNKLEtBQUssU0FBUztVQUNWMEYsU0FBUyxHQUFHLElBQUlLLHdEQUFlLENBQUMvRixPQUFPLENBQUM7VUFDeEM7UUFDSjtVQUNJO01BQ1I7TUFFQSxJQUFJLENBQUMwRixTQUFTLEVBQUU7UUFDWi9GLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQywwQ0FBMEMsQ0FBQztRQUN2RCxPQUFPRCxNQUFNO01BQ2pCO01BRUEsSUFBSWdCLFFBQVEsR0FBR3BCLEtBQUssQ0FBQ00sU0FBUyxDQUFDLENBQUMsQ0FBQ2UsYUFBYSxDQUFDLENBQUM7O01BRWhEO01BQ0E7TUFDQTtNQUNBLElBQUlDLEdBQUcsR0FBRyxJQUFJLENBQUNDLE1BQU0sQ0FBQyxDQUFDO01BQ3ZCLElBQUlELEdBQUcsRUFBRTtRQUNMRixRQUFRLEdBQUdBLFFBQVEsSUFBSUUsR0FBRyxDQUFDRSxPQUFPLENBQUMsQ0FBQyxDQUFDSCxhQUFhLENBQUMsQ0FBQztNQUN4RDtNQUVBLElBQUlJLFFBQVEsR0FBR3pCLEtBQUssQ0FBQ00sU0FBUyxDQUFDLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7O01BRTlDO01BQ0E7TUFDQUgsTUFBTSxHQUFHVSxTQUFTLENBQUNZLGFBQWEsQ0FBQ0QsUUFBUSxFQUFFO1FBQ3ZDRSxjQUFjLEVBQUcsV0FBVztRQUM1QkMsaUJBQWlCLEVBQUdSLFFBQVEsSUFBSTtNQUNwQyxDQUFDLENBQUM7TUFFRixPQUFPaEIsTUFBTTtJQUNqQjtJQUNBO0lBQ0E7SUFDQTs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtFQUhJO0lBQUE5QyxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBa0Isb0JBQXFCRCxDQUFDLEVBQUU7TUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQ3FCLGtCQUFrQixDQUFDLENBQUMsRUFBRTtRQUM1QjlFLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQztRQUN6RDtNQUNKO01BRUEsSUFBSUwsS0FBSyxHQUFHLElBQUksQ0FBQzVFLE9BQU8sQ0FBQ0csT0FBTyxDQUFDdUUsUUFBUSxDQUFDLENBQUM7TUFDM0MsSUFBSUcsSUFBSSxHQUFJLElBQUksQ0FBQzdFLE9BQU8sQ0FBQ0csT0FBTyxDQUFDc0csT0FBTyxLQUFLL0QsU0FBUyxHQUFJLElBQUksQ0FBQzFDLE9BQU8sQ0FBQ0csT0FBTyxDQUFDc0csT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDN0YsSUFBSTNCLEtBQUssR0FBSSxJQUFJLENBQUM5RSxPQUFPLENBQUNHLE9BQU8sQ0FBQ21GLFFBQVEsS0FBSzVDLFNBQVMsR0FBSSxJQUFJLENBQUMxQyxPQUFPLENBQUNHLE9BQU8sQ0FBQ21GLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BRWhHLElBQUlvQixPQUFPLEdBQUcsSUFBSSxDQUFDL0IsY0FBYyxDQUFDQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsS0FBSyxDQUFDO01BQ3JELElBQUksQ0FBQzRCLE9BQU8sSUFBSUEsT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUNoQztNQUNKOztNQUVBO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ1EsSUFBSSxDQUFDQyxhQUFhLENBQUM7UUFDZkMsSUFBSSxFQUFHLGdCQUFnQjtRQUN2QkYsT0FBTyxFQUFHQTtNQUNkLENBQUMsQ0FBQzs7TUFFRjtNQUNBO01BQ0EsSUFBSSxJQUFJLENBQUMxRyxPQUFPLENBQUNTLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQ1QsT0FBTyxDQUFDUyxRQUFRLEtBQUssVUFBVSxFQUFFO1FBQ3RFLElBQUksQ0FBQ1QsT0FBTyxDQUFDUyxRQUFRLENBQUNpRyxPQUFPLENBQUM7UUFDOUI7TUFDSjtNQUVBLElBQUlHLElBQUksR0FBR2hHLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEdBQUcsQ0FBQztNQUN0QztNQUNBLElBQUlnRyxPQUFPLEdBQUcsT0FBTztNQUNyQkQsSUFBSSxDQUFDRSxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUN0RixRQUFRLEdBQUcsV0FBVyxHQUFHcUYsT0FBTyxHQUFHLEdBQUcsR0FBR0Usa0JBQWtCLENBQUNOLE9BQU8sQ0FBQyxDQUFDO01BQzlHRyxJQUFJLENBQUNFLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDL0csT0FBTyxDQUFDTSxJQUFJLEdBQUcsSUFBSSxDQUFDa0IsU0FBUyxDQUFDO01BQ2pFLElBQUlYLFFBQVEsQ0FBQ29HLFdBQVcsRUFBRTtRQUN0QixJQUFJQyxLQUFLLEdBQUdyRyxRQUFRLENBQUNvRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQy9DQyxLQUFLLENBQUNDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztRQUNwQ04sSUFBSSxDQUFDRixhQUFhLENBQUNPLEtBQUssQ0FBQztNQUM3QixDQUFDLE1BQU07UUFDSEwsSUFBSSxDQUFDTyxLQUFLLENBQUMsQ0FBQztNQUNoQjtJQUNKOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBbEYsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQWtGLFdBQVlsSCxPQUFPLEVBQUU7TUFDakIsSUFBSSxDQUFDSCxPQUFPLENBQUNHLE9BQU8sR0FBR0EsT0FBTztJQUNsQzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQStCLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFtRixVQUFXbEgsTUFBTSxFQUFFO01BQ2YsSUFBSSxDQUFDSixPQUFPLENBQUNJLE1BQU0sR0FBR0EsTUFBTTtJQUNoQzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQThCLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFJLFVBQVdsQyxNQUFNLEVBQUU7TUFDZixJQUFJLENBQUNMLE9BQU8sQ0FBQ0ssTUFBTSxHQUFHQSxNQUFNLENBQUNzRCxXQUFXLENBQUMsQ0FBQztNQUMxQyxRQUFRLElBQUksQ0FBQzNELE9BQU8sQ0FBQ0ssTUFBTTtRQUN2QixLQUFLLEtBQUs7VUFDTixJQUFJLENBQUNtQixTQUFTLEdBQUcsTUFBTTtVQUN2QixJQUFJLENBQUNDLFFBQVEsR0FBRyxzQ0FBc0M7VUFDdEQ7UUFDSixLQUFLLEtBQUs7VUFDTixJQUFJLENBQUNELFNBQVMsR0FBRyxNQUFNO1VBQ3ZCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLHFCQUFxQjtVQUNyQztRQUNKLEtBQUssU0FBUztVQUNWLElBQUksQ0FBQ0QsU0FBUyxHQUFHLFVBQVU7VUFDM0IsSUFBSSxDQUFDQyxRQUFRLEdBQUcsc0JBQXNCO1VBQ3RDO1FBQ0o7VUFDSTtVQUNBLElBQUksQ0FBQ3pCLE9BQU8sQ0FBQ0ssTUFBTSxHQUFHLFNBQVM7VUFDL0IsSUFBSSxDQUFDbUIsU0FBUyxHQUFHLFVBQVU7VUFDM0IsSUFBSSxDQUFDQyxRQUFRLEdBQUcsc0JBQXNCO1VBQ3RDO01BQ1I7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQVMsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQUssUUFBU2xDLElBQUksRUFBRTtNQUNYLElBQUksQ0FBQ04sT0FBTyxDQUFDTSxJQUFJLEdBQUdBLElBQUk7SUFDNUI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUE0QixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBTSxTQUFVbEMsS0FBSyxFQUFFO01BQ2IsSUFBSSxDQUFDUCxPQUFPLENBQUNPLEtBQUssR0FBR0EsS0FBSztNQUMxQixJQUFJLElBQUksQ0FBQ29CLE1BQU0sRUFBRTtRQUNiO1FBQ0EsSUFBSSxDQUFDQSxNQUFNLENBQUNRLEtBQUssR0FBSSxJQUFJLENBQUNuQyxPQUFPLENBQUNRLElBQUksR0FBSSxJQUFJLENBQUNvQixJQUFJLEdBQUdyQixLQUFLLEdBQUdBLEtBQUs7TUFDdkU7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQTJCLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFRLFFBQVM0RSxNQUFNLEVBQUU7TUFBQSxJQUFBQyxNQUFBO01BQ2IsSUFBSSxDQUFDeEgsT0FBTyxDQUFDUSxJQUFJLEdBQUcrRyxNQUFNO01BQzFCLElBQUksSUFBSSxDQUFDNUYsTUFBTSxFQUFFO1FBQ2I7UUFDQSxJQUFJLENBQUNBLE1BQU0sQ0FBQ1EsS0FBSyxHQUFJLElBQUksQ0FBQ25DLE9BQU8sQ0FBQ1EsSUFBSSxHQUFJLElBQUksQ0FBQ29CLElBQUksR0FBRyxJQUFJLENBQUM1QixPQUFPLENBQUNPLEtBQUssR0FBRyxJQUFJLENBQUNQLE9BQU8sQ0FBQ08sS0FBSztNQUNqRztNQUNBLElBQUksSUFBSSxDQUFDQyxJQUFJLElBQUksSUFBSSxDQUFDUixPQUFPLENBQUNRLElBQUksRUFBRTtRQUNoQztRQUNBLElBQUl1QyxTQUFTLEdBQUcsSUFBSSxDQUFDdkMsSUFBSSxDQUFDdUMsU0FBUztRQUNuQyxJQUFJLENBQUN2QyxJQUFJLENBQUN1QyxTQUFTLEdBQUdBLFNBQVMsQ0FBQ08sT0FBTyxDQUFDLElBQUksQ0FBQ3pCLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDakU7UUFDQSxJQUFJMEIsTUFBTSxHQUFHLElBQUksQ0FBQy9DLElBQUksQ0FBQ2dELGdCQUFnQixxQ0FBbUMsQ0FBQztRQUMzRUQsTUFBTSxDQUFDRSxPQUFPLENBQUMsVUFBQ0MsS0FBSyxFQUFLO1VBQ3RCO1VBQ0EsSUFBSUEsS0FBSyxDQUFDckMsRUFBRSxDQUFDc0MsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDNEQsTUFBSSxDQUFDeEgsT0FBTyxDQUFDSyxNQUFNLENBQUNzRCxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEVELEtBQUssQ0FBQ0csT0FBTyxHQUFHLElBQUk7VUFDeEI7UUFDSixDQUFDLENBQUM7TUFDTjtJQUNKO0VBQUM7QUFBQSxFQXhsQnNCNEQseURBQU87QUEwbEJqQzs7QUFFRDtBQUNBQyxxREFBSyxDQUFDQyxNQUFNLENBQUM3SCxZQUFZLENBQUM4SCxTQUFTLEVBQUVDLGtFQUFTLENBQUM7QUFFaEMvSCwyRUFBWSxFQUFDOztBQUU1QjtBQUNBLElBQUlrRSxNQUFNLENBQUM4RCxFQUFFLElBQUk5RCxNQUFNLENBQUM4RCxFQUFFLENBQUMzSCxPQUFPLEVBQUU7RUFDaEM2RCxNQUFNLENBQUM4RCxFQUFFLENBQUMzSCxPQUFPLENBQUM0SCxNQUFNLEdBQUdqSSxZQUFZO0FBQzNDIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRXhwb3J0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IENTU1xuaW1wb3J0IFwiLi4vQ1NTL0NvbnRyb2xzL0V4cG9ydC9HUGV4cG9ydE9wZW5MYXllcnMuY3NzXCI7XG5cbi8vIGltcG9ydCBPcGVuTGF5ZXJzXG5pbXBvcnQgQ29udHJvbCBmcm9tIFwib2wvY29udHJvbC9Db250cm9sXCI7XG5cbi8vIGltcG9ydCBsb2NhbFxuaW1wb3J0IElEIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvU2VsZWN0b3JJRFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxuLy8gaW1wb3J0IGxvY2FsIHdpdGggb2wgZGVwZW5kZW5jaWVzXG5pbXBvcnQgS01MRXh0ZW5kZWQgZnJvbSBcIi4uL0Zvcm1hdHMvS01MXCI7XG5pbXBvcnQgR2VvSlNPTkV4dGVuZGVkIGZyb20gXCIuLi9Gb3JtYXRzL0dlb0pTT05cIjtcbmltcG9ydCBHUFhFeHRlbmRlZCBmcm9tIFwiLi4vRm9ybWF0cy9HUFhcIjtcblxuLy8gRE9NXG5pbXBvcnQgRXhwb3J0RE9NIGZyb20gXCIuLi8uLi9Db21tb24vQ29udHJvbHMvRXhwb3J0RE9NXCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZXhwb3J0XCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBFeHBvcnQgYnV0dG9uXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuY29udHJvbC5FeHBvcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5mb3JtYXQgPSBcImdlb2pzb25cIl0gLSBnZW9qc29uIC8ga21sIC8gZ3B4XG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubmFtZSA9IFwiZXhwb3J0XCJdIC0gZXhwb3J0IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZSA9IFwiRXhwb3J0ZXJcIl0gLSBidXR0b24gbmFtZVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZW51ID0gZmFsc2VdIC0gZGlzcGxheXMgdGhlIGZvcm1hdCBjaG9pY2UgbWVudVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25FeHBvcnRdIC0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gW29wdGlvbnMudGFyZ2V0XSAtIHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuY29udHJvbCAtIGluc3RhbmNlIG9mIGNvbnRyb2xcbiAqIEBmaXJlcyBleHBvcnQ6Y29tcHV0ZVxuICogQGV4YW1wbGVcbiAqIC8vIHBsdWdndWVkIHdpZGdldCBFeHBvcnQgaW50byBjb250cm9sIElzb2N1cnZlXG4gKiB2YXIgaXNvID0gbmV3IG9sLmNvbnRyb2wuSXNvY3VydmUoKTtcbiAqIG1hcC5hZGRDb250cm9sKGlzbyk7XG4gKlxuICogLy8gbWV0aG9kIDogY2FsbCByZW5kZXIoKVxuICogdmFyIGV4cG9ydCA9IG5ldyBCdXR0b25FeHBvcnQoKTtcbiAqIGV4cG9ydC5zZXRDb250cm9sKGlzbyk7XG4gKiBleHBvcnQuc2V0VGFyZ2V0KDwhLS0gRE9NRWxlbWVudCAtLT4pO1xuICogZXhwb3J0LnNldE5hbWUoXCJleHBvcnRcIik7XG4gKiBleHBvcnQuc2V0Rm9ybWF0KFwiZ2VvanNvblwiKTtcbiAqIGV4cG9ydC5zZXRUaXRsZShcIkV4cG9ydGVyXCIpO1xuICogZXhwb3J0LnNldE1lbnUoZmFsc2UpO1xuICogZXhwb3J0LnJlbmRlcigpOyAvLyA8LS0gZGlyZWN0IGNhbGwgdG8gcmVuZGVyIGZ1bmN0aW9uICFcbiAqIGV4cG9ydC5vbihcImV4cG9ydDpjb21wdXRlXCIsIChkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGRhdGEpOyB9KTtcbiAqXG4gKiAvLyBtZXRob2QgOiBjYWxsIG1hcC5hZGRDb250cm9sKClcbiAqIHZhciBleHBvcnQgPSBuZXcgQnV0dG9uRXhwb3J0KCk7XG4gKiBleHBvcnQuc2V0Q29udHJvbChpc28pO1xuICogZXhwb3J0LnNldFRhcmdldCg8IS0tIERPTUVsZW1lbnQgLS0+KTtcbiAqIGV4cG9ydC5zZXROYW1lKFwiZXhwb3J0XCIpO1xuICogZXhwb3J0LnNldEZvcm1hdChcImdlb2pzb25cIik7XG4gKiBleHBvcnQuc2V0VGl0bGUoXCJFeHBvcnRlclwiKTtcbiAqIGV4cG9ydC5zZXRNZW51KGZhbHNlKTtcbiAqIGV4cG9ydC5vbihcImV4cG9ydDpjb21wdXRlXCIsIChkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGRhdGEpOyB9KTtcbiAqIG1hcC5hZGRDb250cm9sKGV4cG9ydCk7IC8vIDwtLSB1c2luZyB0aGUgT3BlbkxheWVycyBtZWNoYW5pc20sIGRvbid0IGNhbGwgdG8gcmVuZGVyIGZ1bmN0aW9uICFcbiAqXG4gKiAvLyB1c2UgY29udHJvbCBvcHRpb25zIGluc3RlYWQgb2Ygc2V0dGVyc1xuICogdmFyIGV4cG9ydCA9IG5ldyBCdXR0b25FeHBvcnQoe1xuICogICBjb250cm9sIDogaXNvLFxuICogICB0YXJnZXQgOiA8IS0tIERPTUVsZW1lbnQgLS0+LFxuICogICBuYW1lIDogXCJleHBvcnRcIixcbiAqICAgZm9ybWF0IDogXCJnZW9qc29uXCIsXG4gKiAgIHRpdGxlIDogXCJFeHBvcnRlclwiLFxuICogICBtZW51IDogZmFsc2VcbiAqIH0pO1xuICogbWFwLmFkZENvbnRyb2woZXhwb3J0KTtcbiAqXG4gKiAvLyBtZXRob2Qgd2l0aCBwYXNzaW5nIG9wdGlvbiBpbnRvIHRoZSBjb250cm9sIElzb2N1cnZlXG4gKiB2YXIgaXNvID0gbmV3IG9sLmNvbnRyb2wuSXNvY3VydmUoeyBleHBvcnQgOiB0cnVlIH0pO1xuICogLy8gd2l0aCBjb250cm9sIG9wdGlvbnMgOlxuICogdmFyIGlzbyA9IG5ldyBvbC5jb250cm9sLklzb2N1cnZlKHsgZXhwb3J0IDoge1xuICogICBuYW1lIDogXCJleHBvcnRcIixcbiAqICAgZm9ybWF0IDogXCJnZW9qc29uXCIsXG4gKiAgIHRpdGxlIDogXCJFeHBvcnRlclwiLFxuICogICBtZW51IDogZmFsc2VcbiAqIH19KTtcbiAqL1xuY2xhc3MgQnV0dG9uRXhwb3J0IGV4dGVuZHMgQ29udHJvbCB7XG5cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIG9sLmNvbnRyb2wuRXhwb3J0fVxuICAgICAqIEBtb2R1bGUgQnV0dG9uRXhwb3J0XG4gICAgICogQGFsaWFzIG1vZHVsZTp+Q29udHJvbHMvQnV0dG9uRXhwb3J0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGltcG9ydCBCdXR0b25FeHBvcnQgZnJvbSBcInNyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0V4cG9ydFwiXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgY29udHJvbCA6IG51bGwsXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgZm9ybWF0IDogXCJnZW9qc29uXCIsXG4gICAgICAgICAgICBuYW1lIDogXCJleHBvcnRcIixcbiAgICAgICAgICAgIHRpdGxlIDogXCJFeHBvcnRlclwiLFxuICAgICAgICAgICAgbWVudSA6IGZhbHNlLFxuICAgICAgICAgICAgb25FeHBvcnQgOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiW2NvbnN0cnVjdG9yXSBFeHBvcnRcIiwgb3B0aW9ucyk7XG5cbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgZWxlbWVudCA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICByZW5kZXIgOiBvcHRpb25zLnJlbmRlcixcbiAgICAgICAgICAgIHRhcmdldCA6IG9wdGlvbnMudGFyZ2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdXR0b25FeHBvcnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzcG9uc2UgdG8gdGhlIGV4cG9ydCBvZiB0aGUgcm91dGUgY2FsY3VsYXRpb25cbiAgICAgICAgICogKG9ubHkgZm9yIGpzZG9jKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAvLyBHZW9KU09OIGZvcm1hdFxuICAgICAgICAgKiB7XG4gICAgICAgICAqICAgXCJ0eXBlXCI6XCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICAgICAgICAgKiAgIFwiZmVhdHVyZXNcIjpbLi4uXSxcbiAgICAgICAgICogICBcImdlb3BvcnRhaWw6Y29tcHV0ZVwiOntcbiAgICAgICAgICogICAgIFwicG9pbnRzXCI6WyBbMi41ODgwMjQyMTAxMzQ4ODcsIDQ4Ljg0MTkyNjc4MjkzMDAyIF0gXSxcbiAgICAgICAgICogICAgIFwidHJhbnNwb3J0XCI6XCJWb2l0dXJlXCIsXG4gICAgICAgICAqICAgICBcImV4Y2x1c2lvbnNcIjpbLi4uXSxcbiAgICAgICAgICogICAgIFwiY29tcHV0YXRpb25cIjpcImZhc3Rlc3RcIixcbiAgICAgICAgICogICAgIFwicmVzdWx0c1wiOnsgPCEtLSBTZXJ2aWNlIC0tPiB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvR3AuU2VydmljZXMuUm91dGVSZXNwb25zZS5odG1sfFNlcnZpY2V9XG4gICAgICAgICAqL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgdGhpcy5FWFBPUlRfUk9VVEUgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzcG9uc2UgdG8gdGhlIGV4cG9ydCBvZiB0aGUgaXNvY2hyb24gY2FsY3VsYXRpb25cbiAgICAgICAgICogKG9ubHkgZm9yIGpzZG9jKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAvLyBHZW9KU09OIGZvcm1hdFxuICAgICAgICAgKiB7XG4gICAgICAgICAqICAgIFwidHlwZVwiOlwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgICAgICogICAgXCJmZWF0dXJlc1wiOlsuLi5dLFxuICAgICAgICAgKiAgICBcImdlb3BvcnRhaWw6Y29tcHV0ZVwiOntcbiAgICAgICAgICogICAgICAgXCJ0cmFuc3BvcnRcIjpcIlBpZXRvblwiLFxuICAgICAgICAgKiAgICAgICBcImNvbXB1dGF0aW9uXCI6XCJ0aW1lXCIsXG4gICAgICAgICAqICAgICAgIFwiZXhjbHVzaW9uc1wiOltcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgXSxcbiAgICAgICAgICogICAgICAgXCJkaXJlY3Rpb25cIjpcImRlcGFydHVyZVwiLFxuICAgICAgICAgKiAgICAgICBcInBvaW50XCI6WyAyLjU4NzgzNTM4MjcxODQ2NCwgNDguODQxOTI2NzgyOTMwMDIgXSxcbiAgICAgICAgICogICAgICAgXCJyZXN1bHRzXCI6e1xuICAgICAgICAgKiAgICAgICAgICBcIm1lc3NhZ2VcIjpcIlwiLFxuICAgICAgICAgKiAgICAgICAgICBcImlkXCI6XCJcIixcbiAgICAgICAgICogICAgICAgICAgXCJsb2NhdGlvblwiOntcbiAgICAgICAgICogICAgICAgICAgICAgXCJ4XCI6XCIyLjU4NzgzNTM4MjcxODQ2NFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBcInlcIjpcIjQ4Ljg0MTkyNjc4MjkzMDAyXCJcbiAgICAgICAgICogICAgICAgICAgfSxcbiAgICAgICAgICogICAgICAgICAgXCJzcnNcIjpcIkVQU0c6NDMyNlwiLFxuICAgICAgICAgKiAgICAgICAgICBcImdlb21ldHJ5XCI6e1xuICAgICAgICAgKiAgICAgICAgICAgICBcInR5cGVcIjpcIlBvbHlnb25cIixcbiAgICAgICAgICogICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOltbLi4uXV1cbiAgICAgICAgICogICAgICAgICAgfSxcbiAgICAgICAgICogICAgICAgICBcInRpbWVcIjoxODAsXG4gICAgICAgICAqICAgICAgICAgXCJkaXN0YW5jZVwiOlwiXCJcbiAgICAgICAgICogICAgICB9XG4gICAgICAgICAqICAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2lnbmYuZ2l0aHViLmlvL2dlb3BvcnRhbC1hY2Nlc3MtbGliL2xhdGVzdC9qc2RvYy9HcC5TZXJ2aWNlcy5Jc29DdXJ2ZVJlc3BvbnNlLmh0bWx8U2VydmljZX1cbiAgICAgICAgICovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICB0aGlzLkVYUE9SVF9JU09DSFJPTiA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNwb25zZSB0byB0aGUgZXhwb3J0IG9mIHRoZSBwcm9maWxlIGNhbGN1bGF0aW9uXG4gICAgICAgICAqIChvbmx5IGZvciBqc2RvYylcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogLy8gR2VvSlNPTiBmb3JtYXRcbiAgICAgICAgICoge1xuICAgICAgICAgKiAgXCJ0eXBlXCI6XCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICAgICAgICAgKiAgIFwiZmVhdHVyZXNcIjpbLi4uXSxcbiAgICAgICAgICogICBcImdlb3BvcnRhaWw6Y29tcHV0ZVwiOntcbiAgICAgICAgICogICAgICBcImdyZWF0ZXJTbG9wZVwiOjc2LFxuICAgICAgICAgKiAgICAgIFwibWVhblNsb3BlXCI6NyxcbiAgICAgICAgICogICAgICBcImRpc3RhbmNlUGx1c1wiOjg0LFxuICAgICAgICAgKiAgICAgIFwiZGlzdGFuY2VNaW51c1wiOjQ4LFxuICAgICAgICAgKiAgICAgIFwiYXNjZW5kaW5nRWxldmF0aW9uXCI6NSxcbiAgICAgICAgICogICAgICBcImRlc2NlbmRpbmdFbGV2YXRpb25cIjotNCxcbiAgICAgICAgICogICAgICBcImFsdE1pblwiOlwiOTIsMDRcIixcbiAgICAgICAgICogICAgICBcImFsdE1heFwiOlwiOTYsNzFcIixcbiAgICAgICAgICogICAgICBcImRpc3RhbmNlXCI6MTYzLFxuICAgICAgICAgKiAgICAgIFwidW5pdFwiOlwibVwiLFxuICAgICAgICAgKiAgICAgIFwicG9pbnRzXCI6W1xuICAgICAgICAgKiAgICAgICAge1xuICAgICAgICAgKiAgICAgICAgICAgIFwielwiOjk1LjY4LFxuICAgICAgICAgKiAgICAgICAgICAgIFwibG9uXCI6Mi41ODc0LFxuICAgICAgICAgKiAgICAgICAgICAgIFwibGF0XCI6NDguODQxOSxcbiAgICAgICAgICogICAgICAgICAgICBcImFjY1wiOjIuNSxcbiAgICAgICAgICogICAgICAgICAgICBcImRpc3RcIjowLFxuICAgICAgICAgKiAgICAgICAgICAgIFwic2xvcGVcIjowXG4gICAgICAgICAqICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIF1cbiAgICAgICAgICogICB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvR3AuU2VydmljZXMuQWx0aVJlc3BvbnNlLmh0bWx8U2VydmljZX1cbiAgICAgICAgICovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICB0aGlzLkVYUE9SVF9QUk9GSUxFID0ge307XG5cbiAgICAgICAgLy8gaWQgdW5pcXVlXG4gICAgICAgIHRoaXMudWlkID0gb3B0aW9ucy5pZCB8fCBJRC5nZW5lcmF0ZSgpO1xuXG4gICAgICAgIC8vIGV4cG9ydFxuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubWltZVR5cGUgPSBudWxsO1xuXG4gICAgICAgIC8vIGRvbVxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHRoaXMuYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZW51ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pY29uID0gXCJcXHUyNjMwIFwiO1xuICAgICAgICB0aGlzLm1lbnVDbGFzc0hpZGRlbiA9IFwiR1BleHBvcnRNZW51SGlkZGVuXCI7XG5cbiAgICAgICAgdGhpcy5pbml0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5pbml0Q29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXIgRE9NXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgLy8gY29udGFpbmVyIHByaW5jaXBhbFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udHJvbCkge1xuICAgICAgICAgICAgICAgIC8vIGluc2VydGlvbiBkdSBjb21wb3NhbnQgZGFucyBsZSBwYW5uZWF1IGR1IGNvbnRyb2xlXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5jb250cm9sLmdldENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIC8vIGV4LiBHUChpc298cm91dGUpUGFuZWwtXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcml2YXRlcyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBvcHRpb25zXG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW5pdE9wdGlvbnMgKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gb3B0aW9uc1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udHJvbCkge1xuICAgICAgICAgICAgLy8gLi4uXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gLi4uXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5vcHRpb25zLmZvcm1hdDtcbiAgICAgICAgKGZvcm1hdCkgPyB0aGlzLnNldEZvcm1hdChmb3JtYXQpIDogdGhpcy5zZXRGb3JtYXQoXCJcIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zZXROYW1lKFwiZXhwb3J0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VGl0bGUoXCJFeHBvcnRlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWVudSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1lbnUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjb250YWluZXJcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdG9kbyBtZW51IGRlcyBvcHRpb25zXG4gICAgICovXG4gICAgaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgLy8gbWVudSBkZXMgb3B0aW9ucyBkZSBsJ2V4cG9ydCA6XG4gICAgICAgIC8vICogWyBub20gXVxuICAgICAgICAvLyAqIGZvcm1hdFxuICAgICAgICAvLyBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2hvd3RvL2hvd3RvX2Nzc19kcm9wZG93bi5hc3BcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9ob3d0by9ob3d0b19jc3NfY3VzdG9tX2NoZWNrYm94LmFzcFxuXG4gICAgICAgIC8vIGFmZmljaGVyIGwnaWNvbmUgZHUgbWVudVxuICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWVudSkge1xuICAgICAgICAgICAgdGl0bGUgPSB0aGlzLmljb24gKyB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmlkID0gdGhpcy5fYWRkVUlEKFwiR1BleHBvcnRDb250YWluZXJcIik7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSBcIkdQZXhwb3J0TWVudUNvbnRhaW5lclwiO1xuXG4gICAgICAgIC8vIGJvdXRvbiBFeHBvcnRlclxuICAgICAgICAvLyB1dGlsaXNlciBsZXMgdGVtcGxhdGVzIGxpdGVyYWxzIGF2ZWMgbGEgc3Vic3RpdHV0aW9uICR7Li4ufVxuICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5zdHJpbmdUb0hUTUwoYFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlkPVwiJHt0aGlzLl9hZGRVSUQoXCJHUGV4cG9ydEJ1dHRvblwiKX1cIiBcbiAgICAgICAgICAgICAgICBjbGFzcz1cIkdQaW5wdXRTdWJtaXRcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0aXRsZX1cIj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGNsaWNrIGJ1dHRvblxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbi5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGhpcy5idXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4gdGhpcy5vbkNsaWNrQnV0dG9uRXhwb3J0KGUpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYnV0dG9uLmZpcnN0Q2hpbGQpO1xuXG4gICAgICAgIC8vIG1lbnUgZGVzIG9wdGlvbnNcbiAgICAgICAgLy8gdXRpbGlzZXIgbGVzIHRlbXBsYXRlcyBsaXRlcmFscyBhdmVjIGxhIHN1YnN0aXR1dGlvbiAkey4uLn1cbiAgICAgICAgdmFyIG1lbnUgPSB0aGlzLnN0cmluZ1RvSFRNTChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiR1BleHBvcnRNZW51Q29udGVudCAke3RoaXMubWVudUNsYXNzSGlkZGVufVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRhaW5lclwiPkdlb0pTT05cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJHUG1lbnVGb3JtYXRHZW9qc29uLSR7dGhpcy51aWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmb3JtYXRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiZ2VvanNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRhaW5lclwiPktNTFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cIkdQbWVudUZvcm1hdEttbC0ke3RoaXMudWlkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZm9ybWF0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImttbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRhaW5lclwiPkdQWFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cIkdQbWVudUZvcm1hdEdweC0ke3RoaXMudWlkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZm9ybWF0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImdweFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApO1xuXG4gICAgICAgIHRoaXMubWVudSA9IG1lbnUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRoaXMubWVudSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tZW51KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMubWVudS5jbGFzc05hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51LmNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKHRoaXMubWVudUNsYXNzSGlkZGVuLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByYWRpb3MgPSB0aGlzLm1lbnUucXVlcnlTZWxlY3RvckFsbChgaW5wdXRbdHlwZT1yYWRpb11bbmFtZT1cImZvcm1hdFwiXWApO1xuICAgICAgICAgICAgcmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gcmFkaW8gY2hlY2tlZCBwYXIgZGVmYXV0XG4gICAgICAgICAgICAgICAgaWYgKHJhZGlvLmlkLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXModGhpcy5vcHRpb25zLmZvcm1hdC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICByYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZWNvdXRldXIgcG91ciBjaGFuZ2VyIGRlIGZvcm1hdFxuICAgICAgICAgICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtYXQoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG1lbnUuZmlyc3RDaGlsZCk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIC0gLi4uXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IC0gLi4uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdHJpbmdUb0hUTUwgKHN0cikge1xuICAgICAgICB2YXIgc3VwcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghd2luZG93LkRPTVBhcnNlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhcInhcIiwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiBET01QYXJzZXIgaXMgc3VwcG9ydGVkLCB1c2UgaXRcbiAgICAgICAgaWYgKHN1cHBvcnQoKSkge1xuICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIHZhciBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN0ciwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gZG9jLmJvZHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGZhbGxiYWNrIHRvIG9sZC1zY2hvb2wgbWV0aG9kXG4gICAgICAgIHZhciBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkb20uaW5uZXJIVE1MID0gc3RyO1xuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIC4uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaXNQbHVnZ2FibGVDb250cm9sICgpIHtcbiAgICAgICAgLy8gdGVzdGVyIHRvdXRlcyBsZXMgbcOpdGhvZGVzIGRlcyB3aWRnZXRzIHBsdWdnYWJsZVxuICAgICAgICAvLyBsYSBtw6l0aG9kZSBnZXREYXRhKCkgbidlc3QgcGFzIG9ibGlnYXRvaXJlIGNhciBjZXJ0YWlucyB3aWRnZXRzXG4gICAgICAgIC8vIG4nb250IHBhcyBkZSBjb25maWd1cmF0aW9uLlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRyb2wgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRDb250YWluZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucy5jb250cm9sLmdldExheWVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAuLi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGF5ZXIgLSAuLi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gLi4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZV0gLSAuLi5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtIC4uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZXhwb3J0RmVhdHVyZXMgKGxheWVyLCBkYXRhLCBzdHlsZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJJbXBvc3NpYmxlIHRvIGV4cG9ydCA6IG5vIGxheWVyIGlzIGhvc3RpbmcgZmVhdHVyZXMuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxheWVyLmdldFNvdXJjZSgpIHx8XG4gICAgICAgICAgICAhbGF5ZXIuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKSB8fFxuICAgICAgICAgICAgIWxheWVyLmdldFNvdXJjZSgpLmdldEZlYXR1cmVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkltcG9zc2libGUgdG8gZXhwb3J0IDogbm8gZmVhdHVyZXMgZm91bmQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gbGVzIHN0eWxlcyBzb250IGJpZW4gdHJhbnNtaXMgcG91ciBsJ291dGlsIGRlIGRlc3NpblxuICAgICAgICAvLyBtYWlzLCBjZSBuJ2VzdCBwYXMgdG91am91cnMgbGUgY2FzIHBvdXIgY2VydGFpbnMgd2lkZ2V0cyAhP1xuICAgICAgICAvLyBkb25jLCBvbiB5IGFqb3V0ZSBsZXMgc3R5bGVzIHBhciBkZWZhdXQuLi5cbiAgICAgICAgbGF5ZXIuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKS5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICB2YXIgc3R5bGUgPSBmZWF0dXJlLmdldFN0eWxlKCk7XG4gICAgICAgICAgICBpZiAoIXN0eWxlICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRTdHlsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5zZXRTdHlsZSh0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRTdHlsZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gYWpvdXRlciBsZXMgbWV0YWRvbm7DqWVzIGRlIGNhbGN1bCBldCBkZSBjb25maWd1cmF0aW9uXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgZGVmYXVsdFN0eWxlIDogc3R5bGVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYWpvdXTDqWVzIMOgIGxhIHJhY2luZSA6XG4gICAgICAgICAgICAvLyBleC4gXCJnZW9wb3J0YWlsOmNvbXB1dGVcIiA6IHt9XG4gICAgICAgICAgICBvcHRpb25zLmV4dGVuc2lvbnMgPSB7XG4gICAgICAgICAgICAgICAgXCJnZW9wb3J0YWlsOmNvbXB1dGVcIiA6IGRhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgQ2xhc3NOYW1lID0gbnVsbDtcbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuZm9ybWF0LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJLTUxcIjpcbiAgICAgICAgICAgICAgICBvcHRpb25zLndyaXRlU3R5bGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dQb2ludE5hbWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBDbGFzc05hbWUgPSBuZXcgS01MRXh0ZW5kZWQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiR1BYXCI6XG4gICAgICAgICAgICAgICAgQ2xhc3NOYW1lID0gbmV3IEdQWEV4dGVuZGVkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkdFT0pTT05cIjpcbiAgICAgICAgICAgICAgICBDbGFzc05hbWUgPSBuZXcgR2VvSlNPTkV4dGVuZGVkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkltcG9zc2libGUgdG8gZXhwb3J0IDogZm9ybWF0IHVua25vd24gIT9cIik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXRQcm9qID0gbGF5ZXIuZ2V0U291cmNlKCkuZ2V0UHJvamVjdGlvbigpO1xuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gb24gZGV0ZXJtaW5lIGxhIHByb2plY3Rpb24gZGUgbGEgY2FydGVcbiAgICAgICAgLy8gc2kgbGUgY29tcG9zYW50IGEgw6l0w6kgYWpvdXTDqSBzdXIgbGEgY2FydGUgdmlhIGxlIG3DqWNhbmlzbWUgZCdPcGVuTGF5ZXIuLi5cbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG4gICAgICAgIGlmIChtYXApIHtcbiAgICAgICAgICAgIGZlYXRQcm9qID0gZmVhdFByb2ogfHwgbWFwLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmVhdHVyZXMgPSBsYXllci5nZXRTb3VyY2UoKS5nZXRGZWF0dXJlcygpO1xuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gcGFyIGRlZmF1dCwgd2VibWVyY2F0b3Igb3UgXCJFUFNHOjM4NTdcIlxuICAgICAgICByZXN1bHQgPSBDbGFzc05hbWUud3JpdGVGZWF0dXJlcyhmZWF0dXJlcywge1xuICAgICAgICAgICAgZGF0YVByb2plY3Rpb24gOiBcIkVQU0c6NDMyNlwiLFxuICAgICAgICAgICAgZmVhdHVyZVByb2plY3Rpb24gOiBmZWF0UHJvaiB8fCBcIkVQU0c6Mzg1N1wiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgZXZlbnQgZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogLi4uXG4gICAgICogQHBhcmFtIHsqfSBlIC0gQ2xpY2tcbiAgICAgKi9cbiAgICBvbkNsaWNrQnV0dG9uRXhwb3J0IChlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1BsdWdnYWJsZUNvbnRyb2woKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDb21wb25hbnQgbm90IHBsdWdnYWJsZSB3aXRoIHRoZSBjb250cm9sICFcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGF5ZXIgPSB0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRMYXllcigpO1xuICAgICAgICB2YXIgZGF0YSA9ICh0aGlzLm9wdGlvbnMuY29udHJvbC5nZXREYXRhICE9PSB1bmRlZmluZWQpID8gdGhpcy5vcHRpb25zLmNvbnRyb2wuZ2V0RGF0YSgpIDoge307XG4gICAgICAgIHZhciBzdHlsZSA9ICh0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRTdHlsZSAhPT0gdW5kZWZpbmVkKSA/IHRoaXMub3B0aW9ucy5jb250cm9sLmdldFN0eWxlKCkgOiB7fTtcblxuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuZXhwb3J0RmVhdHVyZXMobGF5ZXIsIGRhdGEsIHN0eWxlKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQgPT09IFwibnVsbFwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogZXZlbnQgdHJpZ2dlcmVkIHdoZW4gdGhlIGV4cG9ydCBpcyBmaW5pc2hlZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgZXhwb3J0OmNvbXB1dGVcbiAgICAgICAgICogQHR5cGVkZWYge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHR5cGUgLSBldmVudFxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGFyZ2V0IC0gaW5zdGFuY2UgRXhwb3J0XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb250ZW50IC0gZXhwb3J0IGRhdGFcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogRXhwb3J0Lm9uKFwiZXhwb3J0OmNvbXB1dGVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhlLnRhcmdldCk7XG4gICAgICAgICAqIH0pXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgdHlwZSA6IFwiZXhwb3J0OmNvbXB1dGVcIixcbiAgICAgICAgICAgIGNvbnRlbnQgOiBjb250ZW50XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gbGEgY2FsbGJhY2sgYW5udWxlIGxlIGRvd25sb2FkIGR1IGZpY2hpZXIuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FeHBvcnQgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5vbkV4cG9ydCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub25FeHBvcnQoY29udGVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAvLyBkZXRlcm1pbmVyIGxlIGJvbiBjaGFyc2V0ICFcbiAgICAgICAgdmFyIGNoYXJzZXQgPSBcInV0Zi04XCI7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImRhdGE6XCIgKyB0aGlzLm1pbWVUeXBlICsgXCI7Y2hhcnNldD1cIiArIGNoYXJzZXQgKyBcIixcIiArIGVuY29kZVVSSUNvbXBvbmVudChjb250ZW50KSk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgdGhpcy5vcHRpb25zLm5hbWUgKyB0aGlzLmV4dGVuc2lvbik7XG4gICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtcbiAgICAgICAgICAgIGV2ZW50LmluaXRFdmVudChcImNsaWNrXCIsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgbGluay5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHVibGljIHNldHRlcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250cm9sIC0gLi4uXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNldENvbnRyb2wgKGNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gdGFyZ2V0IC0gLi4uXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNldFRhcmdldCAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLi4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdCAtIC4uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzZXRGb3JtYXQgKGZvcm1hdCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gZm9ybWF0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmZvcm1hdCkge1xuICAgICAgICAgICAgY2FzZSBcIktNTFwiOlxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gXCIua21sXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IFwiYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiR1BYXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBcIi5ncHhcIjtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbWVUeXBlID0gXCJhcHBsaWNhdGlvbi9ncHgreG1sXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiR0VPSlNPTlwiOlxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gXCIuZ2VvanNvblwiO1xuICAgICAgICAgICAgICAgIHRoaXMubWltZVR5cGUgPSBcImFwcGxpY2F0aW9uL2dlbytqc29uXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIHJlZGVmaW5lIGZvcm1hdCBieSBkZWZhdWx0ICFcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gXCJHRU9KU09OXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBcIi5nZW9qc29uXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IFwiYXBwbGljYXRpb24vZ2VvK2pzb25cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gLi4uXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNldE5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSAtIC4uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzZXRUaXRsZSAodGl0bGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbikge1xuICAgICAgICAgICAgLy8gYWZmaWNoZXIgbCdpY29uZSBkdSBtZW51IC8gdGl0cmVcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnZhbHVlID0gKHRoaXMub3B0aW9ucy5tZW51KSA/IHRoaXMuaWNvbiArIHRpdGxlIDogdGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAuLi5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIC4uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzZXRNZW51IChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1lbnUgPSBhY3RpdmU7XG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbikge1xuICAgICAgICAgICAgLy8gYWZmaWNoZXIgbCdpY29uZSBkdSBtZW51IC8gdGl0cmVcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnZhbHVlID0gKHRoaXMub3B0aW9ucy5tZW51KSA/IHRoaXMuaWNvbiArIHRoaXMub3B0aW9ucy50aXRsZSA6IHRoaXMub3B0aW9ucy50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZW51ICYmIHRoaXMub3B0aW9ucy5tZW51KSB7XG4gICAgICAgICAgICAvLyBhZmZpY2hlciBsZSBtZW51XG4gICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5tZW51LmNsYXNzTmFtZTtcbiAgICAgICAgICAgIHRoaXMubWVudS5jbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSh0aGlzLm1lbnVDbGFzc0hpZGRlbiwgXCJcIik7XG4gICAgICAgICAgICAvLyBmb3JtYXQgcGFyIGRlZmF1dFxuICAgICAgICAgICAgdmFyIHJhZGlvcyA9IHRoaXMubWVudS5xdWVyeVNlbGVjdG9yQWxsKGBpbnB1dFt0eXBlPXJhZGlvXVtuYW1lPVwiZm9ybWF0XCJdYCk7XG4gICAgICAgICAgICByYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgICAgICAgICAvLyByYWRpbyBjaGVja2VkIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICBpZiAocmFkaW8uaWQudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuZm9ybWF0LnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG59O1xuXG4vLyBvbiByw6ljdXDDqHJlIGxlcyBtw6l0aG9kZXMgZGUgbGEgY2xhc3NlIERPTVxuVXRpbHMuYXNzaWduKEJ1dHRvbkV4cG9ydC5wcm90b3R5cGUsIEV4cG9ydERPTSk7XG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbkV4cG9ydDtcblxuLy8gRXhwb3NlIEV4cG9ydCBhcyBvbC5jb250cm9sLkV4cG9ydCAoZm9yIGEgYnVpbGQgYnVuZGxlKVxuaWYgKHdpbmRvdy5vbCAmJiB3aW5kb3cub2wuY29udHJvbCkge1xuICAgIHdpbmRvdy5vbC5jb250cm9sLkV4cG9ydCA9IEJ1dHRvbkV4cG9ydDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Export.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS_Controls_Export_GPexportOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CSS/Controls/Export/GPexportOpenLayers.css */ \"./src/OpenLayers/CSS/Controls/Export/GPexportOpenLayers.css\");\n/* harmony import */ var _CSS_Controls_Export_GPexportOpenLayers_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_Export_GPexportOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ol/control/Control */ \"ol/control/Control\");\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ol_control_Control__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Formats_KML__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Formats/KML */ \"./src/OpenLayers/Formats/KML.js\");\n/* harmony import */ var _Formats_GeoJSON__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Formats/GeoJSON */ \"./src/OpenLayers/Formats/GeoJSON.js\");\n/* harmony import */ var _Formats_GPX__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Formats/GPX */ \"./src/OpenLayers/Formats/GPX.js\");\n/* harmony import */ var _Common_Controls_ExportDOM__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Common/Controls/ExportDOM */ \"./src/Common/Controls/ExportDOM.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n// import CSS\n\n\n// import OpenLayers\n\n\n// import local\n\n\n\n\n// import local with ol dependencies\n\n\n\n\n// DOM\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLogger(\"export\");\n\n/**\n * @classdesc\n *\n * Export button\n *\n * @constructor\n * @alias ol.control.Export\n * @param {Object} options - options for function call.\n * @param {String} [options.format = \"geojson\"] - geojson / kml / gpx\n * @param {String} [options.name = \"export\"] - export name\n * @param {String} [options.title = \"Exporter\"] - button name\n * @param {Boolean} [options.menu = false] - displays the format choice menu\n * @param {Function} [options.onExport] - callback\n * @param {DOMElement} [options.target] - target\n * @param {Object} options.control - instance of control\n * @fires export:compute\n * @example\n * // pluggued widget Export into control Isocurve\n * var iso = new ol.control.Isocurve();\n * map.addControl(iso);\n *\n * // method : call render()\n * var export = new ButtonExport();\n * export.setControl(iso);\n * export.setTarget();\n * export.setName(\"export\");\n * export.setFormat(\"geojson\");\n * export.setTitle(\"Exporter\");\n * export.setMenu(false);\n * export.render(); // <-- direct call to render function !\n * export.on(\"export:compute\", (data) => { console.log(data); });\n *\n * // method : call map.addControl()\n * var export = new ButtonExport();\n * export.setControl(iso);\n * export.setTarget();\n * export.setName(\"export\");\n * export.setFormat(\"geojson\");\n * export.setTitle(\"Exporter\");\n * export.setMenu(false);\n * export.on(\"export:compute\", (data) => { console.log(data); });\n * map.addControl(export); // <-- using the OpenLayers mechanism, don't call to render function !\n *\n * // use control options instead of setters\n * var export = new ButtonExport({\n * control : iso,\n * target : ,\n * name : \"export\",\n * format : \"geojson\",\n * title : \"Exporter\",\n * menu : false\n * });\n * map.addControl(export);\n *\n * // method with passing option into the control Isocurve\n * var iso = new ol.control.Isocurve({ export : true });\n * // with control options :\n * var iso = new ol.control.Isocurve({ export : {\n * name : \"export\",\n * format : \"geojson\",\n * title : \"Exporter\",\n * menu : false\n * }});\n */\nvar ButtonExport = /*#__PURE__*/function (_Control) {\n /**\n * See {@link ol.control.Export}\n * @module ButtonExport\n * @alias module:~Controls/ButtonExport\n * @param {Object} [options] - options\n * @example\n * import ButtonExport from \"src/OpenLayers/Controls/Export\"\n */\n function ButtonExport(options) {\n var _this;\n _classCallCheck(this, ButtonExport);\n options = options || {\n control: null,\n target: null,\n format: \"geojson\",\n name: \"export\",\n title: \"Exporter\",\n menu: false,\n onExport: null\n };\n logger.trace(\"[constructor] Export\", options);\n _this = _callSuper(this, ButtonExport, [{\n element: document.createElement(\"div\"),\n render: options.render,\n target: options.target\n }]);\n if (!(_this instanceof ButtonExport)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n\n /**\n * Response to the export of the route calculation\n * (only for jsdoc)\n *\n * @example\n * // GeoJSON format\n * {\n * \"type\":\"FeatureCollection\",\n * \"features\":[...],\n * \"geoportail:compute\":{\n * \"points\":[ [2.588024210134887, 48.84192678293002 ] ],\n * \"transport\":\"Voiture\",\n * \"exclusions\":[...],\n * \"computation\":\"fastest\",\n * \"results\":{ }\n * }\n *\n * @see {@link https://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.RouteResponse.html|Service}\n */\n // eslint-disable-next-line no-undef\n _this.EXPORT_ROUTE = {};\n\n /**\n * Response to the export of the isochron calculation\n * (only for jsdoc)\n *\n * @example\n * // GeoJSON format\n * {\n * \"type\":\"FeatureCollection\",\n * \"features\":[...],\n * \"geoportail:compute\":{\n * \"transport\":\"Pieton\",\n * \"computation\":\"time\",\n * \"exclusions\":[\n *\n * ],\n * \"direction\":\"departure\",\n * \"point\":[ 2.587835382718464, 48.84192678293002 ],\n * \"results\":{\n * \"message\":\"\",\n * \"id\":\"\",\n * \"location\":{\n * \"x\":\"2.587835382718464\",\n * \"y\":\"48.84192678293002\"\n * },\n * \"srs\":\"EPSG:4326\",\n * \"geometry\":{\n * \"type\":\"Polygon\",\n * \"coordinates\":[[...]]\n * },\n * \"time\":180,\n * \"distance\":\"\"\n * }\n * }\n * }\n *\n * @see {@link https://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.IsoCurveResponse.html|Service}\n */\n // eslint-disable-next-line no-undef\n _this.EXPORT_ISOCHRON = {};\n\n /**\n * Response to the export of the profile calculation\n * (only for jsdoc)\n *\n * @example\n * // GeoJSON format\n * {\n * \"type\":\"FeatureCollection\",\n * \"features\":[...],\n * \"geoportail:compute\":{\n * \"greaterSlope\":76,\n * \"meanSlope\":7,\n * \"distancePlus\":84,\n * \"distanceMinus\":48,\n * \"ascendingElevation\":5,\n * \"descendingElevation\":-4,\n * \"altMin\":\"92,04\",\n * \"altMax\":\"96,71\",\n * \"distance\":163,\n * \"unit\":\"m\",\n * \"points\":[\n * {\n * \"z\":95.68,\n * \"lon\":2.5874,\n * \"lat\":48.8419,\n * \"acc\":2.5,\n * \"dist\":0,\n * \"slope\":0\n * }\n * ]\n * }\n * }\n *\n * @see {@link https://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.AltiResponse.html|Service}\n */\n // eslint-disable-next-line no-undef\n _this.EXPORT_PROFILE = {};\n\n // id unique\n _this.uid = options.id || _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__[\"default\"].generate();\n\n // export\n _this.extension = null;\n _this.mimeType = null;\n\n // dom\n _this.container = null;\n _this.button = null;\n _this.menu = null;\n _this.icon = \"\\u2630 \";\n _this.menuClassHidden = \"GPexportMenuHidden\";\n _this.initOptions(options);\n _this.initContainer();\n return _this;\n }\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n\n /**\n * Render DOM\n *\n * @public\n */\n _inherits(ButtonExport, _Control);\n return _createClass(ButtonExport, [{\n key: \"render\",\n value: function render() {\n // container principal\n if (!this.options.target) {\n if (this.options.control) {\n // insertion du composant dans le panneau du controle\n var container = this.options.control.getContainer();\n // ex. GP(iso|route)Panel-\n this.options.target = container.lastChild;\n }\n }\n if (this.container) {\n this.options.target.appendChild(this.container);\n }\n }\n\n // ################################################################### //\n // #################### privates methods ############################# //\n // ################################################################### //\n\n /**\n * Initialize options\n * (called by constructor)\n *\n * @param {Object} options - options\n * @private\n */\n }, {\n key: \"initOptions\",\n value: function initOptions(options) {\n // options\n this.options = options;\n if (this.options.control) {\n // ...\n }\n if (this.options.target) {\n // ...\n }\n var format = this.options.format;\n format ? this.setFormat(format) : this.setFormat(\"\");\n if (!this.options.name) {\n this.setName(\"export\");\n }\n if (!this.options.title) {\n this.setTitle(\"Exporter\");\n }\n if (this.options.menu === undefined) {\n this.setMenu(false);\n }\n }\n\n /**\n * Initialize container\n * (called by constructor)\n *\n * @private\n * @todo menu des options\n */\n }, {\n key: \"initContainer\",\n value: function initContainer() {\n var _this2 = this;\n // TODO\n // menu des options de l'export :\n // * [ nom ]\n // * format\n // https://www.w3schools.com/howto/howto_css_dropdown.asp\n // https://www.w3schools.com/howto/howto_css_custom_checkbox.asp\n\n // afficher l'icone du menu\n var title = this.options.title;\n if (this.options.menu) {\n title = this.icon + this.options.title;\n }\n var div = document.createElement(\"div\");\n div.id = this._addUID(\"GPexportContainer\");\n div.className = \"GPexportMenuContainer\";\n\n // bouton Exporter\n // utiliser les templates literals avec la substitution ${...}\n var button = this.stringToHTML(\"\\n \\n \"));\n\n // add event click button\n this.button = button.firstChild;\n if (this.button) {\n this.button.addEventListener(\"click\", function (e) {\n return _this2.onClickButtonExport(e);\n });\n }\n div.appendChild(button.firstChild);\n\n // menu des options\n // utiliser les templates literals avec la substitution ${...}\n var menu = this.stringToHTML(\"\\n
\\n \\n \\n \\n
\\n \"));\n this.menu = menu.firstChild;\n if (this.menu) {\n if (this.options.menu) {\n var className = this.menu.className;\n this.menu.className = className.replace(this.menuClassHidden, \"\");\n }\n var radios = this.menu.querySelectorAll(\"input[type=radio][name=\\\"format\\\"]\");\n radios.forEach(function (radio) {\n // radio checked par defaut\n if (radio.id.toUpperCase().includes(_this2.options.format.toUpperCase())) {\n radio.checked = true;\n }\n // ecouteur pour changer de format\n radio.addEventListener(\"change\", function (e) {\n _this2.setFormat(e.target.value);\n });\n });\n }\n div.appendChild(menu.firstChild);\n this.container = div;\n }\n\n /**\n * ...\n *\n * @param {String} str - ...\n * @returns {DOMElement} - ...\n * @private\n */\n }, {\n key: \"stringToHTML\",\n value: function stringToHTML(str) {\n var support = function support() {\n if (!window.DOMParser) return false;\n var parser = new DOMParser();\n try {\n parser.parseFromString(\"x\", \"text/html\");\n } catch (err) {\n return false;\n }\n return true;\n };\n\n // If DOMParser is supported, use it\n if (support()) {\n var parser = new DOMParser();\n var doc = parser.parseFromString(str, \"text/html\");\n return doc.body;\n }\n\n // Otherwise, fallback to old-school method\n var dom = document.createElement(\"div\");\n dom.innerHTML = str;\n return dom;\n }\n\n /**\n * ...\n * @returns {Boolean} - ...\n * @private\n */\n }, {\n key: \"isPluggableControl\",\n value: function isPluggableControl() {\n // tester toutes les méthodes des widgets pluggable\n // la méthode getData() n'est pas obligatoire car certains widgets\n // n'ont pas de configuration.\n if (this.options.control && typeof this.options.control.getContainer === \"function\" && typeof this.options.control.getLayer === \"function\") {\n return true;\n }\n return false;\n }\n\n /**\n * ...\n * @param {Object} layer - ...\n * @param {Object} [data] - ...\n * @param {Object} [style] - ...\n * @returns {String} - ...\n * @private\n */\n }, {\n key: \"exportFeatures\",\n value: function exportFeatures(layer, data, style) {\n var _this3 = this;\n var result = null;\n if (!layer) {\n logger.warn(\"Impossible to export : no layer is hosting features.\");\n return result;\n }\n if (!layer.getSource() || !layer.getSource().getFeatures() || !layer.getSource().getFeatures().length) {\n logger.warn(\"Impossible to export : no features found.\");\n return result;\n }\n\n // INFO\n // les styles sont bien transmis pour l'outil de dessin\n // mais, ce n'est pas toujours le cas pour certains widgets !?\n // donc, on y ajoute les styles par defaut...\n layer.getSource().getFeatures().forEach(function (feature) {\n var style = feature.getStyle();\n if (!style && typeof _this3.options.control.getStyle === \"function\") {\n feature.setStyle(_this3.options.control.getStyle());\n }\n });\n\n // ajouter les metadonnées de calcul et de configuration\n var options = {\n defaultStyle: style\n };\n if (data) {\n // properties ajoutées à la racine :\n // ex. \"geoportail:compute\" : {}\n options.extensions = {\n \"geoportail:compute\": data\n };\n }\n var ClassName = null;\n switch (this.options.format.toUpperCase()) {\n case \"KML\":\n options.writeStyles = true;\n options.showPointNames = true;\n ClassName = new _Formats_KML__WEBPACK_IMPORTED_MODULE_5__[\"default\"](options);\n break;\n case \"GPX\":\n ClassName = new _Formats_GPX__WEBPACK_IMPORTED_MODULE_7__[\"default\"](options);\n break;\n case \"GEOJSON\":\n ClassName = new _Formats_GeoJSON__WEBPACK_IMPORTED_MODULE_6__[\"default\"](options);\n break;\n default:\n break;\n }\n if (!ClassName) {\n logger.warn(\"Impossible to export : format unknown !?\");\n return result;\n }\n var featProj = layer.getSource().getProjection();\n\n // INFO\n // on determine la projection de la carte\n // si le composant a été ajouté sur la carte via le mécanisme d'OpenLayer...\n var map = this.getMap();\n if (map) {\n featProj = featProj || map.getView().getProjection();\n }\n var features = layer.getSource().getFeatures();\n\n // INFO\n // par defaut, webmercator ou \"EPSG:3857\"\n result = ClassName.writeFeatures(features, {\n dataProjection: \"EPSG:4326\",\n featureProjection: featProj || \"EPSG:3857\"\n });\n return result;\n }\n // ################################################################### //\n // ######################## event dom ################################ //\n // ################################################################### //\n\n /**\n * ...\n * @param {*} e - Click\n */\n }, {\n key: \"onClickButtonExport\",\n value: function onClickButtonExport(e) {\n if (!this.isPluggableControl()) {\n logger.warn(\"Componant not pluggable with the control !\");\n return;\n }\n var layer = this.options.control.getLayer();\n var data = this.options.control.getData !== undefined ? this.options.control.getData() : {};\n var style = this.options.control.getStyle !== undefined ? this.options.control.getStyle() : {};\n var content = this.exportFeatures(layer, data, style);\n if (!content || content === \"null\") {\n return;\n }\n\n /**\n * event triggered when the export is finished\n *\n * @event export:compute\n * @typedef {Object}\n * @property {Object} type - event\n * @property {Object} target - instance Export\n * @property {String} content - export data\n * @example\n * Export.on(\"export:compute\", function (e) {\n * console.log(e.target);\n * })\n */\n this.dispatchEvent({\n type: \"export:compute\",\n content: content\n });\n\n // INFO\n // la callback annule le download du fichier.\n if (this.options.onExport && typeof this.options.onExport === \"function\") {\n this.options.onExport(content);\n return;\n }\n var link = document.createElement(\"a\");\n // determiner le bon charset !\n var charset = \"utf-8\";\n link.setAttribute(\"href\", \"data:\" + this.mimeType + \";charset=\" + charset + \",\" + encodeURIComponent(content));\n link.setAttribute(\"download\", this.options.name + this.extension);\n if (document.createEvent) {\n var event = document.createEvent(\"MouseEvents\");\n event.initEvent(\"click\", true, true);\n link.dispatchEvent(event);\n } else {\n link.click();\n }\n }\n\n // ################################################################### //\n // ##################### public setters ############################## //\n // ################################################################### //\n /**\n * ...\n * @param {Object} control - ...\n * @public\n */\n }, {\n key: \"setControl\",\n value: function setControl(control) {\n this.options.control = control;\n }\n\n /**\n * ...\n * @param {DOMElement} target - ...\n * @public\n */\n }, {\n key: \"setTarget\",\n value: function setTarget(target) {\n this.options.target = target;\n }\n\n /**\n * ...\n * @param {String} format - ...\n * @public\n */\n }, {\n key: \"setFormat\",\n value: function setFormat(format) {\n this.options.format = format.toUpperCase();\n switch (this.options.format) {\n case \"KML\":\n this.extension = \".kml\";\n this.mimeType = \"application/vnd.google-earth.kml+xml\";\n break;\n case \"GPX\":\n this.extension = \".gpx\";\n this.mimeType = \"application/gpx+xml\";\n break;\n case \"GEOJSON\":\n this.extension = \".geojson\";\n this.mimeType = \"application/geo+json\";\n break;\n default:\n // redefine format by default !\n this.options.format = \"GEOJSON\";\n this.extension = \".geojson\";\n this.mimeType = \"application/geo+json\";\n break;\n }\n }\n\n /**\n * ...\n * @param {String} name - ...\n * @public\n */\n }, {\n key: \"setName\",\n value: function setName(name) {\n this.options.name = name;\n }\n\n /**\n * ...\n * @param {String} title - ...\n * @public\n */\n }, {\n key: \"setTitle\",\n value: function setTitle(title) {\n this.options.title = title;\n if (this.button) {\n // afficher l'icone du menu / titre\n this.button.value = this.options.menu ? this.icon + title : title;\n }\n }\n\n /**\n * ...\n * @param {Boolean} active - ...\n * @public\n */\n }, {\n key: \"setMenu\",\n value: function setMenu(active) {\n var _this4 = this;\n this.options.menu = active;\n if (this.button) {\n // afficher l'icone du menu / titre\n this.button.value = this.options.menu ? this.icon + this.options.title : this.options.title;\n }\n if (this.menu && this.options.menu) {\n // afficher le menu\n var className = this.menu.className;\n this.menu.className = className.replace(this.menuClassHidden, \"\");\n // format par defaut\n var radios = this.menu.querySelectorAll(\"input[type=radio][name=\\\"format\\\"]\");\n radios.forEach(function (radio) {\n // radio checked par defaut\n if (radio.id.toUpperCase().includes(_this4.options.format.toUpperCase())) {\n radio.checked = true;\n }\n });\n }\n }\n }]);\n}(ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default.a);\n;\n\n// on récupère les méthodes de la classe DOM\n_Common_Utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].assign(ButtonExport.prototype, _Common_Controls_ExportDOM__WEBPACK_IMPORTED_MODULE_8__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (ButtonExport);\n\n// Expose Export as ol.control.Export (for a build bundle)\nif (window.ol && window.ol.control) {\n window.ol.control.Export = ButtonExport;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0V4cG9ydC5qcz9hZjQ5Il0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIkJ1dHRvbkV4cG9ydCIsIl9Db250cm9sIiwib3B0aW9ucyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiY29udHJvbCIsInRhcmdldCIsImZvcm1hdCIsIm5hbWUiLCJ0aXRsZSIsIm1lbnUiLCJvbkV4cG9ydCIsInRyYWNlIiwiX2NhbGxTdXBlciIsImVsZW1lbnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJUeXBlRXJyb3IiLCJFWFBPUlRfUk9VVEUiLCJFWFBPUlRfSVNPQ0hST04iLCJFWFBPUlRfUFJPRklMRSIsInVpZCIsImlkIiwiSUQiLCJnZW5lcmF0ZSIsImV4dGVuc2lvbiIsIm1pbWVUeXBlIiwiY29udGFpbmVyIiwiYnV0dG9uIiwiaWNvbiIsIm1lbnVDbGFzc0hpZGRlbiIsImluaXRPcHRpb25zIiwiaW5pdENvbnRhaW5lciIsIl9pbmhlcml0cyIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiZ2V0Q29udGFpbmVyIiwibGFzdENoaWxkIiwiYXBwZW5kQ2hpbGQiLCJzZXRGb3JtYXQiLCJzZXROYW1lIiwic2V0VGl0bGUiLCJ1bmRlZmluZWQiLCJzZXRNZW51IiwiX3RoaXMyIiwiZGl2IiwiX2FkZFVJRCIsImNsYXNzTmFtZSIsInN0cmluZ1RvSFRNTCIsImNvbmNhdCIsImZpcnN0Q2hpbGQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsIm9uQ2xpY2tCdXR0b25FeHBvcnQiLCJyZXBsYWNlIiwicmFkaW9zIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJyYWRpbyIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJjaGVja2VkIiwic3RyIiwic3VwcG9ydCIsIndpbmRvdyIsIkRPTVBhcnNlciIsInBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImVyciIsImRvYyIsImJvZHkiLCJkb20iLCJpbm5lckhUTUwiLCJpc1BsdWdnYWJsZUNvbnRyb2wiLCJnZXRMYXllciIsImV4cG9ydEZlYXR1cmVzIiwibGF5ZXIiLCJkYXRhIiwic3R5bGUiLCJfdGhpczMiLCJyZXN1bHQiLCJ3YXJuIiwiZ2V0U291cmNlIiwiZ2V0RmVhdHVyZXMiLCJsZW5ndGgiLCJmZWF0dXJlIiwiZ2V0U3R5bGUiLCJzZXRTdHlsZSIsImRlZmF1bHRTdHlsZSIsImV4dGVuc2lvbnMiLCJDbGFzc05hbWUiLCJ3cml0ZVN0eWxlcyIsInNob3dQb2ludE5hbWVzIiwiS01MRXh0ZW5kZWQiLCJHUFhFeHRlbmRlZCIsIkdlb0pTT05FeHRlbmRlZCIsImZlYXRQcm9qIiwiZ2V0UHJvamVjdGlvbiIsIm1hcCIsImdldE1hcCIsImdldFZpZXciLCJmZWF0dXJlcyIsIndyaXRlRmVhdHVyZXMiLCJkYXRhUHJvamVjdGlvbiIsImZlYXR1cmVQcm9qZWN0aW9uIiwiZ2V0RGF0YSIsImNvbnRlbnQiLCJkaXNwYXRjaEV2ZW50IiwidHlwZSIsImxpbmsiLCJjaGFyc2V0Iiwic2V0QXR0cmlidXRlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiY3JlYXRlRXZlbnQiLCJldmVudCIsImluaXRFdmVudCIsImNsaWNrIiwic2V0Q29udHJvbCIsInNldFRhcmdldCIsImFjdGl2ZSIsIl90aGlzNCIsIkNvbnRyb2wiLCJVdGlscyIsImFzc2lnbiIsInByb3RvdHlwZSIsIkV4cG9ydERPTSIsIm9sIiwiRXhwb3J0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDdUQ7O0FBRXZEO0FBQ3lDOztBQUV6QztBQUMrQztBQUNSO0FBQ2lCOztBQUV4RDtBQUN5QztBQUNRO0FBQ1I7O0FBRXpDO0FBQ3dEO0FBRXhELElBQUlBLE1BQU0sR0FBR0MscUVBQU0sQ0FBQ0MsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LElBQUlrRSxNQUFNLENBQUM4RCxFQUFFLElBQUk5RCxNQUFNLENBQUM4RCxFQUFFLENBQUMzSCxPQUFPLEVBQUU7RUFDaEM2RCxNQUFNLENBQUM4RCxFQUFFLENBQUMzSCxPQUFPLENBQUM0SCxNQUFNLEdBQUdqSSxZQUFZO0FBQzNDIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvRXhwb3J0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IENTU1xuaW1wb3J0IFwiLi4vQ1NTL0NvbnRyb2xzL0V4cG9ydC9HUGV4cG9ydE9wZW5MYXllcnMuY3NzXCI7XG5cbi8vIGltcG9ydCBPcGVuTGF5ZXJzXG5pbXBvcnQgQ29udHJvbCBmcm9tIFwib2wvY29udHJvbC9Db250cm9sXCI7XG5cbi8vIGltcG9ydCBsb2NhbFxuaW1wb3J0IElEIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvU2VsZWN0b3JJRFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxuLy8gaW1wb3J0IGxvY2FsIHdpdGggb2wgZGVwZW5kZW5jaWVzXG5pbXBvcnQgS01MRXh0ZW5kZWQgZnJvbSBcIi4uL0Zvcm1hdHMvS01MXCI7XG5pbXBvcnQgR2VvSlNPTkV4dGVuZGVkIGZyb20gXCIuLi9Gb3JtYXRzL0dlb0pTT05cIjtcbmltcG9ydCBHUFhFeHRlbmRlZCBmcm9tIFwiLi4vRm9ybWF0cy9HUFhcIjtcblxuLy8gRE9NXG5pbXBvcnQgRXhwb3J0RE9NIGZyb20gXCIuLi8uLi9Db21tb24vQ29udHJvbHMvRXhwb3J0RE9NXCI7XG5cbnZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiZXhwb3J0XCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBFeHBvcnQgYnV0dG9uXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuY29udHJvbC5FeHBvcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5mb3JtYXQgPSBcImdlb2pzb25cIl0gLSBnZW9qc29uIC8ga21sIC8gZ3B4XG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubmFtZSA9IFwiZXhwb3J0XCJdIC0gZXhwb3J0IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZSA9IFwiRXhwb3J0ZXJcIl0gLSBidXR0b24gbmFtZVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZW51ID0gZmFsc2VdIC0gZGlzcGxheXMgdGhlIGZvcm1hdCBjaG9pY2UgbWVudVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25FeHBvcnRdIC0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gW29wdGlvbnMudGFyZ2V0XSAtIHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuY29udHJvbCAtIGluc3RhbmNlIG9mIGNvbnRyb2xcbiAqIEBmaXJlcyBleHBvcnQ6Y29tcHV0ZVxuICogQGV4YW1wbGVcbiAqIC8vIHBsdWdndWVkIHdpZGdldCBFeHBvcnQgaW50byBjb250cm9sIElzb2N1cnZlXG4gKiB2YXIgaXNvID0gbmV3IG9sLmNvbnRyb2wuSXNvY3VydmUoKTtcbiAqIG1hcC5hZGRDb250cm9sKGlzbyk7XG4gKlxuICogLy8gbWV0aG9kIDogY2FsbCByZW5kZXIoKVxuICogdmFyIGV4cG9ydCA9IG5ldyBCdXR0b25FeHBvcnQoKTtcbiAqIGV4cG9ydC5zZXRDb250cm9sKGlzbyk7XG4gKiBleHBvcnQuc2V0VGFyZ2V0KDwhLS0gRE9NRWxlbWVudCAtLT4pO1xuICogZXhwb3J0LnNldE5hbWUoXCJleHBvcnRcIik7XG4gKiBleHBvcnQuc2V0Rm9ybWF0KFwiZ2VvanNvblwiKTtcbiAqIGV4cG9ydC5zZXRUaXRsZShcIkV4cG9ydGVyXCIpO1xuICogZXhwb3J0LnNldE1lbnUoZmFsc2UpO1xuICogZXhwb3J0LnJlbmRlcigpOyAvLyA8LS0gZGlyZWN0IGNhbGwgdG8gcmVuZGVyIGZ1bmN0aW9uICFcbiAqIGV4cG9ydC5vbihcImV4cG9ydDpjb21wdXRlXCIsIChkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGRhdGEpOyB9KTtcbiAqXG4gKiAvLyBtZXRob2QgOiBjYWxsIG1hcC5hZGRDb250cm9sKClcbiAqIHZhciBleHBvcnQgPSBuZXcgQnV0dG9uRXhwb3J0KCk7XG4gKiBleHBvcnQuc2V0Q29udHJvbChpc28pO1xuICogZXhwb3J0LnNldFRhcmdldCg8IS0tIERPTUVsZW1lbnQgLS0+KTtcbiAqIGV4cG9ydC5zZXROYW1lKFwiZXhwb3J0XCIpO1xuICogZXhwb3J0LnNldEZvcm1hdChcImdlb2pzb25cIik7XG4gKiBleHBvcnQuc2V0VGl0bGUoXCJFeHBvcnRlclwiKTtcbiAqIGV4cG9ydC5zZXRNZW51KGZhbHNlKTtcbiAqIGV4cG9ydC5vbihcImV4cG9ydDpjb21wdXRlXCIsIChkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGRhdGEpOyB9KTtcbiAqIG1hcC5hZGRDb250cm9sKGV4cG9ydCk7IC8vIDwtLSB1c2luZyB0aGUgT3BlbkxheWVycyBtZWNoYW5pc20sIGRvbid0IGNhbGwgdG8gcmVuZGVyIGZ1bmN0aW9uICFcbiAqXG4gKiAvLyB1c2UgY29udHJvbCBvcHRpb25zIGluc3RlYWQgb2Ygc2V0dGVyc1xuICogdmFyIGV4cG9ydCA9IG5ldyBCdXR0b25FeHBvcnQoe1xuICogICBjb250cm9sIDogaXNvLFxuICogICB0YXJnZXQgOiA8IS0tIERPTUVsZW1lbnQgLS0+LFxuICogICBuYW1lIDogXCJleHBvcnRcIixcbiAqICAgZm9ybWF0IDogXCJnZW9qc29uXCIsXG4gKiAgIHRpdGxlIDogXCJFeHBvcnRlclwiLFxuICogICBtZW51IDogZmFsc2VcbiAqIH0pO1xuICogbWFwLmFkZENvbnRyb2woZXhwb3J0KTtcbiAqXG4gKiAvLyBtZXRob2Qgd2l0aCBwYXNzaW5nIG9wdGlvbiBpbnRvIHRoZSBjb250cm9sIElzb2N1cnZlXG4gKiB2YXIgaXNvID0gbmV3IG9sLmNvbnRyb2wuSXNvY3VydmUoeyBleHBvcnQgOiB0cnVlIH0pO1xuICogLy8gd2l0aCBjb250cm9sIG9wdGlvbnMgOlxuICogdmFyIGlzbyA9IG5ldyBvbC5jb250cm9sLklzb2N1cnZlKHsgZXhwb3J0IDoge1xuICogICBuYW1lIDogXCJleHBvcnRcIixcbiAqICAgZm9ybWF0IDogXCJnZW9qc29uXCIsXG4gKiAgIHRpdGxlIDogXCJFeHBvcnRlclwiLFxuICogICBtZW51IDogZmFsc2VcbiAqIH19KTtcbiAqL1xuY2xhc3MgQnV0dG9uRXhwb3J0IGV4dGVuZHMgQ29udHJvbCB7XG5cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIG9sLmNvbnRyb2wuRXhwb3J0fVxuICAgICAqIEBtb2R1bGUgQnV0dG9uRXhwb3J0XG4gICAgICogQGFsaWFzIG1vZHVsZTp+Q29udHJvbHMvQnV0dG9uRXhwb3J0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGltcG9ydCBCdXR0b25FeHBvcnQgZnJvbSBcInNyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL0V4cG9ydFwiXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgY29udHJvbCA6IG51bGwsXG4gICAgICAgICAgICB0YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgZm9ybWF0IDogXCJnZW9qc29uXCIsXG4gICAgICAgICAgICBuYW1lIDogXCJleHBvcnRcIixcbiAgICAgICAgICAgIHRpdGxlIDogXCJFeHBvcnRlclwiLFxuICAgICAgICAgICAgbWVudSA6IGZhbHNlLFxuICAgICAgICAgICAgb25FeHBvcnQgOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiW2NvbnN0cnVjdG9yXSBFeHBvcnRcIiwgb3B0aW9ucyk7XG5cbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgZWxlbWVudCA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICByZW5kZXIgOiBvcHRpb25zLnJlbmRlcixcbiAgICAgICAgICAgIHRhcmdldCA6IG9wdGlvbnMudGFyZ2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdXR0b25FeHBvcnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzcG9uc2UgdG8gdGhlIGV4cG9ydCBvZiB0aGUgcm91dGUgY2FsY3VsYXRpb25cbiAgICAgICAgICogKG9ubHkgZm9yIGpzZG9jKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAvLyBHZW9KU09OIGZvcm1hdFxuICAgICAgICAgKiB7XG4gICAgICAgICAqICAgXCJ0eXBlXCI6XCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICAgICAgICAgKiAgIFwiZmVhdHVyZXNcIjpbLi4uXSxcbiAgICAgICAgICogICBcImdlb3BvcnRhaWw6Y29tcHV0ZVwiOntcbiAgICAgICAgICogICAgIFwicG9pbnRzXCI6WyBbMi41ODgwMjQyMTAxMzQ4ODcsIDQ4Ljg0MTkyNjc4MjkzMDAyIF0gXSxcbiAgICAgICAgICogICAgIFwidHJhbnNwb3J0XCI6XCJWb2l0dXJlXCIsXG4gICAgICAgICAqICAgICBcImV4Y2x1c2lvbnNcIjpbLi4uXSxcbiAgICAgICAgICogICAgIFwiY29tcHV0YXRpb25cIjpcImZhc3Rlc3RcIixcbiAgICAgICAgICogICAgIFwicmVzdWx0c1wiOnsgPCEtLSBTZXJ2aWNlIC0tPiB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvR3AuU2VydmljZXMuUm91dGVSZXNwb25zZS5odG1sfFNlcnZpY2V9XG4gICAgICAgICAqL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgdGhpcy5FWFBPUlRfUk9VVEUgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzcG9uc2UgdG8gdGhlIGV4cG9ydCBvZiB0aGUgaXNvY2hyb24gY2FsY3VsYXRpb25cbiAgICAgICAgICogKG9ubHkgZm9yIGpzZG9jKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAvLyBHZW9KU09OIGZvcm1hdFxuICAgICAgICAgKiB7XG4gICAgICAgICAqICAgIFwidHlwZVwiOlwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgICAgICogICAgXCJmZWF0dXJlc1wiOlsuLi5dLFxuICAgICAgICAgKiAgICBcImdlb3BvcnRhaWw6Y29tcHV0ZVwiOntcbiAgICAgICAgICogICAgICAgXCJ0cmFuc3BvcnRcIjpcIlBpZXRvblwiLFxuICAgICAgICAgKiAgICAgICBcImNvbXB1dGF0aW9uXCI6XCJ0aW1lXCIsXG4gICAgICAgICAqICAgICAgIFwiZXhjbHVzaW9uc1wiOltcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgXSxcbiAgICAgICAgICogICAgICAgXCJkaXJlY3Rpb25cIjpcImRlcGFydHVyZVwiLFxuICAgICAgICAgKiAgICAgICBcInBvaW50XCI6WyAyLjU4NzgzNTM4MjcxODQ2NCwgNDguODQxOTI2NzgyOTMwMDIgXSxcbiAgICAgICAgICogICAgICAgXCJyZXN1bHRzXCI6e1xuICAgICAgICAgKiAgICAgICAgICBcIm1lc3NhZ2VcIjpcIlwiLFxuICAgICAgICAgKiAgICAgICAgICBcImlkXCI6XCJcIixcbiAgICAgICAgICogICAgICAgICAgXCJsb2NhdGlvblwiOntcbiAgICAgICAgICogICAgICAgICAgICAgXCJ4XCI6XCIyLjU4NzgzNTM4MjcxODQ2NFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBcInlcIjpcIjQ4Ljg0MTkyNjc4MjkzMDAyXCJcbiAgICAgICAgICogICAgICAgICAgfSxcbiAgICAgICAgICogICAgICAgICAgXCJzcnNcIjpcIkVQU0c6NDMyNlwiLFxuICAgICAgICAgKiAgICAgICAgICBcImdlb21ldHJ5XCI6e1xuICAgICAgICAgKiAgICAgICAgICAgICBcInR5cGVcIjpcIlBvbHlnb25cIixcbiAgICAgICAgICogICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOltbLi4uXV1cbiAgICAgICAgICogICAgICAgICAgfSxcbiAgICAgICAgICogICAgICAgICBcInRpbWVcIjoxODAsXG4gICAgICAgICAqICAgICAgICAgXCJkaXN0YW5jZVwiOlwiXCJcbiAgICAgICAgICogICAgICB9XG4gICAgICAgICAqICAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2lnbmYuZ2l0aHViLmlvL2dlb3BvcnRhbC1hY2Nlc3MtbGliL2xhdGVzdC9qc2RvYy9HcC5TZXJ2aWNlcy5Jc29DdXJ2ZVJlc3BvbnNlLmh0bWx8U2VydmljZX1cbiAgICAgICAgICovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICB0aGlzLkVYUE9SVF9JU09DSFJPTiA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNwb25zZSB0byB0aGUgZXhwb3J0IG9mIHRoZSBwcm9maWxlIGNhbGN1bGF0aW9uXG4gICAgICAgICAqIChvbmx5IGZvciBqc2RvYylcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogLy8gR2VvSlNPTiBmb3JtYXRcbiAgICAgICAgICoge1xuICAgICAgICAgKiAgXCJ0eXBlXCI6XCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICAgICAgICAgKiAgIFwiZmVhdHVyZXNcIjpbLi4uXSxcbiAgICAgICAgICogICBcImdlb3BvcnRhaWw6Y29tcHV0ZVwiOntcbiAgICAgICAgICogICAgICBcImdyZWF0ZXJTbG9wZVwiOjc2LFxuICAgICAgICAgKiAgICAgIFwibWVhblNsb3BlXCI6NyxcbiAgICAgICAgICogICAgICBcImRpc3RhbmNlUGx1c1wiOjg0LFxuICAgICAgICAgKiAgICAgIFwiZGlzdGFuY2VNaW51c1wiOjQ4LFxuICAgICAgICAgKiAgICAgIFwiYXNjZW5kaW5nRWxldmF0aW9uXCI6NSxcbiAgICAgICAgICogICAgICBcImRlc2NlbmRpbmdFbGV2YXRpb25cIjotNCxcbiAgICAgICAgICogICAgICBcImFsdE1pblwiOlwiOTIsMDRcIixcbiAgICAgICAgICogICAgICBcImFsdE1heFwiOlwiOTYsNzFcIixcbiAgICAgICAgICogICAgICBcImRpc3RhbmNlXCI6MTYzLFxuICAgICAgICAgKiAgICAgIFwidW5pdFwiOlwibVwiLFxuICAgICAgICAgKiAgICAgIFwicG9pbnRzXCI6W1xuICAgICAgICAgKiAgICAgICAge1xuICAgICAgICAgKiAgICAgICAgICAgIFwielwiOjk1LjY4LFxuICAgICAgICAgKiAgICAgICAgICAgIFwibG9uXCI6Mi41ODc0LFxuICAgICAgICAgKiAgICAgICAgICAgIFwibGF0XCI6NDguODQxOSxcbiAgICAgICAgICogICAgICAgICAgICBcImFjY1wiOjIuNSxcbiAgICAgICAgICogICAgICAgICAgICBcImRpc3RcIjowLFxuICAgICAgICAgKiAgICAgICAgICAgIFwic2xvcGVcIjowXG4gICAgICAgICAqICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIF1cbiAgICAgICAgICogICB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvR3AuU2VydmljZXMuQWx0aVJlc3BvbnNlLmh0bWx8U2VydmljZX1cbiAgICAgICAgICovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICB0aGlzLkVYUE9SVF9QUk9GSUxFID0ge307XG5cbiAgICAgICAgLy8gaWQgdW5pcXVlXG4gICAgICAgIHRoaXMudWlkID0gb3B0aW9ucy5pZCB8fCBJRC5nZW5lcmF0ZSgpO1xuXG4gICAgICAgIC8vIGV4cG9ydFxuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubWltZVR5cGUgPSBudWxsO1xuXG4gICAgICAgIC8vIGRvbVxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHRoaXMuYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZW51ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pY29uID0gXCJcXHUyNjMwIFwiO1xuICAgICAgICB0aGlzLm1lbnVDbGFzc0hpZGRlbiA9IFwiR1BleHBvcnRNZW51SGlkZGVuXCI7XG5cbiAgICAgICAgdGhpcy5pbml0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5pbml0Q29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwdWJsaWMgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXIgRE9NXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgLy8gY29udGFpbmVyIHByaW5jaXBhbFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udHJvbCkge1xuICAgICAgICAgICAgICAgIC8vIGluc2VydGlvbiBkdSBjb21wb3NhbnQgZGFucyBsZSBwYW5uZWF1IGR1IGNvbnRyb2xlXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5jb250cm9sLmdldENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIC8vIGV4LiBHUChpc298cm91dGUpUGFuZWwtXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldCA9IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcml2YXRlcyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBvcHRpb25zXG4gICAgICogKGNhbGxlZCBieSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW5pdE9wdGlvbnMgKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gb3B0aW9uc1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udHJvbCkge1xuICAgICAgICAgICAgLy8gLi4uXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRhcmdldCkge1xuICAgICAgICAgICAgLy8gLi4uXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5vcHRpb25zLmZvcm1hdDtcbiAgICAgICAgKGZvcm1hdCkgPyB0aGlzLnNldEZvcm1hdChmb3JtYXQpIDogdGhpcy5zZXRGb3JtYXQoXCJcIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zZXROYW1lKFwiZXhwb3J0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VGl0bGUoXCJFeHBvcnRlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWVudSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1lbnUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjb250YWluZXJcbiAgICAgKiAoY2FsbGVkIGJ5IGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdG9kbyBtZW51IGRlcyBvcHRpb25zXG4gICAgICovXG4gICAgaW5pdENvbnRhaW5lciAoKSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgLy8gbWVudSBkZXMgb3B0aW9ucyBkZSBsJ2V4cG9ydCA6XG4gICAgICAgIC8vICogWyBub20gXVxuICAgICAgICAvLyAqIGZvcm1hdFxuICAgICAgICAvLyBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2hvd3RvL2hvd3RvX2Nzc19kcm9wZG93bi5hc3BcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9ob3d0by9ob3d0b19jc3NfY3VzdG9tX2NoZWNrYm94LmFzcFxuXG4gICAgICAgIC8vIGFmZmljaGVyIGwnaWNvbmUgZHUgbWVudVxuICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWVudSkge1xuICAgICAgICAgICAgdGl0bGUgPSB0aGlzLmljb24gKyB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmlkID0gdGhpcy5fYWRkVUlEKFwiR1BleHBvcnRDb250YWluZXJcIik7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSBcIkdQZXhwb3J0TWVudUNvbnRhaW5lclwiO1xuXG4gICAgICAgIC8vIGJvdXRvbiBFeHBvcnRlclxuICAgICAgICAvLyB1dGlsaXNlciBsZXMgdGVtcGxhdGVzIGxpdGVyYWxzIGF2ZWMgbGEgc3Vic3RpdHV0aW9uICR7Li4ufVxuICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5zdHJpbmdUb0hUTUwoYFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlkPVwiJHt0aGlzLl9hZGRVSUQoXCJHUGV4cG9ydEJ1dHRvblwiKX1cIiBcbiAgICAgICAgICAgICAgICBjbGFzcz1cIkdQaW5wdXRTdWJtaXRcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0aXRsZX1cIj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGNsaWNrIGJ1dHRvblxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbi5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGhpcy5idXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4gdGhpcy5vbkNsaWNrQnV0dG9uRXhwb3J0KGUpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYnV0dG9uLmZpcnN0Q2hpbGQpO1xuXG4gICAgICAgIC8vIG1lbnUgZGVzIG9wdGlvbnNcbiAgICAgICAgLy8gdXRpbGlzZXIgbGVzIHRlbXBsYXRlcyBsaXRlcmFscyBhdmVjIGxhIHN1YnN0aXR1dGlvbiAkey4uLn1cbiAgICAgICAgdmFyIG1lbnUgPSB0aGlzLnN0cmluZ1RvSFRNTChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiR1BleHBvcnRNZW51Q29udGVudCAke3RoaXMubWVudUNsYXNzSGlkZGVufVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRhaW5lclwiPkdlb0pTT05cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJHUG1lbnVGb3JtYXRHZW9qc29uLSR7dGhpcy51aWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmb3JtYXRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiZ2VvanNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRhaW5lclwiPktNTFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cIkdQbWVudUZvcm1hdEttbC0ke3RoaXMudWlkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZm9ybWF0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImttbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRhaW5lclwiPkdQWFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cIkdQbWVudUZvcm1hdEdweC0ke3RoaXMudWlkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZm9ybWF0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImdweFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApO1xuXG4gICAgICAgIHRoaXMubWVudSA9IG1lbnUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRoaXMubWVudSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tZW51KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMubWVudS5jbGFzc05hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51LmNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKHRoaXMubWVudUNsYXNzSGlkZGVuLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByYWRpb3MgPSB0aGlzLm1lbnUucXVlcnlTZWxlY3RvckFsbChgaW5wdXRbdHlwZT1yYWRpb11bbmFtZT1cImZvcm1hdFwiXWApO1xuICAgICAgICAgICAgcmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gcmFkaW8gY2hlY2tlZCBwYXIgZGVmYXV0XG4gICAgICAgICAgICAgICAgaWYgKHJhZGlvLmlkLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXModGhpcy5vcHRpb25zLmZvcm1hdC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICByYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZWNvdXRldXIgcG91ciBjaGFuZ2VyIGRlIGZvcm1hdFxuICAgICAgICAgICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtYXQoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG1lbnUuZmlyc3RDaGlsZCk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkaXY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIC0gLi4uXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IC0gLi4uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdHJpbmdUb0hUTUwgKHN0cikge1xuICAgICAgICB2YXIgc3VwcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghd2luZG93LkRPTVBhcnNlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhcInhcIiwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiBET01QYXJzZXIgaXMgc3VwcG9ydGVkLCB1c2UgaXRcbiAgICAgICAgaWYgKHN1cHBvcnQoKSkge1xuICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIHZhciBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN0ciwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gZG9jLmJvZHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGZhbGxiYWNrIHRvIG9sZC1zY2hvb2wgbWV0aG9kXG4gICAgICAgIHZhciBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkb20uaW5uZXJIVE1MID0gc3RyO1xuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIC4uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaXNQbHVnZ2FibGVDb250cm9sICgpIHtcbiAgICAgICAgLy8gdGVzdGVyIHRvdXRlcyBsZXMgbcOpdGhvZGVzIGRlcyB3aWRnZXRzIHBsdWdnYWJsZVxuICAgICAgICAvLyBsYSBtw6l0aG9kZSBnZXREYXRhKCkgbidlc3QgcGFzIG9ibGlnYXRvaXJlIGNhciBjZXJ0YWlucyB3aWRnZXRzXG4gICAgICAgIC8vIG4nb250IHBhcyBkZSBjb25maWd1cmF0aW9uLlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRyb2wgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRDb250YWluZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucy5jb250cm9sLmdldExheWVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAuLi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGF5ZXIgLSAuLi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gLi4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZV0gLSAuLi5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtIC4uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZXhwb3J0RmVhdHVyZXMgKGxheWVyLCBkYXRhLCBzdHlsZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJJbXBvc3NpYmxlIHRvIGV4cG9ydCA6IG5vIGxheWVyIGlzIGhvc3RpbmcgZmVhdHVyZXMuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxheWVyLmdldFNvdXJjZSgpIHx8XG4gICAgICAgICAgICAhbGF5ZXIuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKSB8fFxuICAgICAgICAgICAgIWxheWVyLmdldFNvdXJjZSgpLmdldEZlYXR1cmVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkltcG9zc2libGUgdG8gZXhwb3J0IDogbm8gZmVhdHVyZXMgZm91bmQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gbGVzIHN0eWxlcyBzb250IGJpZW4gdHJhbnNtaXMgcG91ciBsJ291dGlsIGRlIGRlc3NpblxuICAgICAgICAvLyBtYWlzLCBjZSBuJ2VzdCBwYXMgdG91am91cnMgbGUgY2FzIHBvdXIgY2VydGFpbnMgd2lkZ2V0cyAhP1xuICAgICAgICAvLyBkb25jLCBvbiB5IGFqb3V0ZSBsZXMgc3R5bGVzIHBhciBkZWZhdXQuLi5cbiAgICAgICAgbGF5ZXIuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKS5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICB2YXIgc3R5bGUgPSBmZWF0dXJlLmdldFN0eWxlKCk7XG4gICAgICAgICAgICBpZiAoIXN0eWxlICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRTdHlsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5zZXRTdHlsZSh0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRTdHlsZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gYWpvdXRlciBsZXMgbWV0YWRvbm7DqWVzIGRlIGNhbGN1bCBldCBkZSBjb25maWd1cmF0aW9uXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgZGVmYXVsdFN0eWxlIDogc3R5bGVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYWpvdXTDqWVzIMOgIGxhIHJhY2luZSA6XG4gICAgICAgICAgICAvLyBleC4gXCJnZW9wb3J0YWlsOmNvbXB1dGVcIiA6IHt9XG4gICAgICAgICAgICBvcHRpb25zLmV4dGVuc2lvbnMgPSB7XG4gICAgICAgICAgICAgICAgXCJnZW9wb3J0YWlsOmNvbXB1dGVcIiA6IGRhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgQ2xhc3NOYW1lID0gbnVsbDtcbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuZm9ybWF0LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJLTUxcIjpcbiAgICAgICAgICAgICAgICBvcHRpb25zLndyaXRlU3R5bGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dQb2ludE5hbWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBDbGFzc05hbWUgPSBuZXcgS01MRXh0ZW5kZWQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiR1BYXCI6XG4gICAgICAgICAgICAgICAgQ2xhc3NOYW1lID0gbmV3IEdQWEV4dGVuZGVkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkdFT0pTT05cIjpcbiAgICAgICAgICAgICAgICBDbGFzc05hbWUgPSBuZXcgR2VvSlNPTkV4dGVuZGVkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkltcG9zc2libGUgdG8gZXhwb3J0IDogZm9ybWF0IHVua25vd24gIT9cIik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXRQcm9qID0gbGF5ZXIuZ2V0U291cmNlKCkuZ2V0UHJvamVjdGlvbigpO1xuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gb24gZGV0ZXJtaW5lIGxhIHByb2plY3Rpb24gZGUgbGEgY2FydGVcbiAgICAgICAgLy8gc2kgbGUgY29tcG9zYW50IGEgw6l0w6kgYWpvdXTDqSBzdXIgbGEgY2FydGUgdmlhIGxlIG3DqWNhbmlzbWUgZCdPcGVuTGF5ZXIuLi5cbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG4gICAgICAgIGlmIChtYXApIHtcbiAgICAgICAgICAgIGZlYXRQcm9qID0gZmVhdFByb2ogfHwgbWFwLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmVhdHVyZXMgPSBsYXllci5nZXRTb3VyY2UoKS5nZXRGZWF0dXJlcygpO1xuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gcGFyIGRlZmF1dCwgd2VibWVyY2F0b3Igb3UgXCJFUFNHOjM4NTdcIlxuICAgICAgICByZXN1bHQgPSBDbGFzc05hbWUud3JpdGVGZWF0dXJlcyhmZWF0dXJlcywge1xuICAgICAgICAgICAgZGF0YVByb2plY3Rpb24gOiBcIkVQU0c6NDMyNlwiLFxuICAgICAgICAgICAgZmVhdHVyZVByb2plY3Rpb24gOiBmZWF0UHJvaiB8fCBcIkVQU0c6Mzg1N1wiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgZXZlbnQgZG9tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogLi4uXG4gICAgICogQHBhcmFtIHsqfSBlIC0gQ2xpY2tcbiAgICAgKi9cbiAgICBvbkNsaWNrQnV0dG9uRXhwb3J0IChlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1BsdWdnYWJsZUNvbnRyb2woKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDb21wb25hbnQgbm90IHBsdWdnYWJsZSB3aXRoIHRoZSBjb250cm9sICFcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGF5ZXIgPSB0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRMYXllcigpO1xuICAgICAgICB2YXIgZGF0YSA9ICh0aGlzLm9wdGlvbnMuY29udHJvbC5nZXREYXRhICE9PSB1bmRlZmluZWQpID8gdGhpcy5vcHRpb25zLmNvbnRyb2wuZ2V0RGF0YSgpIDoge307XG4gICAgICAgIHZhciBzdHlsZSA9ICh0aGlzLm9wdGlvbnMuY29udHJvbC5nZXRTdHlsZSAhPT0gdW5kZWZpbmVkKSA/IHRoaXMub3B0aW9ucy5jb250cm9sLmdldFN0eWxlKCkgOiB7fTtcblxuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuZXhwb3J0RmVhdHVyZXMobGF5ZXIsIGRhdGEsIHN0eWxlKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQgPT09IFwibnVsbFwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogZXZlbnQgdHJpZ2dlcmVkIHdoZW4gdGhlIGV4cG9ydCBpcyBmaW5pc2hlZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgZXhwb3J0OmNvbXB1dGVcbiAgICAgICAgICogQHR5cGVkZWYge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHR5cGUgLSBldmVudFxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGFyZ2V0IC0gaW5zdGFuY2UgRXhwb3J0XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb250ZW50IC0gZXhwb3J0IGRhdGFcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogRXhwb3J0Lm9uKFwiZXhwb3J0OmNvbXB1dGVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhlLnRhcmdldCk7XG4gICAgICAgICAqIH0pXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgdHlwZSA6IFwiZXhwb3J0OmNvbXB1dGVcIixcbiAgICAgICAgICAgIGNvbnRlbnQgOiBjb250ZW50XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gbGEgY2FsbGJhY2sgYW5udWxlIGxlIGRvd25sb2FkIGR1IGZpY2hpZXIuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FeHBvcnQgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5vbkV4cG9ydCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub25FeHBvcnQoY29udGVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAvLyBkZXRlcm1pbmVyIGxlIGJvbiBjaGFyc2V0ICFcbiAgICAgICAgdmFyIGNoYXJzZXQgPSBcInV0Zi04XCI7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImRhdGE6XCIgKyB0aGlzLm1pbWVUeXBlICsgXCI7Y2hhcnNldD1cIiArIGNoYXJzZXQgKyBcIixcIiArIGVuY29kZVVSSUNvbXBvbmVudChjb250ZW50KSk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgdGhpcy5vcHRpb25zLm5hbWUgKyB0aGlzLmV4dGVuc2lvbik7XG4gICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtcbiAgICAgICAgICAgIGV2ZW50LmluaXRFdmVudChcImNsaWNrXCIsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgbGluay5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHVibGljIHNldHRlcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250cm9sIC0gLi4uXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNldENvbnRyb2wgKGNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gdGFyZ2V0IC0gLi4uXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNldFRhcmdldCAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLi4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdCAtIC4uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzZXRGb3JtYXQgKGZvcm1hdCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gZm9ybWF0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmZvcm1hdCkge1xuICAgICAgICAgICAgY2FzZSBcIktNTFwiOlxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gXCIua21sXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IFwiYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiR1BYXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBcIi5ncHhcIjtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbWVUeXBlID0gXCJhcHBsaWNhdGlvbi9ncHgreG1sXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiR0VPSlNPTlwiOlxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gXCIuZ2VvanNvblwiO1xuICAgICAgICAgICAgICAgIHRoaXMubWltZVR5cGUgPSBcImFwcGxpY2F0aW9uL2dlbytqc29uXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIHJlZGVmaW5lIGZvcm1hdCBieSBkZWZhdWx0ICFcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gXCJHRU9KU09OXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBcIi5nZW9qc29uXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IFwiYXBwbGljYXRpb24vZ2VvK2pzb25cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gLi4uXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNldE5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIC4uLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSAtIC4uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzZXRUaXRsZSAodGl0bGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbikge1xuICAgICAgICAgICAgLy8gYWZmaWNoZXIgbCdpY29uZSBkdSBtZW51IC8gdGl0cmVcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnZhbHVlID0gKHRoaXMub3B0aW9ucy5tZW51KSA/IHRoaXMuaWNvbiArIHRpdGxlIDogdGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAuLi5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIC4uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzZXRNZW51IChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1lbnUgPSBhY3RpdmU7XG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbikge1xuICAgICAgICAgICAgLy8gYWZmaWNoZXIgbCdpY29uZSBkdSBtZW51IC8gdGl0cmVcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnZhbHVlID0gKHRoaXMub3B0aW9ucy5tZW51KSA/IHRoaXMuaWNvbiArIHRoaXMub3B0aW9ucy50aXRsZSA6IHRoaXMub3B0aW9ucy50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZW51ICYmIHRoaXMub3B0aW9ucy5tZW51KSB7XG4gICAgICAgICAgICAvLyBhZmZpY2hlciBsZSBtZW51XG4gICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5tZW51LmNsYXNzTmFtZTtcbiAgICAgICAgICAgIHRoaXMubWVudS5jbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSh0aGlzLm1lbnVDbGFzc0hpZGRlbiwgXCJcIik7XG4gICAgICAgICAgICAvLyBmb3JtYXQgcGFyIGRlZmF1dFxuICAgICAgICAgICAgdmFyIHJhZGlvcyA9IHRoaXMubWVudS5xdWVyeVNlbGVjdG9yQWxsKGBpbnB1dFt0eXBlPXJhZGlvXVtuYW1lPVwiZm9ybWF0XCJdYCk7XG4gICAgICAgICAgICByYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgICAgICAgICAvLyByYWRpbyBjaGVja2VkIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICBpZiAocmFkaW8uaWQudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuZm9ybWF0LnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG59O1xuXG4vLyBvbiByw6ljdXDDqHJlIGxlcyBtw6l0aG9kZXMgZGUgbGEgY2xhc3NlIERPTVxuVXRpbHMuYXNzaWduKEJ1dHRvbkV4cG9ydC5wcm90b3R5cGUsIEV4cG9ydERPTSk7XG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbkV4cG9ydDtcblxuLy8gRXhwb3NlIEV4cG9ydCBhcyBvbC5jb250cm9sLkV4cG9ydCAoZm9yIGEgYnVpbGQgYnVuZGxlKVxuaWYgKHdpbmRvdy5vbCAmJiB3aW5kb3cub2wuY29udHJvbCkge1xuICAgIHdpbmRvdy5vbC5jb250cm9sLkV4cG9ydCA9IEJ1dHRvbkV4cG9ydDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/Export.js\n"); /***/ }), @@ -2645,7 +2645,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS_Controls_SearchEngine_GPsearchEngineOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CSS/Controls/SearchEngine/GPsearchEngineOpenLayers.css */ \"./src/OpenLayers/CSS/Controls/SearchEngine/GPsearchEngineOpenLayers.css\");\n/* harmony import */ var _CSS_Controls_SearchEngine_GPsearchEngineOpenLayers_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_SearchEngine_GPsearchEngineOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ol/control/Control */ \"ol/control/Control\");\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ol_control_Control__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ol_Overlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ol/Overlay */ \"ol/Overlay\");\n/* harmony import */ var ol_Overlay__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ol_Overlay__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var ol_proj__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ol/proj */ \"ol/proj\");\n/* harmony import */ var ol_proj__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(ol_proj__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! geoportal-access-lib */ \"./node_modules/geoportal-access-lib/src/Gp.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Utils_Markers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Utils/Markers */ \"./src/OpenLayers/Controls/Utils/Markers.js\");\n/* harmony import */ var _Utils_Interactions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Utils/Interactions */ \"./src/OpenLayers/Controls/Utils/Interactions.js\");\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Common/Utils/SearchEngineUtils */ \"./src/Common/Utils/SearchEngineUtils.js\");\n/* harmony import */ var _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Common/Utils/GeocodeUtils */ \"./src/Common/Utils/GeocodeUtils.js\");\n/* harmony import */ var _Common_Controls_SearchEngineDOM__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Common/Controls/SearchEngineDOM */ \"./src/Common/Controls/SearchEngineDOM.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n// import CSS\n\n// import OpenLayers\n\n\n\n// import geoportal library access\n\n// import local\n\n\n\n\n\n\n\n// DOM\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getLogger(\"searchengine\");\n\n/**\n * @classdesc\n * SearchEngine control\n *\n * @constructor\n * @extends {ol.control.Control}\n * @type {ol.control.SearchEngine}\n * @alias ol.control.SearchEngine\n * @param {Object} options - control options\n * @param {String} [options.apiKey] - API key. The key \"calcul\" is used by default.\n * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)\n * @param {Boolean} [options.collapsed = true] - collapse mode, true by default\n * Value possible : auto or zoom level.\n * Possible to overload it with a function :\n * zoomTo : function (info) {\n * // do some stuff...\n * return zoom;\n * }\n * @param {String} [options.placeholder] - Placeholder in search bar. Default is \"Rechercher un lieu, une adresse\".\n * @param {Boolean} [options.displayMarker = true] - set a marker on search result, defaults to true.\n * @param {String} [options.markerStyle = \"lightOrange\"] - Marker style. Currently possible values are \"lightOrange\" (default value), \"darkOrange\", \"red\" and \"turquoiseBlue\".\n * @param {Boolean} [options.displayAdvancedSearch = true] - False to disable advanced search tools (it will not be displayed). Default is true (displayed)\n * @param {Object} [options.advancedSearch] - advanced search options for geocoding (filters). Properties can be found among geocode options.filterOptions (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode})\n * @param {Object} [options.resources] - resources to be used by geocode and autocompletion services :\n * @param {String} [options.resources.geocode] - resources geocoding, by default : \"location\"\n * @param {Array} [options.resources.autocomplete] - resources autocompletion, by default : [\"PositionOfInterest\", \"StreetAddress\"]\n * @param {Boolean} [options.displayAdvancedSearch = true] - False to disable advanced search tools (it will not be displayed). Default is true (displayed)\n * @param {Object} [options.advancedSearch] - advanced search options for geocoding (filters). Properties can be found among geocode options.filterOptions (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode})\n * @param {Object} [options.geocodeOptions = {}] - options of geocode service (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode})\n * @param {Object} [options.autocompleteOptions = {}] - options of autocomplete service (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete Gp.Services.autoComplete}\n * @param {Object} [options.autocompleteOptions.serviceOptions] - options of autocomplete service\n * @param {Boolean} [options.autocompleteOptions.triggerGeocode = false] - trigger a geocoding request if the autocompletion does not return any suggestions, false by default\n * @param {Number} [options.autocompleteOptions.triggerDelay = 1000] - waiting time before sending the geocoding request, 1000ms by default\n * @param {Sting|Numeric|Function} [options.zoomTo] - zoom to results, by default, current zoom.\n * @fires searchengine:autocomplete:click\n * @fires searchengine:geocode:click\n * @example\n * var SearchEngine = ol.control.SearchEngine({\n * apiKey : \"CLEAPI\",\n * collapsed : true,\n * resources : {\n * geocode : [\"StreetAddress\", \"PositionOfInterest\"],\n * autocomplete : [\"StreetAddress\"]\n * },\n * advancedSearch : {\n * PositionOfInterest : [{name : \"municipality\", title : \"Ville\"}],\n * StreetAddress : [{...}]\n * },\n * geocodeOptions : {},\n * autocompleteOptions : {}\n * });\n *\n * SearchEngine.on(\"searchengine:autocomplete:click\", function (e) {\n * console.warn(\"autocomplete\", e.location);\n * });\n * SearchEngine.on(\"searchengine:geocode:click\", function (e) {\n * console.warn(\"geocode\", e.location);\n * });\n */\nvar SearchEngine = function (Control) {\n /**\n * See {@link ol.control.SearchEngine}\n * @module SearchEngine\n * @alias module:~Controls/SearchEngine\n * @param {*} options - options\n * @example\n * import SearchEngine from \"src/OpenLayers/Controls/SearchEngine\"\n */\n function SearchEngine(options) {\n options = options || {};\n if (!(this instanceof SearchEngine)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n\n // initialisation du composant\n this.initialize(options);\n\n // // Widget main DOM container\n this._container = this._initContainer();\n // info: le container sera complété lors de l'ajout à la carte (setMap), car certains composants nécessitent d'être liés à la map.\n this._containerElement = null;\n\n // on peut éventuellement encapsuler le composant dans une div passée par l'utilisateur\n if (options.element && options.element.appendChild) {\n // dans ce cas on stocke les deux container\n options.element.appendChild(this._container);\n this._containerElement = options.element;\n }\n\n // call ol.control.Control constructor\n Control.call(this, {\n element: this._containerElement || this._container,\n target: options.target,\n render: options.render\n });\n }\n ;\n\n // Inherits from ol.control.Control\n if (Control) SearchEngine.__proto__ = Control;\n\n /*\n * @lends module:SearchEngine\n */\n SearchEngine.prototype = Object.create(Control.prototype, {});\n\n // on récupère les méthodes de la classe commune IsoDOM\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(SearchEngine.prototype, _Common_Controls_SearchEngineDOM__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n\n /**\n * Constructor (alias)\n *\n * @private\n */\n SearchEngine.prototype.constructor = SearchEngine;\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n\n /**\n * Overwrite OpenLayers setMap method\n *\n * @param {ol.Map} map - Map.\n */\n SearchEngine.prototype.setMap = function (map) {\n if (!map) {\n this._clearResults();\n }\n\n // on appelle la méthode setMap originale d'OpenLayers\n Control.prototype.setMap.call(this, map);\n };\n\n /**\n * Returns true if widget is collapsed (minimized), false otherwise\n *\n * @returns {Boolean} collapsed - true if widget is collapsed\n */\n SearchEngine.prototype.getCollapsed = function () {\n return this.collapsed;\n };\n\n /**\n * Collapse or display widget main container\n *\n * @param {Boolean} collapsed - True to collapse widget, False to display it\n */\n SearchEngine.prototype.setCollapsed = function (collapsed) {\n if (collapsed === undefined) {\n logger.log(\"[ERROR] SearchEngine:setCollapsed - missing collapsed parameter\");\n return;\n }\n if (collapsed && this.collapsed || !collapsed && !this.collapsed) {\n return;\n }\n this._showSearchEngineInput.click();\n this.collapsed = collapsed;\n };\n\n /**\n * Get locations data from geocode service\n *\n * @returns {Object} data - locations\n */\n SearchEngine.prototype.getData = function () {\n return this._geocodedLocations;\n };\n // ################################################################### //\n // ##################### init component ############################## //\n // ################################################################### //\n\n /**\n * Initialize SearchEngine control (called by SearchEngine constructor)\n *\n * @param {Object} options - constructor options\n * @private\n */\n SearchEngine.prototype.initialize = function (options) {\n this._checkInputOptions(options);\n\n // define default options\n this.options = {\n collapsed: true,\n zoomTo: \"\",\n resources: {\n geocode: \"\",\n autocomplete: []\n },\n displayAdvancedSearch: true,\n advancedSearch: {},\n geocodeOptions: {\n serviceOptions: {}\n },\n autocompleteOptions: {\n serviceOptions: {},\n triggerGeocode: false,\n triggerDelay: 1000\n },\n displayMarker: true,\n markerStyle: \"lightOrange\",\n placeholder: \"Rechercher un lieu, une adresse\"\n };\n\n // merge with user options\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].mergeParams(this.options, options);\n if (this.options.resources.geocode === \"\") {\n this.options.resources.geocode = \"address,poi\";\n }\n if (this.options.resources.autocomplete.length === 0) {\n this.options.resources.autocomplete = [\"PositionOfInterest\", \"StreetAddress\"];\n }\n\n /** {Boolean} specify if searchEngine control is collapsed (true) or not (false) */\n this.collapsed = this.options.collapsed;\n\n // identifiant du contrôle : utile pour suffixer les identifiants CSS (pour gérer le cas où il y en a plusieurs dans la même page)\n this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__[\"default\"].generate();\n this._showSearchEngineInput = null;\n\n // container de l'input de recherche\n this._inputSearchContainer = null;\n\n // container des reponses de l'autocompletion\n this._autocompleteContainer = null;\n this._suggestedContainer = null;\n\n // listes des reponses de l'autocompletion\n this._suggestedLocations = [];\n\n // container des reponses du geocodage\n this._geocodedContainer = null;\n\n // liste des reponses du geocodage\n this._geocodedLocations = [];\n\n // container des filtres du geocodage\n this._filterContainer = null;\n\n // ressource de geocodage selectionnée pour le geocodage avancé\n this._currentGeocodingCode = null;\n\n // localisant */\n this._currentGeocodingLocation = null;\n\n // liste des filtres du geocodage pour le geocodage avancé\n this._advancedSearchFilters = {};\n this._initAdvancedSearchFilters();\n\n // liste des ressources du geocodage pour le geocodage avancé\n this._advancedSearchCodes = [];\n this._initAdvancedSearchCodes();\n\n // marker\n this._marker = null;\n\n // marker style\n var _markerStyle = this.options.markerStyle;\n this._markerUrl = Object.keys(_Utils_Markers__WEBPACK_IMPORTED_MODULE_7__[\"default\"]).indexOf(_markerStyle) === -1 ? _Utils_Markers__WEBPACK_IMPORTED_MODULE_7__[\"default\"][\"lightOrange\"] : _Utils_Markers__WEBPACK_IMPORTED_MODULE_7__[\"default\"][_markerStyle];\n\n // marker display\n this._displayMarker = this.options.displayMarker;\n\n // popup\n this._popupContent = null;\n this._popupDiv = this._initPopupDiv();\n this._popupOverlay = null;\n\n // trigger geocode\n this._triggerHandler = null;\n };\n\n /**\n * this method is called by this.initialize()\n * and makes sure input options are correctly formated\n *\n * @param {Object} options - options\n *\n * @private\n */\n SearchEngine.prototype._checkInputOptions = function (options) {\n var i;\n if (options.resources) {\n // on vérifie que resources est bien un objet\n if (_typeof(options.resources) === \"object\") {\n // ressources de geocodage\n var geocodeResources = options.resources.geocode;\n if (geocodeResources) {\n // on vérifie que la liste des ressources de geocodage est bien un tableau\n if (Array.isArray(geocodeResources)) {\n var geocodeResourcesList = [\"StreetAddress\", \"PositionOfInterest\", \"CadastralParcel\", \"Administratif\"];\n for (i = 0; i < geocodeResources.length; i++) {\n if (geocodeResourcesList.indexOf(geocodeResources[i]) === -1) {\n // si la resource n'est pas référencée, on l'enlève\n // geocodeResources.splice(i, 1);\n logger.log(\"[SearchEngine] options.resources.geocode : \" + geocodeResources[i] + \" is not a resource for geocode\");\n }\n }\n } else {\n logger.log(\"[SearchEngine] 'options.resources.geocode' parameter should be an array\");\n geocodeResources = null;\n }\n }\n\n // ressources d'autocompletion\n var autocompleteResources = options.resources.autocomplete;\n if (autocompleteResources) {\n // on vérifie que la liste des ressources d'autocompletion est bien un tableau\n if (Array.isArray(autocompleteResources)) {\n var autocompleteResourcesList = [\"StreetAddress\", \"PositionOfInterest\"];\n for (i = 0; i < autocompleteResources.length; i++) {\n if (autocompleteResourcesList.indexOf(autocompleteResources[i]) === -1) {\n // si la resource n'est pas référencée, on l'enlève\n // autocompleteResources.splice(i, 1);\n logger.log(\"[SearchEngine] options.resources.autocomplete : \" + autocompleteResources[i] + \" is not a resource for autocomplete\");\n }\n }\n } else {\n logger.log(\"[SearchEngine] 'options.resources.autocomplete' parameter should be an array\");\n autocompleteResources = null;\n }\n }\n } else {\n logger.log(\"[SearchEngine] 'resources' parameter should be an object\");\n options.resources = null;\n }\n }\n };\n\n /**\n * this method is called by this.initialize()\n * and initialize the geocoding resources titles.\n *\n * @private\n */\n SearchEngine.prototype._initAdvancedSearchCodes = function () {\n // INFORMATION\n // on y ajoute les filtres attributaires pour une table de ressources\n // selectionnée via un evenement (onchange) de la liste deroulante du\n // menu avancé du geocodage.\n // cf. onGeocodingAdvancedSearchCodeChange() pour la selection de la\n // ressource de geocodage à afficher\n\n var geocodeResources = this.options.resources.geocode;\n if (geocodeResources === \"location\") {\n geocodeResources = [\"PositionOfInterest\", \"StreetAddress\", \"CadastralParcel\"];\n }\n if (!Array.isArray(geocodeResources)) {\n geocodeResources = [geocodeResources];\n }\n for (var i = 0; i < geocodeResources.length; i++) {\n switch (geocodeResources[i]) {\n case \"PositionOfInterest\":\n this._advancedSearchCodes.push({\n id: \"PositionOfInterest\",\n title: \"Lieux/toponymes\"\n });\n break;\n case \"StreetAddress\":\n this._advancedSearchCodes.push({\n id: \"StreetAddress\",\n title: \"Adresses\"\n });\n break;\n case \"CadastralParcel\":\n this._advancedSearchCodes.push({\n id: \"CadastralParcel\",\n title: \"Parcelles cadastrales\"\n });\n break;\n default:\n break;\n }\n }\n // par défaut, au cas où aucune ressource passée en option ne correspond à celles attendues\n if (this._advancedSearchCodes.length === 0) {\n this._advancedSearchCodes = [{\n id: \"StreetAddress\",\n title: \"Adresses\"\n }, {\n id: \"PositionOfInterest\",\n title: \"Lieux/toponymes\"\n }, {\n id: \"CadastralParcel\",\n title: \"Cadastre\"\n }];\n }\n logger.log(\"advancedSearchCodes\", this._advancedSearchCodes);\n };\n\n /**\n * this method is called by this.onAdd()\n * and initialize the advanced geocoding filters.\n *\n * @private\n */\n SearchEngine.prototype._initAdvancedSearchFilters = function () {\n // liste des filtres par defauts pour toutes les ressources\n this._advancedSearchFilters = _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_10__[\"default\"].advancedSearchFiltersByDefault;\n\n // on merge les options avancées avec celles par defaut\n var advancedSearchFiltersCustom = this.options.advancedSearch;\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(this._advancedSearchFilters, advancedSearchFiltersCustom);\n logger.log(\"advancedSearchFilters\", this._advancedSearchFilters);\n };\n\n /**\n * this method is called by this.initialize() and initialize popup div\n * (to display results information on marker click)\n *\n * @return {Object} element - DOM element for popup\n * @private\n */\n SearchEngine.prototype._initPopupDiv = function () {\n var context = this;\n var element = document.createElement(\"div\");\n element.className = \"gp-feature-info-div\";\n var closer = document.createElement(\"input\");\n closer.type = \"button\";\n closer.className = \"gp-styling-button closer\";\n // on closer click : remove popup\n closer.onclick = function () {\n if (context._popupOverlay != null) {\n context._popupOverlay.setPosition(undefined);\n }\n return false;\n };\n this._popupContent = document.createElement(\"div\");\n this._popupContent.className = \"gp-features-content-div\";\n this._popupContent.style[\"min-width\"] = \"200px\";\n element.appendChild(this._popupContent);\n element.appendChild(closer);\n return element;\n };\n\n // ################################################################### //\n // ######################## DOM initialize ########################### //\n // ################################################################### //\n\n /**\n * Create control main container\n *\n * @returns {DOMElement} DOM element\n *\n * @private\n */\n SearchEngine.prototype._initContainer = function () {\n // create main container\n var container = this._createMainContainerElement();\n\n // create show search engine element\n var inputShow = this._showSearchEngineInput = this._createShowSearchEngineElement();\n container.appendChild(inputShow);\n\n // mode \"collapsed\"\n if (!this.options.collapsed) {\n inputShow.checked = true;\n }\n\n // create search engine picto\n var picto = this._createShowSearchEnginePictoElement();\n container.appendChild(picto);\n var search = this._inputSearchContainer = this._createSearchInputElement(this.options.placeholder);\n var context = this;\n if (search.addEventListener) {\n search.addEventListener(\"click\", function () {\n context.onAutoCompleteInputClick();\n });\n } else if (search.attachEvent) {\n search.attachEvent(\"onclick\", function () {\n context.onAutoCompleteInputClick();\n });\n }\n container.appendChild(search);\n if (this.options.displayAdvancedSearch) {\n var advancedShow = this._createShowAdvancedSearchElement();\n container.appendChild(advancedShow);\n\n // INFO je decompose les appels car j'ai besoin de recuperer le container\n // des filtres\n var advancedPanel = this._createAdvancedSearchPanelElement();\n var advancedHeader = this._createAdvancedSearchPanelHeaderElement();\n var advancedForm = this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes);\n var advancedFormFilters = this._filterContainer = this._createAdvancedSearchFormFiltersElement();\n this._setFilter(this._advancedSearchCodes[0].id); // ex \"PositionOfInterest\"\n var advancedFormInput = this._createAdvancedSearchFormInputElement();\n advancedForm.appendChild(advancedFormFilters);\n advancedForm.appendChild(advancedFormInput);\n advancedPanel.appendChild(advancedHeader);\n advancedPanel.appendChild(advancedForm);\n container.appendChild(advancedPanel);\n }\n\n // INFO je decompose les appels car j'ai besoin de recuperer le container\n // des resultats de l'autocompletion\n var autocomplete = this._autocompleteContainer = this._createAutoCompleteElement();\n var autocompleteList = this._suggestedContainer = this._createAutoCompleteListElement();\n autocomplete.appendChild(autocompleteList);\n container.appendChild(autocomplete);\n\n // INFO je decompose les appels car j'ai besoin de recuperer le container\n // des resultats du geocodage\n var geocode = this._createGeocodeResultsElement();\n var geocodeList = this._geocodedContainer = this._createGeocodeResultsListElement();\n geocode.appendChild(geocodeList);\n container.appendChild(geocode);\n return container;\n };\n\n /**\n * this method is called by :\n * - this._initContainer() : ...\n * - this.onGeocodingAdvancedSearchCodeChoice() : ...\n * and initialize or create the filters container HTMLElement\n * to the geocoding advanced menu.\n *\n * @param {String} code - resource geocoding name\n *\n * @returns {DOMElement} DOM element\n * @private\n */\n SearchEngine.prototype._setFilter = function (code) {\n // INFORMATION\n // Nous avons 2 solutions possibles pour la mise en place des filtres.\n // 1. Soit on decide de creer tous les filtres pour chaque ressource\n // de geocodage à l'initialisation du composant, et on joue sur le\n // mode 'hidden' pour n'afficher que la ressource selectionnée.\n // 2. Soit on decide de creer à chaque fois les filtres pour la\n // ressource selectionnée.\n // Chaque solution a ses inconvenients/avantages.\n // Implementation du choix 2 car elle offre plus de souplesse pour\n // recuperer les 'form-data'...\n\n var container = this._filterContainer;\n var codeFound = false;\n for (var i = 0; i < this._advancedSearchCodes.length; i++) {\n if (this._advancedSearchCodes[i].id === code) {\n codeFound = true;\n break;\n }\n }\n if (!codeFound) {\n // cette ressource n'est pas disponible,\n // on supprime les anciens enfants...\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n return;\n }\n\n // on sauvegarde la ressource de geocodage sélectionnée\n this._currentGeocodingCode = code;\n\n // on supprime les enfants...\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n var lstAttributs = this._advancedSearchFilters[code];\n if (!lstAttributs || lstAttributs.length === 0) {\n // cette ressource n'est pas parametrable\n return;\n }\n var divTable = this._createAdvancedSearchFiltersTableElement(code, true);\n for (var j = 0; j < lstAttributs.length; j++) {\n var divFilter = this._createAdvancedSearchFiltersAttributElement(lstAttributs[j]);\n divTable.appendChild(divFilter);\n }\n container.appendChild(divTable);\n return container;\n };\n\n // ################################################################### //\n // ################ methods to request and results ################### //\n // ################################################################### //\n\n /**\n * this method is called by this.onAutoCompleteSearch()\n * and executes a request to the service.\n *\n * @param {Object} settings - service settings\n * @param {String} settings.text - text\n * @param {Function} settings.onSuccess - callback\n * @param {Function} settings.onFailure - callback\n * @private\n */\n SearchEngine.prototype._requestAutoComplete = function (settings) {\n // on ne fait pas de requête si on n'a pas renseigné de parametres !\n if (!settings || _typeof(settings) === \"object\" && Object.keys(settings).length === 0) {\n return;\n }\n\n // on ne fait pas de requête si la parametre 'text' est vide !\n if (!settings.text) {\n return;\n }\n logger.log(settings);\n var options = {};\n // on recupere les options du service\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, this.options.autocompleteOptions.serviceOptions);\n // ainsi que la recherche et les callbacks\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, settings);\n\n // on ajoute le paramètre filterOptions.type spécifiant les ressources.\n var resources = this.options.resources.autocomplete;\n if (resources && Array.isArray(resources)) {\n // il se peut que l'utilisateur ait surchargé ce paramètre dans geocodeOptions,\n if (!options.type) {\n options.type = resources;\n }\n }\n\n // cas où la clef API n'est pas renseignée dans les options du service,\n // on utilise celle renseignée au niveau du controle ou la clé \"calcul\" par défaut.\n options.apiKey = options.apiKey || this.options.apiKey;\n\n // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert\n // true par défaut (https)\n if (typeof options.ssl !== \"boolean\") {\n if (typeof this.options.ssl === \"boolean\") {\n options.ssl = this.options.ssl;\n } else {\n options.ssl = true;\n }\n }\n logger.log(options);\n geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Services.autoComplete(options);\n };\n\n /**\n * this method is called by this.onAutoCompleteSearchText() (case of success)\n * and fills the container of the location list.\n * it creates a HTML Element per location\n *\n * @param {Array} locations - Array of Gp.Services.AutoComplete.SuggestedLocation corresponding to autocomplete results list\n * @private\n */\n SearchEngine.prototype._fillAutoCompletedLocationListContainer = function (locations) {\n if (!locations || locations.length === 0) {\n return;\n }\n\n // on vide la liste avant de la construire\n var element = this._suggestedContainer;\n if (element.childElementCount) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n }\n this._displaySuggestedLocation();\n for (var i = 0; i < locations.length; i++) {\n // Proposals are dynamically filled in Javascript by autocomplete service\n this._createAutoCompletedLocationElement(locations[i], i);\n }\n };\n\n /**\n * this method is called by this.onAutoCompleteSearch()\n * and executes a request to the service.\n *\n * @param {Object} settings - service settings\n * @param {String} settings.location - text\n * @param {Function} settings.onSuccess - callback\n * @param {Function} settings.onFailure - callback\n * @private\n */\n SearchEngine.prototype._requestGeocoding = function (settings) {\n // on ne fait pas de requête si on n'a pas renseigné de parametres !\n if (!settings || _typeof(settings) === \"object\" && Object.keys(settings).length === 0) {\n return;\n }\n\n // on ne fait pas de requête si la parametre 'text' est vide !\n if (settings.query === null) {\n return;\n }\n logger.log(settings);\n var options = {};\n // on recupere les options du service\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, this.options.geocodeOptions.serviceOptions);\n // ainsi que la recherche et les callbacks\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, settings);\n // on redefinie les callbacks si les callbacks de service existent\n var self = this;\n var bOnFailure = !!(this.options.geocodeOptions.serviceOptions.onFailure !== null && typeof this.options.geocodeOptions.serviceOptions.onFailure === \"function\"); // cast variable to boolean\n var bOnSuccess = !!(this.options.geocodeOptions.serviceOptions.onSuccess !== null && typeof this.options.geocodeOptions.serviceOptions.onSuccess === \"function\");\n if (bOnSuccess) {\n var cbOnSuccess = function cbOnSuccess(e) {\n settings.onSuccess.call(self, e);\n self.options.geocodeOptions.serviceOptions.onSuccess.call(self, e);\n };\n options.onSuccess = cbOnSuccess;\n }\n if (bOnFailure) {\n var cbOnFailure = function cbOnFailure(e) {\n settings.onFailure.call(self, e);\n self.options.geocodeOptions.serviceOptions.onFailure.call(self, e);\n };\n options.onFailure = cbOnFailure;\n }\n\n // on ajoute le paramètre index spécifiant les ressources.\n var resources = this.options.resources.geocode;\n if (resources) {\n // il se peut que l'utilisateur ait surchargé ce paramètre dans geocodeOptions,\n // ou qu'il ait déjà été rempli (cas de la recherche avancée)\n if (!options.index) {\n options.index = resources;\n }\n }\n\n // cas où la clef API n'est pas renseignée dans les options du service,\n // on utilise celle renseignée au niveau du controle ou la clé \"calcul\" par défaut\n options.apiKey = options.apiKey || this.options.apiKey;\n\n // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert\n // true par défaut (https)\n if (typeof options.ssl !== \"boolean\") {\n if (typeof this.options.ssl === \"boolean\") {\n options.ssl = this.options.ssl;\n } else {\n options.ssl = true;\n }\n }\n logger.log(options);\n geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Services.geocode(options);\n };\n\n /**\n * this method is called by this.onGeocodingSearch()\n * and fills the container of the location results.\n * it creates a HTML Element per location\n * (cf. this. ...)\n *\n * @param {Object[]} locations - locations\n *\n * @private\n */\n SearchEngine.prototype._fillGeocodedLocationListContainer = function (locations) {\n if (!locations || locations.length === 0) {\n this._clearGeocodedLocation();\n return;\n }\n\n // on vide la liste avant de la construire\n var element = this._geocodedContainer;\n if (element.childElementCount) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n }\n for (var i = 0; i < locations.length; i++) {\n logger.log(locations[i]);\n // Proposals are dynamically filled in Javascript by autocomplete service\n this._createGeocodedLocationElement(locations[i], i);\n }\n\n // sauvegarde de l'etat des locations\n this._geocodedLocations = locations;\n };\n\n // ################################################################### //\n // ######################### other methods ########################### //\n // ################################################################### //\n\n /**\n * this sends the label to the panel.\n *\n * @param {String} label - label suggested location\n * @private\n */\n SearchEngine.prototype._setLabel = function (label) {\n document.getElementById(\"GPsearchInputText-\" + this._uid).value = label;\n };\n\n /**\n * this method is called by this.on*ResultsItemClick()\n * and move/zoom on a position.\n *\n * @param {Array} position - ol.Coordinate object [lon, lat] (en lat/lon : \"EPSG:4326\")\n * @param {Number} zoom - zoom level\n * @private\n */\n SearchEngine.prototype._setPosition = function (position, zoom) {\n var view = this.getMap().getView();\n view.setCenter(position);\n view.setZoom(zoom);\n };\n\n /**\n * this method is called by this.on*ResultsItemClick()\n * and displays a marker.\n * FIXME\n *\n * @param {Array} position - ol.Coordinate object [lon, lat] ou [x, y]\n * @param {Object} info - location information\n * @private\n */\n SearchEngine.prototype._setMarker = function (position, info) {\n var map = this.getMap();\n var context = this;\n\n // remove previous markers\n if (this._marker != null) {\n map.removeOverlay(this._marker);\n this._marker = null;\n }\n if (position) {\n // création de l'élément DOM\n var markerDiv = document.createElement(\"img\");\n markerDiv.src = this._markerUrl;\n\n // ajout de l'évènement onclick (pour afficher une popup)\n if (markerDiv.addEventListener) {\n markerDiv.addEventListener(\"click\", function () {\n context._onResultMarkerSelect(info);\n });\n } else if (markerDiv.attachEvent) {\n // Internet Explorer\n markerDiv.attachEvent(\"onclick\", function () {\n context._onResultMarkerSelect(info);\n });\n }\n\n // création du marker (overlay)\n this._marker = new ol_Overlay__WEBPACK_IMPORTED_MODULE_2___default.a({\n position: position,\n offset: [-25.5, -38],\n element: markerDiv,\n stopEvent: false\n });\n map.addOverlay(this._marker);\n }\n };\n\n /**\n * this method is called by this.on*ResultsItemClick()\n * and get zoom to results.\n *\n * @param {Object} info - info\n *\n * @returns {Integer} zoom\n * @private\n */\n SearchEngine.prototype._getZoom = function (info) {\n var map = this.getMap();\n var key = this.options.zoomTo;\n var zoom = null;\n\n // les valeurs du zooms sont determinées\n // soit par les mots clefs suivants : max, min ou auto\n // soit par un niveau de zoom\n // soit defini par l'utilisateur via une fonction\n\n if (typeof key === \"function\") {\n logger.trace(\"zoom function\");\n zoom = key.call(this, info);\n }\n if (typeof key === \"number\") {\n logger.trace(\"zoom level\");\n zoom = key;\n }\n if (typeof key === \"string\") {\n // if (key === \"max\") {\n // zoom = map.getMaxZoom();\n // } else if (key === \"min\") {\n // zoom = map.getMinZoom();\n // } else\n\n if (key === \"auto\") {\n logger.trace(\"zoom auto\");\n zoom = _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_10__[\"default\"].zoomToResultsByDefault(info);\n } else {\n logger.trace(\"zoom level parsing\");\n var value = parseInt(key, 10);\n if (!isNaN(value)) {\n logger.trace(\"zoom parsing\");\n zoom = value;\n }\n }\n }\n\n // polyfill IE\n Number.isInteger = Number.isInteger || function (value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n };\n\n // test de validité du zoom,\n // on prend le zoom courant par defaut ...\n if (!zoom || zoom === \"\" || !Number.isInteger(zoom)) {\n logger.trace(\"zoom not found, current zoom...\");\n zoom = map.getView().getZoom();\n }\n\n // FIXME test si le zoom est dans l'espace de la carte\n var min = map.minZoom; // .getMinZoom();\n var max = map.maxZoom; // .getMaxZoom();\n if (zoom < min) {\n logger.trace(\"zoom level min...\");\n zoom = min;\n }\n if (zoom > max) {\n logger.trace(\"zoom level max...\");\n zoom = max;\n }\n logger.trace(\"zoom\", zoom);\n return zoom;\n };\n\n /**\n * this method is called on 'click' on this._marker\n * (cf. this._setMarker() )\n * and sets a popup with marker information\n *\n * @param {Object} information - location information\n * @private\n */\n SearchEngine.prototype._onResultMarkerSelect = function (information) {\n var map = this.getMap();\n var popupContent = \"\";\n if (typeof information !== \"string\") {\n if (information.service === \"GeocodedLocation\") {\n popupContent = \"
    \";\n var attributes = information.location.placeAttributes;\n for (var attr in attributes) {\n if (attributes.hasOwnProperty(attr)) {\n if (attr !== \"trueGeometry\" && attr !== \"extraFields\" && attr !== \"houseNumberInfos\" && attr !== \"_count\") {\n popupContent += \"
  • \";\n popupContent += \"\" + attr.toUpperCase() + \" : \";\n popupContent += attributes[attr];\n popupContent += \"
  • \";\n }\n }\n }\n popupContent += \"
\";\n } else if (information.service === \"SuggestedLocation\") {\n popupContent = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getSuggestedLocationFreeform(information.location);\n } else {\n popupContent = \"sans informations.\";\n }\n } else {\n popupContent = information;\n }\n this._popupContent.innerHTML = popupContent;\n if (!this._popupOverlay) {\n // ajout de la popup a la carte comme un overlay\n this._popupOverlay = new ol_Overlay__WEBPACK_IMPORTED_MODULE_2___default.a({\n element: this._popupDiv,\n positioning: \"bottom-center\",\n position: this._marker.getPosition(),\n offset: [0, -42]\n });\n map.addOverlay(this._popupOverlay);\n } else {\n // si l'overlay est déjà créé, on modifie juste sa position\n this._popupOverlay.setPosition(this._marker.getPosition());\n }\n };\n\n // ################################################################### //\n // ###################### other handlers events ###################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'click' on 'GPshowSearchEnginePicto' tag label\n * (cf. this._createShowSearchEnginePictoElement), and it cleans the component\n * when it's closed.\n *\n * @private\n */\n SearchEngine.prototype.onShowSearchEngineClick = function () {\n var map = this.getMap();\n // on supprime toutes les interactions\n _Utils_Interactions__WEBPACK_IMPORTED_MODULE_8__[\"default\"].unset(map);\n this.collapsed = this._showSearchEngineInput.checked;\n // on génère nous même l'evenement OpenLayers de changement de propriété\n // (utiliser ol.control.SearchEngine.on(\"change:collapsed\", function ) pour s'abonner à cet évènement)\n this.dispatchEvent(\"change:collapsed\");\n };\n\n /**\n * this method is called by event 'click' on 'GPsearchInputReset' tag div\n * (cf. this._createSearchInputElement), and it cleans the value of input.\n *\n * @private\n */\n SearchEngine.prototype.onSearchResetClick = function () {\n this._clearResults();\n };\n\n // ################################################################### //\n // ################## handlers events AutoComplete ################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'click' on 'GPlocationOrigin' input\n *\n * @private\n */\n SearchEngine.prototype.onAutoCompleteInputClick = function () {\n var inputSearchTextContainer = document.getElementById(\"GPsearchInputText-\" + this._uid);\n if (inputSearchTextContainer && !inputSearchTextContainer.disabled && inputSearchTextContainer.value.length > 2) {\n this._displaySuggestedLocation();\n }\n };\n\n /**\n * this method is called by event 'keyup' on 'GPsearchInputText' tag input\n * (cf. this._createSearchInputElement), and it gets the value of input.\n * this value is passed as a parameter for the service autocomplete (text).\n * the results of the request are displayed into a drop down menu.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onAutoCompleteSearchText = function (e) {\n var value = e.target.value;\n if (!value) {\n return;\n }\n\n // on sauvegarde le localisant\n this._currentGeocodingLocation = value;\n\n // on limite les requêtes à partir de 3 car. saisie !\n if (value.length < 3) {\n this._clearSuggestedLocation();\n return;\n }\n var _triggerGeocode = this.options.autocompleteOptions.triggerGeocode;\n var _triggerDelay = this.options.autocompleteOptions.triggerDelay;\n\n // INFORMATION\n // on effectue la requête au service d'autocompletion.\n // on met en place des callbacks afin de recuperer les resultats ou\n // les messages d'erreurs du service.\n // les resultats sont affichés dans une liste deroulante.\n var context = this;\n this._requestAutoComplete({\n text: value,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(\"request from AutoComplete\", results);\n if (results) {\n // on sauvegarde l'etat des résultats\n context._suggestedLocations = results.suggestedLocations;\n context._locationsToBeDisplayed = [];\n // on vérifie qu'on n'a pas récupéré des coordonnées nulles (par ex recherche par code postal)\n for (var i = 0; i < context._suggestedLocations.length; i++) {\n var ilocation = context._suggestedLocations[i];\n if (ilocation.position && ilocation.position.x === 0 && ilocation.position.y === 0 && ilocation.fullText) {\n // si les coordonnées sont nulles, il faut relancer une requête de géocodage avec l'attribut \"fullText\" récupéré\n context._getGeocodeCoordinatesFromFullText(ilocation, i);\n } else {\n // sinon on peut afficher normalement le résultat dans la liste\n context._locationsToBeDisplayed.push(ilocation);\n }\n }\n ;\n // on affiche les résultats qui n'ont pas des coordonnées nulles\n context._fillAutoCompletedLocationListContainer(context._locationsToBeDisplayed);\n // on annule eventuellement une requete de geocodage en cours car on obtient des\n // de nouveau des resultats d'autocompletion...\n if (context._triggerHandler) {\n clearTimeout(context._triggerHandler);\n context._triggerHandler = null;\n logger.warn(\"Cancel a geocode request !\");\n }\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n // FIXME\n // où affiche t on les messages : ex. 'No suggestion matching the search' ?\n context._clearSuggestedLocation();\n logger.log(error.message);\n // on envoie une requete de geocodage si aucun resultat d'autocompletion\n // n'a été trouvé ! Et on n'oublie pas d'annuler celle qui est en cours !\n if (error.message === \"No suggestion matching the search\" && _triggerGeocode /* && value.length === 5 */) {\n if (context._triggerHandler) {\n clearTimeout(context._triggerHandler);\n logger.warn(\"Cancel the last geocode request !\");\n }\n context._triggerHandler = setTimeout(function () {\n logger.warn(\"Launch a geocode request (code postal) !\");\n context._requestGeocoding({\n location: value,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(\"request from Geocoding\", results);\n if (results) {\n context._locationsToBeDisplayed = [];\n // on modifie la structure des reponses pour être\n // compatible avec l'autocompletion !\n var locations = results.locations;\n for (var i = 0; i < locations.length; i++) {\n var location = locations[i];\n location.fullText = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getGeocodedLocationFreeform(location);\n location.position = {\n x: location.position.lon,\n y: location.position.lat\n };\n context._locationsToBeDisplayed.push(location);\n }\n context._fillAutoCompletedLocationListContainer(locations);\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n logger.log(error.message);\n }\n });\n }, _triggerDelay);\n }\n }\n });\n var map = this.getMap();\n map.on(\"click\", this._hideSuggestedLocation, this);\n map.on(\"pointerdrag\", this._hideSuggestedLocation, this);\n };\n\n /**\n * this method is called by Gp.Services.autoComplete callback in case of success\n * (cf. this.onAutoCompleteSearchText), for suggested locations with null coordinates\n * (case of postalCode research for instance).\n * Send a geocode request with suggested location 'fullText' attribute, to get its coordinates and display it in autocomplete results list container.\n *\n * @param {Gp.Services.AutoCompleteResponse.SuggestedLocation} suggestedLocation - autocompletion result (with null coordinates) to be geocoded\n * @param {Number} i - suggestedLocation position in Gp.Services.AutoCompleteResponse.suggestedLocations autocomplete results list\n * @private\n */\n SearchEngine.prototype._getGeocodeCoordinatesFromFullText = function (suggestedLocation, i) {\n var context = this;\n geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Services.geocode({\n apiKey: this.options.apiKey,\n ssl: this.options.ssl,\n q: _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getSuggestedLocationFreeform(suggestedLocation),\n index: suggestedLocation.type,\n // callback onSuccess\n onSuccess: function onSuccess(response) {\n logger.log(\"request from Geocoding (coordinates null)\", response);\n if (response.locations && response.locations.length !== 0 && response.locations[0].position) {\n // on modifie les coordonnées du résultat en EPSG:4326 donc lat,lon\n /// \\TODO verifier si l'inversion des coordonnees est necessaire\n if (context._suggestedLocations && context._suggestedLocations[i]) {\n context._suggestedLocations[i].position = {\n lon: response.locations[0].position.y,\n lat: response.locations[0].position.x\n };\n // et on l'affiche dans la liste\n context._locationsToBeDisplayed.unshift(context._suggestedLocations[i]);\n context._fillAutoCompletedLocationListContainer(context._locationsToBeDisplayed);\n }\n }\n },\n // callback onFailure\n onFailure: function onFailure() {\n // si on n'a pas réussi à récupérer les coordonnées, on affiche quand même le résultat\n if (context._suggestedLocations && context._suggestedLocations[i]) {\n context._createAutoCompletedLocationElement(context._suggestedLocations[i], i);\n }\n }\n });\n };\n\n /**\n * this method is called by event 'click' on 'GPautoCompleteResultsList' tag div\n * (cf. this._createAutoCompleteListElement), and it selects the location.\n * this location displays a marker on the map.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onAutoCompletedResultsItemClick = function (e) {\n // TODO on souhaite un comportement different pour la selection des reponses\n // de l'autocompletion :\n // - liste deroulante des reponses,\n // - puis possibilité de cliquer sur une suggestion\n // - mais aussi de la choisir avec le clavier (arrow up/down), puis valider\n // par un return\n // cette selection avec les fleches doit mettre à jour le input !\n // (comme un moteur de recherche de navigateur)\n\n var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__[\"default\"].index(e.target.id);\n logger.log(idx);\n logger.log(this._locationsToBeDisplayed[idx]);\n if (!idx) {\n return;\n }\n var position = [this._locationsToBeDisplayed[idx].position.x, this._locationsToBeDisplayed[idx].position.y];\n var info = {\n service: \"SuggestedLocation\",\n location: this._locationsToBeDisplayed[idx]\n };\n\n // on ajoute le texte de l'autocomplétion dans l'input\n var label = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getSuggestedLocationFreeform(this._locationsToBeDisplayed[idx]);\n this._setLabel(label);\n\n // on sauvegarde le localisant\n this._currentGeocodingLocation = label;\n\n // Info : la position est en EPSG:4326, à transformer dans la projection de la carte\n var view = this.getMap().getView();\n var mapProj = view.getProjection().getCode();\n if (mapProj !== \"EPSG:4326\") {\n // on retransforme les coordonnées de la position dans la projection de la carte\n position = Object(ol_proj__WEBPACK_IMPORTED_MODULE_3__[\"transform\"])(position, \"EPSG:4326\", mapProj);\n }\n // on centre la vue et positionne le marker, à la position reprojetée dans la projection de la carte\n var zoom = this._getZoom(info);\n this._setPosition(position, zoom);\n if (this._displayMarker) {\n this._setMarker(position, info);\n }\n /**\n * event triggered when an element of the results is clicked for autocompletion\n *\n * @event searchengine:autocomplete:click\n * @property {Object} type - event\n * @property {Object} location - location\n * @property {Object} target - instance SearchEngine\n * @example\n * SearchEngine.on(\"searchengine:autocomplete:click\", function (e) {\n * console.log(e.location);\n * })\n */\n this.dispatchEvent({\n type: \"searchengine:autocomplete:click\",\n location: this._locationsToBeDisplayed[idx]\n });\n };\n\n // ################################################################### //\n // ################### handlers events Geocode ####################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'submit' on 'GPsearchInput' tag form\n * (cf. this._createSearchInputElement), and it gets the value of input.\n * this value is passed as a parameter for the service geocoding.\n * the results of the request are displayed into a window.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onGeocodingSearchSubmit = function (e) {\n var value = e.target[0].value;\n if (!value) {\n return;\n }\n\n // on sauvegarde le localisant\n this._currentGeocodingLocation = value;\n\n // on met en place l'affichage des resultats dans une fenetre de recherche.\n var context = this;\n this._requestGeocoding({\n query: value,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(\"request from Geocoding\", results);\n if (results) {\n var locations = results.locations;\n context._fillGeocodedLocationListContainer(locations);\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n // FIXME cf. this.onAutoCompleteSearch()\n context._clearGeocodedLocation();\n logger.log(error.message);\n }\n });\n };\n\n /**\n * this method is called by event 'submit' on 'GPgeocodeResultsList' tag div\n * (cf. this._createGeocodeResultsListElement), and it selects the location.\n * this location displays a marker on the map.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onGeocodedResultsItemClick = function (e) {\n var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__[\"default\"].index(e.target.id);\n if (!idx) {\n return;\n }\n var position = [this._geocodedLocations[idx].position.lon, this._geocodedLocations[idx].position.lat];\n var info = {\n service: \"GeocodedLocation\",\n location: this._geocodedLocations[idx]\n };\n\n // on ajoute le texte du géocodage dans l'input\n var label = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getGeocodedLocationFreeform(this._geocodedLocations[idx]);\n this._setLabel(label);\n\n // Info : la position est en EPSG:4326, à transformer dans la projection de la carte\n var view = this.getMap().getView();\n var mapProj = view.getProjection().getCode();\n if (mapProj !== \"EPSG:4326\") {\n // on retransforme les coordonnées de la position dans la projection de la carte\n position = Object(ol_proj__WEBPACK_IMPORTED_MODULE_3__[\"transform\"])(position, \"EPSG:4326\", mapProj);\n }\n // on centre la vue et positionne le marker, à la position reprojetée dans la projection de la carte\n var zoom = this._getZoom(info);\n this._setPosition(position, zoom);\n if (this._displayMarker) {\n this._setMarker(position, info);\n }\n /**\n * event triggered when an element of the results is clicked for geocoding\n *\n * @event searchengine:geocode:click\n * @property {Object} type - event\n * @property {Object} location - location\n * @property {Object} target - instance SearchEngine\n * @example\n * SearchEngine.on(\"searchengine:geocode:click\", function (e) {\n * console.log(e.location);\n * })\n */\n this.dispatchEvent({\n type: \"searchengine:geocode:click\",\n location: this._geocodedLocations[idx]\n });\n };\n\n // ################################################################### //\n // ############## handlers events Geocode Advanced ################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'change' on 'GPadvancedSearchCode' tag select\n * (cf. this._createAdvancedSearchFormCodeElement), and it gets the value of\n * option selected.\n * this value is passed as a parameter to create the attributs container.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onGeocodingAdvancedSearchCodeChange = function (e) {\n logger.log(e);\n var idx = e.target.selectedIndex;\n var value = e.target.options[idx].value;\n if (!value) {\n return;\n }\n\n // INFORMATION\n // le declenchement de l'evenement va creer un container de filtre à la volée...\n // l'insertion des containers d'attributs dans le DOM sont :\n // - soit GPadvancedSearchFilters > PositionOfInterest\n // - soit GPadvancedSearchFilters > StreetAddress\n // - soit GPadvancedSearchFilters > CadastralParcel\n // cf. _setFilter() pour la creation du container\n\n this._setFilter(value);\n };\n\n /**\n * this method is called by event 'submit' on 'GPadvancedSearchForm' tag form\n * (cf. this._createAdvancedSearchPanelFormElement), and it gets the value of all input.\n * this value is passed as a parameter for the service geocoding.\n * the results of the request are displayed into a window.\n *\n * @param {Object} e - HTMLElement\n * @param {Array} data - [{key: ..., value: ...}]\n * @private\n */\n SearchEngine.prototype.onGeocodingAdvancedSearchSubmit = function (e, data) {\n logger.log(data);\n if (!data || data.length === 0) {\n return;\n }\n var _location;\n var _filterOptions = {};\n for (var i = 0; i < data.length; i++) {\n var filter = data[i];\n if (filter.value) {\n _filterOptions[filter.key] = filter.value;\n }\n }\n var inputSearchTextContainer = document.getElementById(\"GPsearchInputText-\" + this._uid);\n _location = inputSearchTextContainer.value;\n\n // On ne prend pas en compte ce qu'il y a dans l'input de recherche simple pour la recherche avance de PC\n if (this._currentGeocodingCode === \"CadastralParcel\") {\n _location = \"\";\n }\n\n // on met en place l'affichage des resultats dans une fenetre de recherche.\n var context = this;\n this._requestGeocoding({\n query: _location,\n index: this._currentGeocodingCode,\n filters: _filterOptions,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(results);\n if (results) {\n var locations = results.locations;\n context._fillGeocodedLocationListContainer(locations);\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n // FIXME cf. this.onAutoCompleteSearch()\n context._clearGeocodedLocation();\n logger.log(error.message);\n }\n });\n };\n\n /**\n * this method is called by 'onGeocodingAdvancedSearchSubmit' method,\n * in case geocoding type is 'CadastralParcel',\n * and gets request parameters from inputs\n *\n * @param {Object} filterOptions - object with inputs value (department, insee, ...)\n * @returns {String} location - cadastral parcel number : concatenation of inputs values (e.g. : 940670000D0041 or 94067_____0041)\n * @private\n */\n SearchEngine.prototype._getCadastralParcelRequestParams = function (filterOptions) {\n /* info:\n la parcelle cadastrale se compose de 14 chiffres ou lettres, indiquant, de gauche à droite :\n - le code du département (2 caractères)\n - le code commune (3 caractères). (Remarque : code département + code commune = code INSEE)\n - OU le code INSEE de la commune (5 chiffres) (remplace les 2 précédents)\n - le code commune absorbée INSEE, ou '000' (3 caractères),\n - la section (2 caractères),\n - le numéro de parcelle (4 caractères).\n Exemple de parcelle : '940670000D0041'. Si l'identifiant est incomplet (par exemple '940670000D'), le service renverra uniquement les 25 premiers résultats pouvant correspondre.\n */\n\n var _location = \"\";\n var l;\n // code département (2 caractères)\n var dep = filterOptions.department;\n if (dep) {\n l = dep.length;\n if (l === 2) {\n _location = dep;\n } else if (l === 1) {\n // si un seul numéro a été saisi, on présume que c'est un numéro < 10\n _location = \"0\" + dep;\n } else {\n _location = dep.substring(0, 2);\n }\n } else {\n _location = \"__\";\n }\n\n // code commune insee (3 caractères)\n var commune = filterOptions.commune;\n if (commune) {\n l = commune.length;\n if (l === 3) {\n _location += commune;\n } else if (l === 2) {\n _location += \"_\" + commune;\n } else if (l === 1) {\n _location += \"__\" + commune;\n } else {\n // l > 3\n _location += commune.substring(0, 3);\n }\n } else {\n _location += \"___\";\n }\n\n // code insee (5 caractères) : surcharge les 2 autres si renseigné\n var insee = filterOptions.insee;\n if (insee) {\n if (insee.length === 5) {\n _location = insee;\n }\n }\n\n // code commune absorbee INSEE (3 caractères)\n var absorbedCity = filterOptions.absorbedCity;\n if (absorbedCity) {\n l = absorbedCity.length;\n if (l === 3) {\n _location += absorbedCity;\n } else if (l < 3) {\n if (l === 2) {\n _location += \"_\" + absorbedCity;\n } else if (l === 1) {\n _location += \"__\" + absorbedCity;\n }\n } else {\n // l > 3\n _location += absorbedCity.substring(0, 3);\n }\n } else {\n _location += \"___\";\n }\n\n // section (2 caractères)\n var section = filterOptions.section;\n if (section) {\n l = section.length;\n if (l === 2) {\n _location += section;\n } else if (l === 1) {\n _location += \"_\" + section;\n } else {\n _location += section.substring(0, 2);\n }\n } else {\n _location += \"__\";\n }\n\n // numéro de parcelle (4 caractères)\n var number = filterOptions.number;\n if (number) {\n l = number.length;\n if (l === 4) {\n _location += number;\n } else if (l === 3) {\n _location += \"_\" + number;\n } else if (l === 2) {\n _location += \"__\" + number;\n } else if (l === 1) {\n _location += \"___\" + number;\n } else {\n // l > 4\n _location += number.substring(0, 4);\n }\n } else {\n _location += \"___\";\n }\n logger.log(\"location : \" + _location);\n return _location;\n };\n\n // ################################################################### //\n // ############################## clean ############################## //\n // ################################################################### //\n\n /**\n * this method is called by this.onSearchReset()\n * and it clears all results and the marker.\n *\n * @private\n */\n SearchEngine.prototype._clearResults = function () {\n var map = this.getMap();\n this._currentGeocodingLocation = null;\n this._clearSuggestedLocation();\n this._clearGeocodedLocation();\n this._setMarker();\n // on retire l'overlay de la popup de la carte\n if (this._popupOverlay != null) {\n map.removeOverlay(this._popupOverlay);\n this._popupOverlay = null;\n }\n };\n\n /**\n * this method is called by this.onAutoCompleteSearchText()\n * and it clears all suggested location.\n *\n * @private\n */\n SearchEngine.prototype._clearSuggestedLocation = function () {\n this._suggestedLocations = [];\n if (this._suggestedContainer) {\n while (this._suggestedContainer.firstChild) {\n this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);\n }\n }\n };\n\n /**\n * this method is called by event 'click' on map\n * and it hides suggested locations\n *\n * @private\n */\n SearchEngine.prototype._hideSuggestedLocation = function () {\n if (this._autocompleteContainer) {\n this._autocompleteContainer.style.display = \"none\";\n }\n };\n\n /**\n * this method is called by event 'click' on label input\n * and it displays suggested location.\n *\n * @private\n */\n SearchEngine.prototype._displaySuggestedLocation = function () {\n if (this._autocompleteContainer) {\n this._autocompleteContainer.style.display = \"block\";\n }\n };\n\n /**\n * this method is called by this.onGeocodingAdvancedSearchSubmit()\n * and it clears all geocoded location.\n *\n * @private\n */\n SearchEngine.prototype._clearGeocodedLocation = function () {\n this._geocodedLocations = [];\n if (this._geocodedContainer) {\n while (this._geocodedContainer.firstChild) {\n this._geocodedContainer.removeChild(this._geocodedContainer.firstChild);\n }\n }\n };\n return SearchEngine;\n}(ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default.a);\n/* harmony default export */ __webpack_exports__[\"default\"] = (SearchEngine);\n\n// Expose SearchEngine as ol.control.SearchEngine (for a build bundle)\nif (window.ol && window.ol.control) {\n window.ol.control.SearchEngine = SearchEngine;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL1NlYXJjaEVuZ2luZS5qcz8zNGMwIl0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIlNlYXJjaEVuZ2luZSIsIkNvbnRyb2wiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwiaW5pdGlhbGl6ZSIsIl9jb250YWluZXIiLCJfaW5pdENvbnRhaW5lciIsIl9jb250YWluZXJFbGVtZW50IiwiZWxlbWVudCIsImFwcGVuZENoaWxkIiwiY2FsbCIsInRhcmdldCIsInJlbmRlciIsIl9fcHJvdG9fXyIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsIlV0aWxzIiwiYXNzaWduIiwiU2VhcmNoRW5naW5lRE9NIiwiY29uc3RydWN0b3IiLCJzZXRNYXAiLCJtYXAiLCJfY2xlYXJSZXN1bHRzIiwiZ2V0Q29sbGFwc2VkIiwiY29sbGFwc2VkIiwic2V0Q29sbGFwc2VkIiwidW5kZWZpbmVkIiwibG9nIiwiX3Nob3dTZWFyY2hFbmdpbmVJbnB1dCIsImNsaWNrIiwiZ2V0RGF0YSIsIl9nZW9jb2RlZExvY2F0aW9ucyIsIl9jaGVja0lucHV0T3B0aW9ucyIsInpvb21UbyIsInJlc291cmNlcyIsImdlb2NvZGUiLCJhdXRvY29tcGxldGUiLCJkaXNwbGF5QWR2YW5jZWRTZWFyY2giLCJhZHZhbmNlZFNlYXJjaCIsImdlb2NvZGVPcHRpb25zIiwic2VydmljZU9wdGlvbnMiLCJhdXRvY29tcGxldGVPcHRpb25zIiwidHJpZ2dlckdlb2NvZGUiLCJ0cmlnZ2VyRGVsYXkiLCJkaXNwbGF5TWFya2VyIiwibWFya2VyU3R5bGUiLCJwbGFjZWhvbGRlciIsIm1lcmdlUGFyYW1zIiwibGVuZ3RoIiwiX3VpZCIsIlNlbGVjdG9ySUQiLCJnZW5lcmF0ZSIsIl9pbnB1dFNlYXJjaENvbnRhaW5lciIsIl9hdXRvY29tcGxldGVDb250YWluZXIiLCJfc3VnZ2VzdGVkQ29udGFpbmVyIiwiX3N1Z2dlc3RlZExvY2F0aW9ucyIsIl9nZW9jb2RlZENvbnRhaW5lciIsIl9maWx0ZXJDb250YWluZXIiLCJfY3VycmVudEdlb2NvZGluZ0NvZGUiLCJfY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uIiwiX2FkdmFuY2VkU2VhcmNoRmlsdGVycyIsIl9pbml0QWR2YW5jZWRTZWFyY2hGaWx0ZXJzIiwiX2FkdmFuY2VkU2VhcmNoQ29kZXMiLCJfaW5pdEFkdmFuY2VkU2VhcmNoQ29kZXMiLCJfbWFya2VyIiwiX21hcmtlclN0eWxlIiwiX21hcmtlclVybCIsImtleXMiLCJNYXJrZXJzIiwiaW5kZXhPZiIsIl9kaXNwbGF5TWFya2VyIiwiX3BvcHVwQ29udGVudCIsIl9wb3B1cERpdiIsIl9pbml0UG9wdXBEaXYiLCJfcG9wdXBPdmVybGF5IiwiX3RyaWdnZXJIYW5kbGVyIiwiaSIsIl90eXBlb2YiLCJnZW9jb2RlUmVzb3VyY2VzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2VvY29kZVJlc291cmNlc0xpc3QiLCJhdXRvY29tcGxldGVSZXNvdXJjZXMiLCJhdXRvY29tcGxldGVSZXNvdXJjZXNMaXN0IiwicHVzaCIsImlkIiwidGl0bGUiLCJTZWFyY2hFbmdpbmVVdGlscyIsImFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdCIsImFkdmFuY2VkU2VhcmNoRmlsdGVyc0N1c3RvbSIsImNvbnRleHQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJjbG9zZXIiLCJ0eXBlIiwib25jbGljayIsInNldFBvc2l0aW9uIiwic3R5bGUiLCJjb250YWluZXIiLCJfY3JlYXRlTWFpbkNvbnRhaW5lckVsZW1lbnQiLCJpbnB1dFNob3ciLCJfY3JlYXRlU2hvd1NlYXJjaEVuZ2luZUVsZW1lbnQiLCJjaGVja2VkIiwicGljdG8iLCJfY3JlYXRlU2hvd1NlYXJjaEVuZ2luZVBpY3RvRWxlbWVudCIsInNlYXJjaCIsIl9jcmVhdGVTZWFyY2hJbnB1dEVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25BdXRvQ29tcGxldGVJbnB1dENsaWNrIiwiYXR0YWNoRXZlbnQiLCJhZHZhbmNlZFNob3ciLCJfY3JlYXRlU2hvd0FkdmFuY2VkU2VhcmNoRWxlbWVudCIsImFkdmFuY2VkUGFuZWwiLCJfY3JlYXRlQWR2YW5jZWRTZWFyY2hQYW5lbEVsZW1lbnQiLCJhZHZhbmNlZEhlYWRlciIsIl9jcmVhdGVBZHZhbmNlZFNlYXJjaFBhbmVsSGVhZGVyRWxlbWVudCIsImFkdmFuY2VkRm9ybSIsIl9jcmVhdGVBZHZhbmNlZFNlYXJjaFBhbmVsRm9ybUVsZW1lbnQiLCJhZHZhbmNlZEZvcm1GaWx0ZXJzIiwiX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUZpbHRlcnNFbGVtZW50IiwiX3NldEZpbHRlciIsImFkdmFuY2VkRm9ybUlucHV0IiwiX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUlucHV0RWxlbWVudCIsIl9jcmVhdGVBdXRvQ29tcGxldGVFbGVtZW50IiwiYXV0b2NvbXBsZXRlTGlzdCIsIl9jcmVhdGVBdXRvQ29tcGxldGVMaXN0RWxlbWVudCIsIl9jcmVhdGVHZW9jb2RlUmVzdWx0c0VsZW1lbnQiLCJnZW9jb2RlTGlzdCIsIl9jcmVhdGVHZW9jb2RlUmVzdWx0c0xpc3RFbGVtZW50IiwiY29kZSIsImNvZGVGb3VuZCIsImZpcnN0Q2hpbGQiLCJyZW1vdmVDaGlsZCIsImxzdEF0dHJpYnV0cyIsImRpdlRhYmxlIiwiX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRmlsdGVyc1RhYmxlRWxlbWVudCIsImoiLCJkaXZGaWx0ZXIiLCJfY3JlYXRlQWR2YW5jZWRTZWFyY2hGaWx0ZXJzQXR0cmlidXRFbGVtZW50IiwiX3JlcXVlc3RBdXRvQ29tcGxldGUiLCJzZXR0aW5ncyIsInRleHQiLCJhcGlLZXkiLCJzc2wiLCJHcCIsIlNlcnZpY2VzIiwiYXV0b0NvbXBsZXRlIiwiX2ZpbGxBdXRvQ29tcGxldGVkTG9jYXRpb25MaXN0Q29udGFpbmVyIiwibG9jYXRpb25zIiwiY2hpbGRFbGVtZW50Q291bnQiLCJfZGlzcGxheVN1Z2dlc3RlZExvY2F0aW9uIiwiX2NyZWF0ZUF1dG9Db21wbGV0ZWRMb2NhdGlvbkVsZW1lbnQiLCJfcmVxdWVzdEdlb2NvZGluZyIsInF1ZXJ5Iiwic2VsZiIsImJPbkZhaWx1cmUiLCJvbkZhaWx1cmUiLCJiT25TdWNjZXNzIiwib25TdWNjZXNzIiwiY2JPblN1Y2Nlc3MiLCJlIiwiY2JPbkZhaWx1cmUiLCJpbmRleCIsIl9maWxsR2VvY29kZWRMb2NhdGlvbkxpc3RDb250YWluZXIiLCJfY2xlYXJHZW9jb2RlZExvY2F0aW9uIiwiX2NyZWF0ZUdlb2NvZGVkTG9jYXRpb25FbGVtZW50IiwiX3NldExhYmVsIiwibGFiZWwiLCJnZXRFbGVtZW50QnlJZCIsInZhbHVlIiwiX3NldFBvc2l0aW9uIiwicG9zaXRpb24iLCJ6b29tIiwidmlldyIsImdldE1hcCIsImdldFZpZXciLCJzZXRDZW50ZXIiLCJzZXRab29tIiwiX3NldE1hcmtlciIsImluZm8iLCJyZW1vdmVPdmVybGF5IiwibWFya2VyRGl2Iiwic3JjIiwiX29uUmVzdWx0TWFya2VyU2VsZWN0IiwiT3ZlcmxheSIsIm9mZnNldCIsInN0b3BFdmVudCIsImFkZE92ZXJsYXkiLCJfZ2V0Wm9vbSIsImtleSIsInRyYWNlIiwiem9vbVRvUmVzdWx0c0J5RGVmYXVsdCIsInBhcnNlSW50IiwiaXNOYU4iLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImdldFpvb20iLCJtaW4iLCJtaW5ab29tIiwibWF4IiwibWF4Wm9vbSIsImluZm9ybWF0aW9uIiwicG9wdXBDb250ZW50Iiwic2VydmljZSIsImF0dHJpYnV0ZXMiLCJsb2NhdGlvbiIsInBsYWNlQXR0cmlidXRlcyIsImF0dHIiLCJoYXNPd25Qcm9wZXJ0eSIsInRvVXBwZXJDYXNlIiwiR2VvY29kZVV0aWxzIiwiZ2V0U3VnZ2VzdGVkTG9jYXRpb25GcmVlZm9ybSIsImlubmVySFRNTCIsInBvc2l0aW9uaW5nIiwiZ2V0UG9zaXRpb24iLCJvblNob3dTZWFyY2hFbmdpbmVDbGljayIsIkludGVyYWN0aW9ucyIsInVuc2V0IiwiZGlzcGF0Y2hFdmVudCIsIm9uU2VhcmNoUmVzZXRDbGljayIsImlucHV0U2VhcmNoVGV4dENvbnRhaW5lciIsImRpc2FibGVkIiwib25BdXRvQ29tcGxldGVTZWFyY2hUZXh0IiwiX2NsZWFyU3VnZ2VzdGVkTG9jYXRpb24iLCJfdHJpZ2dlckdlb2NvZGUiLCJfdHJpZ2dlckRlbGF5IiwicmVzdWx0cyIsInN1Z2dlc3RlZExvY2F0aW9ucyIsIl9sb2NhdGlvbnNUb0JlRGlzcGxheWVkIiwiaWxvY2F0aW9uIiwieCIsInkiLCJmdWxsVGV4dCIsIl9nZXRHZW9jb2RlQ29vcmRpbmF0ZXNGcm9tRnVsbFRleHQiLCJjbGVhclRpbWVvdXQiLCJ3YXJuIiwiZXJyb3IiLCJtZXNzYWdlIiwic2V0VGltZW91dCIsImdldEdlb2NvZGVkTG9jYXRpb25GcmVlZm9ybSIsImxvbiIsImxhdCIsIm9uIiwiX2hpZGVTdWdnZXN0ZWRMb2NhdGlvbiIsInN1Z2dlc3RlZExvY2F0aW9uIiwicSIsInJlc3BvbnNlIiwidW5zaGlmdCIsIm9uQXV0b0NvbXBsZXRlZFJlc3VsdHNJdGVtQ2xpY2siLCJpZHgiLCJtYXBQcm9qIiwiZ2V0UHJvamVjdGlvbiIsImdldENvZGUiLCJvbFByb2pUcmFuc2Zvcm0iLCJvbkdlb2NvZGluZ1NlYXJjaFN1Ym1pdCIsIm9uR2VvY29kZWRSZXN1bHRzSXRlbUNsaWNrIiwib25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaENvZGVDaGFuZ2UiLCJzZWxlY3RlZEluZGV4Iiwib25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaFN1Ym1pdCIsImRhdGEiLCJfbG9jYXRpb24iLCJfZmlsdGVyT3B0aW9ucyIsImZpbHRlciIsImZpbHRlcnMiLCJfZ2V0Q2FkYXN0cmFsUGFyY2VsUmVxdWVzdFBhcmFtcyIsImZpbHRlck9wdGlvbnMiLCJsIiwiZGVwIiwiZGVwYXJ0bWVudCIsInN1YnN0cmluZyIsImNvbW11bmUiLCJpbnNlZSIsImFic29yYmVk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QUFNLENBQUNDLEVBQUUsSUFBSUQsTUFBTSxDQUFDQyxFQUFFLENBQUNDLE9BQU8sRUFBRTtFQUNoQ0YsTUFBTSxDQUFDQyxFQUFFLENBQUNDLE9BQU8sQ0FBQzNSLFlBQVksR0FBR0EsWUFBWTtBQUNqRCIsImZpbGUiOiIuL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL1NlYXJjaEVuZ2luZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCBDU1NcbmltcG9ydCBcIi4uL0NTUy9Db250cm9scy9TZWFyY2hFbmdpbmUvR1BzZWFyY2hFbmdpbmVPcGVuTGF5ZXJzLmNzc1wiO1xuLy8gaW1wb3J0IE9wZW5MYXllcnNcbmltcG9ydCBDb250cm9sIGZyb20gXCJvbC9jb250cm9sL0NvbnRyb2xcIjtcbmltcG9ydCBPdmVybGF5IGZyb20gXCJvbC9PdmVybGF5XCI7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gYXMgb2xQcm9qVHJhbnNmb3JtIH0gZnJvbSBcIm9sL3Byb2pcIjtcbi8vIGltcG9ydCBnZW9wb3J0YWwgbGlicmFyeSBhY2Nlc3NcbmltcG9ydCBHcCBmcm9tIFwiZ2VvcG9ydGFsLWFjY2Vzcy1saWJcIjtcbi8vIGltcG9ydCBsb2NhbFxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBNYXJrZXJzIGZyb20gXCIuL1V0aWxzL01hcmtlcnNcIjtcbmltcG9ydCBJbnRlcmFjdGlvbnMgZnJvbSBcIi4vVXRpbHMvSW50ZXJhY3Rpb25zXCI7XG5pbXBvcnQgU2VsZWN0b3JJRCBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL1NlbGVjdG9ySURcIjtcbmltcG9ydCBTZWFyY2hFbmdpbmVVdGlscyBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL1NlYXJjaEVuZ2luZVV0aWxzXCI7XG5pbXBvcnQgR2VvY29kZVV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvR2VvY29kZVV0aWxzXCI7XG4vLyBET01cbmltcG9ydCBTZWFyY2hFbmdpbmVET00gZnJvbSBcIi4uLy4uL0NvbW1vbi9Db250cm9scy9TZWFyY2hFbmdpbmVET01cIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJzZWFyY2hlbmdpbmVcIik7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogU2VhcmNoRW5naW5lIGNvbnRyb2xcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtvbC5jb250cm9sLkNvbnRyb2x9XG4gKiBAdHlwZSB7b2wuY29udHJvbC5TZWFyY2hFbmdpbmV9XG4gKiBAYWxpYXMgb2wuY29udHJvbC5TZWFyY2hFbmdpbmVcbiAqIEBwYXJhbSB7T2JqZWN0fSAgb3B0aW9ucyAtIGNvbnRyb2wgb3B0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd9ICAgW29wdGlvbnMuYXBpS2V5XSAtIEFQSSBrZXkuIFRoZSBrZXkgXCJjYWxjdWxcIiBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59ICAgW29wdGlvbnMuc3NsID0gdHJ1ZV0gLSB1c2Ugb2Ygc3NsIG9yIG5vdCAoZGVmYXVsdCB0cnVlLCBzZXJ2aWNlIHJlcXVlc3RlZCB1c2luZyBodHRwcyBwcm90b2NvbClcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZV0gLSBjb2xsYXBzZSBtb2RlLCB0cnVlIGJ5IGRlZmF1bHRcbiAqICAgICAgIFZhbHVlIHBvc3NpYmxlIDogYXV0byBvciB6b29tIGxldmVsLlxuICogICAgICAgUG9zc2libGUgdG8gb3ZlcmxvYWQgaXQgd2l0aCBhIGZ1bmN0aW9uIDpcbiAqICAgICAgIHpvb21UbyA6IGZ1bmN0aW9uIChpbmZvKSB7XG4gKiAgICAgICAgICAgLy8gZG8gc29tZSBzdHVmZi4uLlxuICogICAgICAgICAgIHJldHVybiB6b29tO1xuICogICAgICAgfVxuICogQHBhcmFtIHtTdHJpbmd9ICBbb3B0aW9ucy5wbGFjZWhvbGRlcl0gLSBQbGFjZWhvbGRlciBpbiBzZWFyY2ggYmFyLiBEZWZhdWx0IGlzIFwiUmVjaGVyY2hlciB1biBsaWV1LCB1bmUgYWRyZXNzZVwiLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kaXNwbGF5TWFya2VyID0gdHJ1ZV0gLSBzZXQgYSBtYXJrZXIgb24gc2VhcmNoIHJlc3VsdCwgZGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSAgW29wdGlvbnMubWFya2VyU3R5bGUgPSBcImxpZ2h0T3JhbmdlXCJdIC0gTWFya2VyIHN0eWxlLiBDdXJyZW50bHkgcG9zc2libGUgdmFsdWVzIGFyZSBcImxpZ2h0T3JhbmdlXCIgKGRlZmF1bHQgdmFsdWUpLCBcImRhcmtPcmFuZ2VcIiwgXCJyZWRcIiBhbmQgXCJ0dXJxdW9pc2VCbHVlXCIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRpc3BsYXlBZHZhbmNlZFNlYXJjaCA9IHRydWVdIC0gRmFsc2UgdG8gZGlzYWJsZSBhZHZhbmNlZCBzZWFyY2ggdG9vbHMgKGl0IHdpbGwgbm90IGJlIGRpc3BsYXllZCkuIERlZmF1bHQgaXMgdHJ1ZSAoZGlzcGxheWVkKVxuICogQHBhcmFtIHtPYmplY3R9ICBbb3B0aW9ucy5hZHZhbmNlZFNlYXJjaF0gLSBhZHZhbmNlZCBzZWFyY2ggb3B0aW9ucyBmb3IgZ2VvY29kaW5nIChmaWx0ZXJzKS4gUHJvcGVydGllcyBjYW4gYmUgZm91bmQgYW1vbmcgZ2VvY29kZSBvcHRpb25zLmZpbHRlck9wdGlvbnMgKHNlZSB7QGxpbmsgaHR0cDovL2lnbmYuZ2l0aHViLmlvL2dlb3BvcnRhbC1hY2Nlc3MtbGliL2xhdGVzdC9qc2RvYy9tb2R1bGUtU2VydmljZXMuaHRtbCN+Z2VvY29kZSBHcC5TZXJ2aWNlcy5nZW9jb2RlfSlcbiAqIEBwYXJhbSB7T2JqZWN0fSAgIFtvcHRpb25zLnJlc291cmNlc10gLSByZXNvdXJjZXMgdG8gYmUgdXNlZCBieSBnZW9jb2RlIGFuZCBhdXRvY29tcGxldGlvbiBzZXJ2aWNlcyA6XG4gKiBAcGFyYW0ge1N0cmluZ30gICBbb3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZV0gLSByZXNvdXJjZXMgZ2VvY29kaW5nLCBieSBkZWZhdWx0IDogXCJsb2NhdGlvblwiXG4gKiBAcGFyYW0ge0FycmF5fSAgIFtvcHRpb25zLnJlc291cmNlcy5hdXRvY29tcGxldGVdIC0gcmVzb3VyY2VzIGF1dG9jb21wbGV0aW9uLCBieSBkZWZhdWx0IDogW1wiUG9zaXRpb25PZkludGVyZXN0XCIsIFwiU3RyZWV0QWRkcmVzc1wiXVxuICogQHBhcmFtIHtCb29sZWFufSAgW29wdGlvbnMuZGlzcGxheUFkdmFuY2VkU2VhcmNoID0gdHJ1ZV0gLSBGYWxzZSB0byBkaXNhYmxlIGFkdmFuY2VkIHNlYXJjaCB0b29scyAoaXQgd2lsbCBub3QgYmUgZGlzcGxheWVkKS4gRGVmYXVsdCBpcyB0cnVlIChkaXNwbGF5ZWQpXG4gKiBAcGFyYW0ge09iamVjdH0gIFtvcHRpb25zLmFkdmFuY2VkU2VhcmNoXSAtIGFkdmFuY2VkIHNlYXJjaCBvcHRpb25zIGZvciBnZW9jb2RpbmcgKGZpbHRlcnMpLiBQcm9wZXJ0aWVzIGNhbiBiZSBmb3VuZCBhbW9uZyBnZW9jb2RlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucyAoc2VlIHtAbGluayBodHRwOi8vaWduZi5naXRodWIuaW8vZ2VvcG9ydGFsLWFjY2Vzcy1saWIvbGF0ZXN0L2pzZG9jL21vZHVsZS1TZXJ2aWNlcy5odG1sI35nZW9jb2RlIEdwLlNlcnZpY2VzLmdlb2NvZGV9KVxuICogQHBhcmFtIHtPYmplY3R9ICBbb3B0aW9ucy5nZW9jb2RlT3B0aW9ucyA9IHt9XSAtIG9wdGlvbnMgb2YgZ2VvY29kZSBzZXJ2aWNlIChzZWUge0BsaW5rIGh0dHA6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvbW9kdWxlLVNlcnZpY2VzLmh0bWwjfmdlb2NvZGUgR3AuU2VydmljZXMuZ2VvY29kZX0pXG4gKiBAcGFyYW0ge09iamVjdH0gIFtvcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB7fV0gLSBvcHRpb25zIG9mIGF1dG9jb21wbGV0ZSBzZXJ2aWNlIChzZWUge0BsaW5rIGh0dHA6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvbW9kdWxlLVNlcnZpY2VzLmh0bWwjfmF1dG9Db21wbGV0ZSBHcC5TZXJ2aWNlcy5hdXRvQ29tcGxldGV9XG4gKiBAcGFyYW0ge09iamVjdH0gIFtvcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMuc2VydmljZU9wdGlvbnNdIC0gb3B0aW9ucyBvZiBhdXRvY29tcGxldGUgc2VydmljZVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdXRvY29tcGxldGVPcHRpb25zLnRyaWdnZXJHZW9jb2RlID0gZmFsc2VdIC0gdHJpZ2dlciBhIGdlb2NvZGluZyByZXF1ZXN0IGlmIHRoZSBhdXRvY29tcGxldGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHN1Z2dlc3Rpb25zLCBmYWxzZSBieSBkZWZhdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gIFtvcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMudHJpZ2dlckRlbGF5ID0gMTAwMF0gLSB3YWl0aW5nIHRpbWUgYmVmb3JlIHNlbmRpbmcgdGhlIGdlb2NvZGluZyByZXF1ZXN0LCAxMDAwbXMgYnkgZGVmYXVsdFxuICogQHBhcmFtIHtTdGluZ3xOdW1lcmljfEZ1bmN0aW9ufSBbb3B0aW9ucy56b29tVG9dIC0gem9vbSB0byByZXN1bHRzLCBieSBkZWZhdWx0LCBjdXJyZW50IHpvb20uXG4gKiBAZmlyZXMgc2VhcmNoZW5naW5lOmF1dG9jb21wbGV0ZTpjbGlja1xuICogQGZpcmVzIHNlYXJjaGVuZ2luZTpnZW9jb2RlOmNsaWNrXG4gKiBAZXhhbXBsZVxuICogIHZhciBTZWFyY2hFbmdpbmUgPSBvbC5jb250cm9sLlNlYXJjaEVuZ2luZSh7XG4gKiAgICAgIGFwaUtleSA6IFwiQ0xFQVBJXCIsXG4gKiAgICAgIGNvbGxhcHNlZCA6IHRydWUsXG4gKiAgICAgIHJlc291cmNlcyA6IHtcbiAqICAgICAgICAgIGdlb2NvZGUgOiBbXCJTdHJlZXRBZGRyZXNzXCIsIFwiUG9zaXRpb25PZkludGVyZXN0XCJdLFxuICogICAgICAgICAgYXV0b2NvbXBsZXRlIDogW1wiU3RyZWV0QWRkcmVzc1wiXVxuICogICAgICB9LFxuICogICAgICBhZHZhbmNlZFNlYXJjaCA6IHtcbiAqICAgICAgICAgIFBvc2l0aW9uT2ZJbnRlcmVzdCA6IFt7bmFtZSA6IFwibXVuaWNpcGFsaXR5XCIsIHRpdGxlIDogXCJWaWxsZVwifV0sXG4gKiAgICAgICAgICBTdHJlZXRBZGRyZXNzIDogW3suLi59XVxuICogICAgICB9LFxuICogICAgICBnZW9jb2RlT3B0aW9ucyA6IHt9LFxuICogICAgICBhdXRvY29tcGxldGVPcHRpb25zIDoge31cbiAqICB9KTtcbiAqXG4gKiAgU2VhcmNoRW5naW5lLm9uKFwic2VhcmNoZW5naW5lOmF1dG9jb21wbGV0ZTpjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICogICAgY29uc29sZS53YXJuKFwiYXV0b2NvbXBsZXRlXCIsIGUubG9jYXRpb24pO1xuICogIH0pO1xuICogIFNlYXJjaEVuZ2luZS5vbihcInNlYXJjaGVuZ2luZTpnZW9jb2RlOmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gKiAgICBjb25zb2xlLndhcm4oXCJnZW9jb2RlXCIsIGUubG9jYXRpb24pO1xuICogIH0pO1xuICovXG52YXIgU2VhcmNoRW5naW5lID0gKGZ1bmN0aW9uIChDb250cm9sKSB7XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBvbC5jb250cm9sLlNlYXJjaEVuZ2luZX1cbiAgICAgKiBAbW9kdWxlIFNlYXJjaEVuZ2luZVxuICAgICAqIEBhbGlhcyBtb2R1bGU6fkNvbnRyb2xzL1NlYXJjaEVuZ2luZVxuICAgICAqIEBwYXJhbSB7Kn0gb3B0aW9ucyAtIG9wdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGltcG9ydCBTZWFyY2hFbmdpbmUgZnJvbSBcInNyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL1NlYXJjaEVuZ2luZVwiXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2VhcmNoRW5naW5lIChvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZWFyY2hFbmdpbmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbml0aWFsaXNhdGlvbiBkdSBjb21wb3NhbnRcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIC8vIFdpZGdldCBtYWluIERPTSBjb250YWluZXJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gdGhpcy5faW5pdENvbnRhaW5lcigpO1xuICAgICAgICAvLyBpbmZvOiBsZSBjb250YWluZXIgc2VyYSBjb21wbMOpdMOpIGxvcnMgZGUgbCdham91dCDDoCBsYSBjYXJ0ZSAoc2V0TWFwKSwgY2FyIGNlcnRhaW5zIGNvbXBvc2FudHMgbsOpY2Vzc2l0ZW50IGQnw6p0cmUgbGnDqXMgw6AgbGEgbWFwLlxuICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICAvLyBvbiBwZXV0IMOpdmVudHVlbGxlbWVudCBlbmNhcHN1bGVyIGxlIGNvbXBvc2FudCBkYW5zIHVuZSBkaXYgcGFzc8OpZSBwYXIgbCd1dGlsaXNhdGV1clxuICAgICAgICBpZiAob3B0aW9ucy5lbGVtZW50ICYmIG9wdGlvbnMuZWxlbWVudC5hcHBlbmRDaGlsZCkge1xuICAgICAgICAgICAgLy8gZGFucyBjZSBjYXMgb24gc3RvY2tlIGxlcyBkZXV4IGNvbnRhaW5lclxuICAgICAgICAgICAgb3B0aW9ucy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsbCBvbC5jb250cm9sLkNvbnRyb2wgY29uc3RydWN0b3JcbiAgICAgICAgQ29udHJvbC5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGVsZW1lbnQgOiB0aGlzLl9jb250YWluZXJFbGVtZW50IHx8IHRoaXMuX2NvbnRhaW5lcixcbiAgICAgICAgICAgIHRhcmdldCA6IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgICAgICAgcmVuZGVyIDogb3B0aW9ucy5yZW5kZXJcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIEluaGVyaXRzIGZyb20gb2wuY29udHJvbC5Db250cm9sXG4gICAgaWYgKENvbnRyb2wpIFNlYXJjaEVuZ2luZS5fX3Byb3RvX18gPSBDb250cm9sO1xuXG4gICAgLypcbiAgICAgKiBAbGVuZHMgbW9kdWxlOlNlYXJjaEVuZ2luZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbnRyb2wucHJvdG90eXBlLCB7fSk7XG5cbiAgICAvLyBvbiByw6ljdXDDqHJlIGxlcyBtw6l0aG9kZXMgZGUgbGEgY2xhc3NlIGNvbW11bmUgSXNvRE9NXG4gICAgVXRpbHMuYXNzaWduKFNlYXJjaEVuZ2luZS5wcm90b3R5cGUsIFNlYXJjaEVuZ2luZURPTSk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciAoYWxpYXMpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTZWFyY2hFbmdpbmU7XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHB1YmxpYyBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIE92ZXJ3cml0ZSBPcGVuTGF5ZXJzIHNldE1hcCBtZXRob2RcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2wuTWFwfSBtYXAgLSBNYXAuXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5zZXRNYXAgPSBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIGlmICghbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhclJlc3VsdHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIGFwcGVsbGUgbGEgbcOpdGhvZGUgc2V0TWFwIG9yaWdpbmFsZSBkJ09wZW5MYXllcnNcbiAgICAgICAgQ29udHJvbC5wcm90b3R5cGUuc2V0TWFwLmNhbGwodGhpcywgbWFwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHdpZGdldCBpcyBjb2xsYXBzZWQgKG1pbmltaXplZCksIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IGNvbGxhcHNlZCAtIHRydWUgaWYgd2lkZ2V0IGlzIGNvbGxhcHNlZFxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuZ2V0Q29sbGFwc2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlIG9yIGRpc3BsYXkgd2lkZ2V0IG1haW4gY29udGFpbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbGxhcHNlZCAtIFRydWUgdG8gY29sbGFwc2Ugd2lkZ2V0LCBGYWxzZSB0byBkaXNwbGF5IGl0XG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5zZXRDb2xsYXBzZWQgPSBmdW5jdGlvbiAoY29sbGFwc2VkKSB7XG4gICAgICAgIGlmIChjb2xsYXBzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIltFUlJPUl0gU2VhcmNoRW5naW5lOnNldENvbGxhcHNlZCAtIG1pc3NpbmcgY29sbGFwc2VkIHBhcmFtZXRlclwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNvbGxhcHNlZCAmJiB0aGlzLmNvbGxhcHNlZCkgfHwgKCFjb2xsYXBzZWQgJiYgIXRoaXMuY29sbGFwc2VkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd1NlYXJjaEVuZ2luZUlucHV0LmNsaWNrKCk7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbG9jYXRpb25zIGRhdGEgZnJvbSBnZW9jb2RlIHNlcnZpY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGRhdGEgLSBsb2NhdGlvbnNcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW9jb2RlZExvY2F0aW9ucztcbiAgICB9O1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaW5pdCBjb21wb25lbnQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBTZWFyY2hFbmdpbmUgY29udHJvbCAoY2FsbGVkIGJ5IFNlYXJjaEVuZ2luZSBjb25zdHJ1Y3RvcilcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uc3RydWN0b3Igb3B0aW9uc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tJbnB1dE9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAgICAgLy8gZGVmaW5lIGRlZmF1bHQgb3B0aW9uc1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQgOiB0cnVlLFxuICAgICAgICAgICAgem9vbVRvIDogXCJcIixcbiAgICAgICAgICAgIHJlc291cmNlcyA6IHtcbiAgICAgICAgICAgICAgICBnZW9jb2RlIDogXCJcIixcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGUgOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXlBZHZhbmNlZFNlYXJjaCA6IHRydWUsXG4gICAgICAgICAgICBhZHZhbmNlZFNlYXJjaCA6IHt9LFxuICAgICAgICAgICAgZ2VvY29kZU9wdGlvbnMgOiB7XG4gICAgICAgICAgICAgICAgc2VydmljZU9wdGlvbnMgOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgOiB7XG4gICAgICAgICAgICAgICAgc2VydmljZU9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyR2VvY29kZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRyaWdnZXJEZWxheSA6IDEwMDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5TWFya2VyIDogdHJ1ZSxcbiAgICAgICAgICAgIG1hcmtlclN0eWxlIDogXCJsaWdodE9yYW5nZVwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXIgOiBcIlJlY2hlcmNoZXIgdW4gbGlldSwgdW5lIGFkcmVzc2VcIlxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1lcmdlIHdpdGggdXNlciBvcHRpb25zXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLmdlb2NvZGUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZSA9IFwiYWRkcmVzcyxwb2lcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlc291cmNlcy5hdXRvY29tcGxldGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVzb3VyY2VzLmF1dG9jb21wbGV0ZSA9IFtcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLCBcIlN0cmVldEFkZHJlc3NcIl07XG4gICAgICAgIH1cblxuICAgICAgICAvKioge0Jvb2xlYW59IHNwZWNpZnkgaWYgc2VhcmNoRW5naW5lIGNvbnRyb2wgaXMgY29sbGFwc2VkICh0cnVlKSBvciBub3QgKGZhbHNlKSAqL1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IHRoaXMub3B0aW9ucy5jb2xsYXBzZWQ7XG5cbiAgICAgICAgLy8gaWRlbnRpZmlhbnQgZHUgY29udHLDtGxlIDogdXRpbGUgcG91ciBzdWZmaXhlciBsZXMgaWRlbnRpZmlhbnRzIENTUyAocG91ciBnw6lyZXIgbGUgY2FzIG/DuSBpbCB5IGVuIGEgcGx1c2lldXJzIGRhbnMgbGEgbcOqbWUgcGFnZSlcbiAgICAgICAgdGhpcy5fdWlkID0gU2VsZWN0b3JJRC5nZW5lcmF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX3Nob3dTZWFyY2hFbmdpbmVJbnB1dCA9IG51bGw7XG5cbiAgICAgICAgLy8gY29udGFpbmVyIGRlIGwnaW5wdXQgZGUgcmVjaGVyY2hlXG4gICAgICAgIHRoaXMuX2lucHV0U2VhcmNoQ29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICAvLyBjb250YWluZXIgZGVzIHJlcG9uc2VzIGRlIGwnYXV0b2NvbXBsZXRpb25cbiAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlQ29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICAvLyBsaXN0ZXMgZGVzIHJlcG9uc2VzIGRlIGwnYXV0b2NvbXBsZXRpb25cbiAgICAgICAgdGhpcy5fc3VnZ2VzdGVkTG9jYXRpb25zID0gW107XG5cbiAgICAgICAgLy8gY29udGFpbmVyIGRlcyByZXBvbnNlcyBkdSBnZW9jb2RhZ2VcbiAgICAgICAgdGhpcy5fZ2VvY29kZWRDb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIGxpc3RlIGRlcyByZXBvbnNlcyBkdSBnZW9jb2RhZ2VcbiAgICAgICAgdGhpcy5fZ2VvY29kZWRMb2NhdGlvbnMgPSBbXTtcblxuICAgICAgICAvLyBjb250YWluZXIgZGVzIGZpbHRyZXMgZHUgZ2VvY29kYWdlXG4gICAgICAgIHRoaXMuX2ZpbHRlckNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gcmVzc291cmNlIGRlIGdlb2NvZGFnZSBzZWxlY3Rpb25uw6llIHBvdXIgbGUgZ2VvY29kYWdlIGF2YW5jw6lcbiAgICAgICAgdGhpcy5fY3VycmVudEdlb2NvZGluZ0NvZGUgPSBudWxsO1xuXG4gICAgICAgIC8vIGxvY2FsaXNhbnQgKi9cbiAgICAgICAgdGhpcy5fY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uID0gbnVsbDtcblxuICAgICAgICAvLyBsaXN0ZSBkZXMgZmlsdHJlcyBkdSBnZW9jb2RhZ2UgcG91ciBsZSBnZW9jb2RhZ2UgYXZhbmPDqVxuICAgICAgICB0aGlzLl9hZHZhbmNlZFNlYXJjaEZpbHRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5faW5pdEFkdmFuY2VkU2VhcmNoRmlsdGVycygpO1xuXG4gICAgICAgIC8vIGxpc3RlIGRlcyByZXNzb3VyY2VzIGR1IGdlb2NvZGFnZSBwb3VyIGxlIGdlb2NvZGFnZSBhdmFuY8OpXG4gICAgICAgIHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5faW5pdEFkdmFuY2VkU2VhcmNoQ29kZXMoKTtcblxuICAgICAgICAvLyBtYXJrZXJcbiAgICAgICAgdGhpcy5fbWFya2VyID0gbnVsbDtcblxuICAgICAgICAvLyBtYXJrZXIgc3R5bGVcbiAgICAgICAgdmFyIF9tYXJrZXJTdHlsZSA9IHRoaXMub3B0aW9ucy5tYXJrZXJTdHlsZTtcbiAgICAgICAgdGhpcy5fbWFya2VyVXJsID0gKE9iamVjdC5rZXlzKE1hcmtlcnMpLmluZGV4T2YoX21hcmtlclN0eWxlKSA9PT0gLTEpID8gTWFya2Vyc1tcImxpZ2h0T3JhbmdlXCJdIDogTWFya2Vyc1tfbWFya2VyU3R5bGVdO1xuXG4gICAgICAgIC8vIG1hcmtlciBkaXNwbGF5XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlNYXJrZXIgPSB0aGlzLm9wdGlvbnMuZGlzcGxheU1hcmtlcjtcblxuICAgICAgICAvLyBwb3B1cFxuICAgICAgICB0aGlzLl9wb3B1cENvbnRlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wb3B1cERpdiA9IHRoaXMuX2luaXRQb3B1cERpdigpO1xuICAgICAgICB0aGlzLl9wb3B1cE92ZXJsYXkgPSBudWxsO1xuXG4gICAgICAgIC8vIHRyaWdnZXIgZ2VvY29kZVxuICAgICAgICB0aGlzLl90cmlnZ2VySGFuZGxlciA9IG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLmluaXRpYWxpemUoKVxuICAgICAqIGFuZCBtYWtlcyBzdXJlIGlucHV0IG9wdGlvbnMgYXJlIGNvcnJlY3RseSBmb3JtYXRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NoZWNrSW5wdXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBvbiB2w6lyaWZpZSBxdWUgcmVzb3VyY2VzIGVzdCBiaWVuIHVuIG9iamV0XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzb3VyY2VzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzc291cmNlcyBkZSBnZW9jb2RhZ2VcbiAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZVJlc291cmNlcyA9IG9wdGlvbnMucmVzb3VyY2VzLmdlb2NvZGU7XG4gICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVSZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gdsOpcmlmaWUgcXVlIGxhIGxpc3RlIGRlcyByZXNzb3VyY2VzIGRlIGdlb2NvZGFnZSBlc3QgYmllbiB1biB0YWJsZWF1XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGdlb2NvZGVSZXNvdXJjZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZVJlc291cmNlc0xpc3QgPSBbXCJTdHJlZXRBZGRyZXNzXCIsIFwiUG9zaXRpb25PZkludGVyZXN0XCIsIFwiQ2FkYXN0cmFsUGFyY2VsXCIsIFwiQWRtaW5pc3RyYXRpZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9jb2RlUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVSZXNvdXJjZXNMaXN0LmluZGV4T2YoZ2VvY29kZVJlc291cmNlc1tpXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGxhIHJlc291cmNlIG4nZXN0IHBhcyByw6lmw6lyZW5jw6llLCBvbiBsJ2VubMOodmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2VvY29kZVJlc291cmNlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJbU2VhcmNoRW5naW5lXSBvcHRpb25zLnJlc291cmNlcy5nZW9jb2RlIDogXCIgKyBnZW9jb2RlUmVzb3VyY2VzW2ldICsgXCIgaXMgbm90IGEgcmVzb3VyY2UgZm9yIGdlb2NvZGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIltTZWFyY2hFbmdpbmVdICdvcHRpb25zLnJlc291cmNlcy5nZW9jb2RlJyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIGFycmF5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvY29kZVJlc291cmNlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyByZXNzb3VyY2VzIGQnYXV0b2NvbXBsZXRpb25cbiAgICAgICAgICAgICAgICB2YXIgYXV0b2NvbXBsZXRlUmVzb3VyY2VzID0gb3B0aW9ucy5yZXNvdXJjZXMuYXV0b2NvbXBsZXRlO1xuICAgICAgICAgICAgICAgIGlmIChhdXRvY29tcGxldGVSZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gdsOpcmlmaWUgcXVlIGxhIGxpc3RlIGRlcyByZXNzb3VyY2VzIGQnYXV0b2NvbXBsZXRpb24gZXN0IGJpZW4gdW4gdGFibGVhdVxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhdXRvY29tcGxldGVSZXNvdXJjZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0b2NvbXBsZXRlUmVzb3VyY2VzTGlzdCA9IFtcIlN0cmVldEFkZHJlc3NcIiwgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXV0b2NvbXBsZXRlUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZVJlc291cmNlc0xpc3QuaW5kZXhPZihhdXRvY29tcGxldGVSZXNvdXJjZXNbaV0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBsYSByZXNvdXJjZSBuJ2VzdCBwYXMgcsOpZsOpcmVuY8OpZSwgb24gbCdlbmzDqHZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1dG9jb21wbGV0ZVJlc291cmNlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJbU2VhcmNoRW5naW5lXSBvcHRpb25zLnJlc291cmNlcy5hdXRvY29tcGxldGUgOiBcIiArIGF1dG9jb21wbGV0ZVJlc291cmNlc1tpXSArIFwiIGlzIG5vdCBhIHJlc291cmNlIGZvciBhdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIltTZWFyY2hFbmdpbmVdICdvcHRpb25zLnJlc291cmNlcy5hdXRvY29tcGxldGUnIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gYXJyYXlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVSZXNvdXJjZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwiW1NlYXJjaEVuZ2luZV0gJ3Jlc291cmNlcycgcGFyYW1ldGVyIHNob3VsZCBiZSBhbiBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZXNvdXJjZXMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLmluaXRpYWxpemUoKVxuICAgICAqIGFuZCBpbml0aWFsaXplIHRoZSBnZW9jb2RpbmcgcmVzb3VyY2VzIHRpdGxlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5faW5pdEFkdmFuY2VkU2VhcmNoQ29kZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElORk9STUFUSU9OXG4gICAgICAgIC8vIG9uIHkgYWpvdXRlIGxlcyBmaWx0cmVzIGF0dHJpYnV0YWlyZXMgcG91ciB1bmUgdGFibGUgZGUgcmVzc291cmNlc1xuICAgICAgICAvLyBzZWxlY3Rpb25uw6llIHZpYSB1biBldmVuZW1lbnQgKG9uY2hhbmdlKSBkZSBsYSBsaXN0ZSBkZXJvdWxhbnRlIGR1XG4gICAgICAgIC8vIG1lbnUgYXZhbmPDqSBkdSBnZW9jb2RhZ2UuXG4gICAgICAgIC8vIGNmLiBvbkdlb2NvZGluZ0FkdmFuY2VkU2VhcmNoQ29kZUNoYW5nZSgpIHBvdXIgbGEgc2VsZWN0aW9uIGRlIGxhXG4gICAgICAgIC8vIHJlc3NvdXJjZSBkZSBnZW9jb2RhZ2Ugw6AgYWZmaWNoZXJcblxuICAgICAgICB2YXIgZ2VvY29kZVJlc291cmNlcyA9IHRoaXMub3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZTtcbiAgICAgICAgaWYgKGdlb2NvZGVSZXNvdXJjZXMgPT09IFwibG9jYXRpb25cIikge1xuICAgICAgICAgICAgZ2VvY29kZVJlc291cmNlcyA9IFtcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLCBcIlN0cmVldEFkZHJlc3NcIiwgXCJDYWRhc3RyYWxQYXJjZWxcIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdlb2NvZGVSZXNvdXJjZXMpKSB7XG4gICAgICAgICAgICBnZW9jb2RlUmVzb3VyY2VzID0gW2dlb2NvZGVSZXNvdXJjZXNdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvY29kZVJlc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3dpdGNoIChnZW9jb2RlUmVzb3VyY2VzW2ldKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiBcIkxpZXV4L3RvcG9ueW1lc1wiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU3RyZWV0QWRkcmVzc1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBcIlN0cmVldEFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIDogXCJBZHJlc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ2FkYXN0cmFsUGFyY2VsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA6IFwiQ2FkYXN0cmFsUGFyY2VsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA6IFwiUGFyY2VsbGVzIGNhZGFzdHJhbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHBhciBkw6lmYXV0LCBhdSBjYXMgb8O5IGF1Y3VuZSByZXNzb3VyY2UgcGFzc8OpZSBlbiBvcHRpb24gbmUgY29ycmVzcG9uZCDDoCBjZWxsZXMgYXR0ZW5kdWVzXG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRTZWFyY2hDb2RlcyA9IFt7XG4gICAgICAgICAgICAgICAgaWQgOiBcIlN0cmVldEFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiQWRyZXNzZXNcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGlkIDogXCJQb3NpdGlvbk9mSW50ZXJlc3RcIixcbiAgICAgICAgICAgICAgICB0aXRsZSA6IFwiTGlldXgvdG9wb255bWVzXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpZCA6IFwiQ2FkYXN0cmFsUGFyY2VsXCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkNhZGFzdHJlXCJcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhcImFkdmFuY2VkU2VhcmNoQ29kZXNcIiwgdGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uQWRkKClcbiAgICAgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgYWR2YW5jZWQgZ2VvY29kaW5nIGZpbHRlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2luaXRBZHZhbmNlZFNlYXJjaEZpbHRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGxpc3RlIGRlcyBmaWx0cmVzIHBhciBkZWZhdXRzIHBvdXIgdG91dGVzIGxlcyByZXNzb3VyY2VzXG4gICAgICAgIHRoaXMuX2FkdmFuY2VkU2VhcmNoRmlsdGVycyA9IFNlYXJjaEVuZ2luZVV0aWxzLmFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdDtcblxuICAgICAgICAvLyBvbiBtZXJnZSBsZXMgb3B0aW9ucyBhdmFuY8OpZXMgYXZlYyBjZWxsZXMgcGFyIGRlZmF1dFxuICAgICAgICB2YXIgYWR2YW5jZWRTZWFyY2hGaWx0ZXJzQ3VzdG9tID0gdGhpcy5vcHRpb25zLmFkdmFuY2VkU2VhcmNoO1xuICAgICAgICBVdGlscy5hc3NpZ24odGhpcy5fYWR2YW5jZWRTZWFyY2hGaWx0ZXJzLCBhZHZhbmNlZFNlYXJjaEZpbHRlcnNDdXN0b20pO1xuXG4gICAgICAgIGxvZ2dlci5sb2coXCJhZHZhbmNlZFNlYXJjaEZpbHRlcnNcIiwgdGhpcy5fYWR2YW5jZWRTZWFyY2hGaWx0ZXJzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMuaW5pdGlhbGl6ZSgpIGFuZCBpbml0aWFsaXplIHBvcHVwIGRpdlxuICAgICAqICh0byBkaXNwbGF5IHJlc3VsdHMgaW5mb3JtYXRpb24gb24gbWFya2VyIGNsaWNrKVxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBlbGVtZW50IC0gRE9NIGVsZW1lbnQgZm9yIHBvcHVwXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9pbml0UG9wdXBEaXYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwiZ3AtZmVhdHVyZS1pbmZvLWRpdlwiO1xuICAgICAgICB2YXIgY2xvc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBjbG9zZXIudHlwZSA9IFwiYnV0dG9uXCI7XG4gICAgICAgIGNsb3Nlci5jbGFzc05hbWUgPSBcImdwLXN0eWxpbmctYnV0dG9uIGNsb3NlclwiO1xuICAgICAgICAvLyBvbiBjbG9zZXIgY2xpY2sgOiByZW1vdmUgcG9wdXBcbiAgICAgICAgY2xvc2VyLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5fcG9wdXBPdmVybGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Ll9wb3B1cE92ZXJsYXkuc2V0UG9zaXRpb24odW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcG9wdXBDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5fcG9wdXBDb250ZW50LmNsYXNzTmFtZSA9IFwiZ3AtZmVhdHVyZXMtY29udGVudC1kaXZcIjtcbiAgICAgICAgdGhpcy5fcG9wdXBDb250ZW50LnN0eWxlW1wibWluLXdpZHRoXCJdID0gXCIyMDBweFwiO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3BvcHVwQ29udGVudCk7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xvc2VyKTtcblxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBET00gaW5pdGlhbGl6ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY29udHJvbCBtYWluIGNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHJldHVybnMge0RPTUVsZW1lbnR9IERPTSBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2luaXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBtYWluIGNvbnRhaW5lclxuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fY3JlYXRlTWFpbkNvbnRhaW5lckVsZW1lbnQoKTtcblxuICAgICAgICAvLyBjcmVhdGUgc2hvdyBzZWFyY2ggZW5naW5lIGVsZW1lbnRcbiAgICAgICAgdmFyIGlucHV0U2hvdyA9IHRoaXMuX3Nob3dTZWFyY2hFbmdpbmVJbnB1dCA9IHRoaXMuX2NyZWF0ZVNob3dTZWFyY2hFbmdpbmVFbGVtZW50KCk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbnB1dFNob3cpO1xuXG4gICAgICAgIC8vIG1vZGUgXCJjb2xsYXBzZWRcIlxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGlucHV0U2hvdy5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBzZWFyY2ggZW5naW5lIHBpY3RvXG4gICAgICAgIHZhciBwaWN0byA9IHRoaXMuX2NyZWF0ZVNob3dTZWFyY2hFbmdpbmVQaWN0b0VsZW1lbnQoKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHBpY3RvKTtcblxuICAgICAgICB2YXIgc2VhcmNoID0gdGhpcy5faW5wdXRTZWFyY2hDb250YWluZXIgPSB0aGlzLl9jcmVhdGVTZWFyY2hJbnB1dEVsZW1lbnQodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBpZiAoc2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNlYXJjaC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25BdXRvQ29tcGxldGVJbnB1dENsaWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWFyY2guYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgIHNlYXJjaC5hdHRhY2hFdmVudChcIm9uY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25BdXRvQ29tcGxldGVJbnB1dENsaWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc2VhcmNoKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc3BsYXlBZHZhbmNlZFNlYXJjaCkge1xuICAgICAgICAgICAgdmFyIGFkdmFuY2VkU2hvdyA9IHRoaXMuX2NyZWF0ZVNob3dBZHZhbmNlZFNlYXJjaEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhZHZhbmNlZFNob3cpO1xuXG4gICAgICAgICAgICAvLyBJTkZPIGplIGRlY29tcG9zZSBsZXMgYXBwZWxzIGNhciBqJ2FpIGJlc29pbiBkZSByZWN1cGVyZXIgbGUgY29udGFpbmVyXG4gICAgICAgICAgICAvLyBkZXMgZmlsdHJlc1xuICAgICAgICAgICAgdmFyIGFkdmFuY2VkUGFuZWwgPSB0aGlzLl9jcmVhdGVBZHZhbmNlZFNlYXJjaFBhbmVsRWxlbWVudCgpO1xuICAgICAgICAgICAgdmFyIGFkdmFuY2VkSGVhZGVyID0gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hQYW5lbEhlYWRlckVsZW1lbnQoKTtcbiAgICAgICAgICAgIHZhciBhZHZhbmNlZEZvcm0gPSB0aGlzLl9jcmVhdGVBZHZhbmNlZFNlYXJjaFBhbmVsRm9ybUVsZW1lbnQodGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlcyk7XG4gICAgICAgICAgICB2YXIgYWR2YW5jZWRGb3JtRmlsdGVycyA9IHRoaXMuX2ZpbHRlckNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUZpbHRlcnNFbGVtZW50KCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRGaWx0ZXIodGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlc1swXS5pZCk7IC8vIGV4IFwiUG9zaXRpb25PZkludGVyZXN0XCJcbiAgICAgICAgICAgIHZhciBhZHZhbmNlZEZvcm1JbnB1dCA9IHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUlucHV0RWxlbWVudCgpO1xuICAgICAgICAgICAgYWR2YW5jZWRGb3JtLmFwcGVuZENoaWxkKGFkdmFuY2VkRm9ybUZpbHRlcnMpO1xuICAgICAgICAgICAgYWR2YW5jZWRGb3JtLmFwcGVuZENoaWxkKGFkdmFuY2VkRm9ybUlucHV0KTtcbiAgICAgICAgICAgIGFkdmFuY2VkUGFuZWwuYXBwZW5kQ2hpbGQoYWR2YW5jZWRIZWFkZXIpO1xuICAgICAgICAgICAgYWR2YW5jZWRQYW5lbC5hcHBlbmRDaGlsZChhZHZhbmNlZEZvcm0pO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGFkdmFuY2VkUGFuZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSU5GTyBqZSBkZWNvbXBvc2UgbGVzIGFwcGVscyBjYXIgaidhaSBiZXNvaW4gZGUgcmVjdXBlcmVyIGxlIGNvbnRhaW5lclxuICAgICAgICAvLyBkZXMgcmVzdWx0YXRzIGRlIGwnYXV0b2NvbXBsZXRpb25cbiAgICAgICAgdmFyIGF1dG9jb21wbGV0ZSA9IHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUF1dG9Db21wbGV0ZUVsZW1lbnQoKTtcbiAgICAgICAgdmFyIGF1dG9jb21wbGV0ZUxpc3QgPSB0aGlzLl9zdWdnZXN0ZWRDb250YWluZXIgPSB0aGlzLl9jcmVhdGVBdXRvQ29tcGxldGVMaXN0RWxlbWVudCgpO1xuICAgICAgICBhdXRvY29tcGxldGUuYXBwZW5kQ2hpbGQoYXV0b2NvbXBsZXRlTGlzdCk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhdXRvY29tcGxldGUpO1xuXG4gICAgICAgIC8vIElORk8gamUgZGVjb21wb3NlIGxlcyBhcHBlbHMgY2FyIGonYWkgYmVzb2luIGRlIHJlY3VwZXJlciBsZSBjb250YWluZXJcbiAgICAgICAgLy8gZGVzIHJlc3VsdGF0cyBkdSBnZW9jb2RhZ2VcbiAgICAgICAgdmFyIGdlb2NvZGUgPSB0aGlzLl9jcmVhdGVHZW9jb2RlUmVzdWx0c0VsZW1lbnQoKTtcbiAgICAgICAgdmFyIGdlb2NvZGVMaXN0ID0gdGhpcy5fZ2VvY29kZWRDb250YWluZXIgPSB0aGlzLl9jcmVhdGVHZW9jb2RlUmVzdWx0c0xpc3RFbGVtZW50KCk7XG4gICAgICAgIGdlb2NvZGUuYXBwZW5kQ2hpbGQoZ2VvY29kZUxpc3QpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ2VvY29kZSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IDpcbiAgICAgKiAtIHRoaXMuX2luaXRDb250YWluZXIoKSA6IC4uLlxuICAgICAqIC0gdGhpcy5vbkdlb2NvZGluZ0FkdmFuY2VkU2VhcmNoQ29kZUNob2ljZSgpIDogLi4uXG4gICAgICogYW5kIGluaXRpYWxpemUgb3IgY3JlYXRlIHRoZSBmaWx0ZXJzIGNvbnRhaW5lciBIVE1MRWxlbWVudFxuICAgICAqIHRvIHRoZSBnZW9jb2RpbmcgYWR2YW5jZWQgbWVudS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb2RlIC0gcmVzb3VyY2UgZ2VvY29kaW5nIG5hbWVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtET01FbGVtZW50fSBET00gZWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fc2V0RmlsdGVyID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgLy8gSU5GT1JNQVRJT05cbiAgICAgICAgLy8gTm91cyBhdm9ucyAyIHNvbHV0aW9ucyBwb3NzaWJsZXMgcG91ciBsYSBtaXNlIGVuIHBsYWNlIGRlcyBmaWx0cmVzLlxuICAgICAgICAvLyAxLiBTb2l0IG9uIGRlY2lkZSBkZSBjcmVlciB0b3VzIGxlcyBmaWx0cmVzIHBvdXIgY2hhcXVlIHJlc3NvdXJjZVxuICAgICAgICAvLyBkZSBnZW9jb2RhZ2Ugw6AgbCdpbml0aWFsaXNhdGlvbiBkdSBjb21wb3NhbnQsIGV0IG9uIGpvdWUgc3VyIGxlXG4gICAgICAgIC8vIG1vZGUgJ2hpZGRlbicgcG91ciBuJ2FmZmljaGVyIHF1ZSBsYSByZXNzb3VyY2Ugc2VsZWN0aW9ubsOpZS5cbiAgICAgICAgLy8gMi4gU29pdCBvbiBkZWNpZGUgZGUgY3JlZXIgw6AgY2hhcXVlIGZvaXMgbGVzIGZpbHRyZXMgcG91ciBsYVxuICAgICAgICAvLyByZXNzb3VyY2Ugc2VsZWN0aW9ubsOpZS5cbiAgICAgICAgLy8gQ2hhcXVlIHNvbHV0aW9uIGEgc2VzIGluY29udmVuaWVudHMvYXZhbnRhZ2VzLlxuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBkdSBjaG9peCAyIGNhciBlbGxlIG9mZnJlIHBsdXMgZGUgc291cGxlc3NlIHBvdXJcbiAgICAgICAgLy8gcmVjdXBlcmVyIGxlcyAnZm9ybS1kYXRhJy4uLlxuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9maWx0ZXJDb250YWluZXI7XG5cbiAgICAgICAgdmFyIGNvZGVGb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzW2ldLmlkID09PSBjb2RlKSB7XG4gICAgICAgICAgICAgICAgY29kZUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29kZUZvdW5kKSB7XG4gICAgICAgICAgICAvLyBjZXR0ZSByZXNzb3VyY2Ugbidlc3QgcGFzIGRpc3BvbmlibGUsXG4gICAgICAgICAgICAvLyBvbiBzdXBwcmltZSBsZXMgYW5jaWVucyBlbmZhbnRzLi4uXG4gICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gc2F1dmVnYXJkZSBsYSByZXNzb3VyY2UgZGUgZ2VvY29kYWdlIHPDqWxlY3Rpb25uw6llXG4gICAgICAgIHRoaXMuX2N1cnJlbnRHZW9jb2RpbmdDb2RlID0gY29kZTtcblxuICAgICAgICAvLyBvbiBzdXBwcmltZSBsZXMgZW5mYW50cy4uLlxuICAgICAgICB3aGlsZSAoY29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbHN0QXR0cmlidXRzID0gdGhpcy5fYWR2YW5jZWRTZWFyY2hGaWx0ZXJzW2NvZGVdO1xuICAgICAgICBpZiAoIWxzdEF0dHJpYnV0cyB8fCBsc3RBdHRyaWJ1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjZXR0ZSByZXNzb3VyY2Ugbidlc3QgcGFzIHBhcmFtZXRyYWJsZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpdlRhYmxlID0gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hGaWx0ZXJzVGFibGVFbGVtZW50KGNvZGUsIHRydWUpO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbHN0QXR0cmlidXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgZGl2RmlsdGVyID0gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hGaWx0ZXJzQXR0cmlidXRFbGVtZW50KGxzdEF0dHJpYnV0c1tqXSk7XG4gICAgICAgICAgICBkaXZUYWJsZS5hcHBlbmRDaGlsZChkaXZGaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdlRhYmxlKTtcblxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyBtZXRob2RzIHRvIHJlcXVlc3QgYW5kIHJlc3VsdHMgIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoKClcbiAgICAgKiBhbmQgZXhlY3V0ZXMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzIC0gc2VydmljZSBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgIHNldHRpbmdzLnRleHQgLSB0ZXh0XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGluZ3Mub25TdWNjZXNzIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0aW5ncy5vbkZhaWx1cmUgLSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fcmVxdWVzdEF1dG9Db21wbGV0ZSA9IGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAgICAgICAvLyBvbiBuZSBmYWl0IHBhcyBkZSByZXF1w6p0ZSBzaSBvbiBuJ2EgcGFzIHJlbnNlaWduw6kgZGUgcGFyYW1ldHJlcyAhXG4gICAgICAgIGlmICghc2V0dGluZ3MgfHwgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhzZXR0aW5ncykubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gbmUgZmFpdCBwYXMgZGUgcmVxdcOqdGUgc2kgbGEgcGFyYW1ldHJlICd0ZXh0JyBlc3QgdmlkZSAhXG4gICAgICAgIGlmICghc2V0dGluZ3MudGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhzZXR0aW5ncyk7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gb24gcmVjdXBlcmUgbGVzIG9wdGlvbnMgZHUgc2VydmljZVxuICAgICAgICBVdGlscy5hc3NpZ24ob3B0aW9ucywgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMuc2VydmljZU9wdGlvbnMpO1xuICAgICAgICAvLyBhaW5zaSBxdWUgbGEgcmVjaGVyY2hlIGV0IGxlcyBjYWxsYmFja3NcbiAgICAgICAgVXRpbHMuYXNzaWduKG9wdGlvbnMsIHNldHRpbmdzKTtcblxuICAgICAgICAvLyBvbiBham91dGUgbGUgcGFyYW3DqHRyZSBmaWx0ZXJPcHRpb25zLnR5cGUgc3DDqWNpZmlhbnQgbGVzIHJlc3NvdXJjZXMuXG4gICAgICAgIHZhciByZXNvdXJjZXMgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2VzLmF1dG9jb21wbGV0ZTtcbiAgICAgICAgaWYgKHJlc291cmNlcyAmJiBBcnJheS5pc0FycmF5KHJlc291cmNlcykpIHtcbiAgICAgICAgICAgIC8vIGlsIHNlIHBldXQgcXVlIGwndXRpbGlzYXRldXIgYWl0IHN1cmNoYXJnw6kgY2UgcGFyYW3DqHRyZSBkYW5zIGdlb2NvZGVPcHRpb25zLFxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSByZXNvdXJjZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYXMgb8O5IGxhIGNsZWYgQVBJIG4nZXN0IHBhcyByZW5zZWlnbsOpZSBkYW5zIGxlcyBvcHRpb25zIGR1IHNlcnZpY2UsXG4gICAgICAgIC8vIG9uIHV0aWxpc2UgY2VsbGUgcmVuc2VpZ27DqWUgYXUgbml2ZWF1IGR1IGNvbnRyb2xlIG91IGxhIGNsw6kgXCJjYWxjdWxcIiBwYXIgZMOpZmF1dC5cbiAgICAgICAgb3B0aW9ucy5hcGlLZXkgPSBvcHRpb25zLmFwaUtleSB8fCB0aGlzLm9wdGlvbnMuYXBpS2V5O1xuXG4gICAgICAgIC8vIHNpIGwndXRpbGlzYXRldXIgYSBzcMOpY2lmacOpIGxlIHBhcmFtw6h0cmUgc3NsIGF1IG5pdmVhdSBkdSBjb250cm9sLCBvbiBzJ2VuIHNlcnRcbiAgICAgICAgLy8gdHJ1ZSBwYXIgZMOpZmF1dCAoaHR0cHMpXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zc2wgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5zc2wgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zc2wgPSB0aGlzLm9wdGlvbnMuc3NsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNzbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmxvZyhvcHRpb25zKTtcblxuICAgICAgICBHcC5TZXJ2aWNlcy5hdXRvQ29tcGxldGUob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoVGV4dCgpIChjYXNlIG9mIHN1Y2Nlc3MpXG4gICAgICogYW5kIGZpbGxzIHRoZSBjb250YWluZXIgb2YgdGhlIGxvY2F0aW9uIGxpc3QuXG4gICAgICogaXQgY3JlYXRlcyBhIEhUTUwgRWxlbWVudCBwZXIgbG9jYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGxvY2F0aW9ucyAtIEFycmF5IG9mIEdwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZS5TdWdnZXN0ZWRMb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGF1dG9jb21wbGV0ZSByZXN1bHRzIGxpc3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2ZpbGxBdXRvQ29tcGxldGVkTG9jYXRpb25MaXN0Q29udGFpbmVyID0gZnVuY3Rpb24gKGxvY2F0aW9ucykge1xuICAgICAgICBpZiAoIWxvY2F0aW9ucyB8fCBsb2NhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbiB2aWRlIGxhIGxpc3RlIGF2YW50IGRlIGxhIGNvbnN0cnVpcmVcbiAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9zdWdnZXN0ZWRDb250YWluZXI7XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkRWxlbWVudENvdW50KSB7XG4gICAgICAgICAgICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGlzcGxheVN1Z2dlc3RlZExvY2F0aW9uKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBQcm9wb3NhbHMgYXJlIGR5bmFtaWNhbGx5IGZpbGxlZCBpbiBKYXZhc2NyaXB0IGJ5IGF1dG9jb21wbGV0ZSBzZXJ2aWNlXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVBdXRvQ29tcGxldGVkTG9jYXRpb25FbGVtZW50KGxvY2F0aW9uc1tpXSwgaSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub25BdXRvQ29tcGxldGVTZWFyY2goKVxuICAgICAqIGFuZCBleGVjdXRlcyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2V0dGluZ3MgLSBzZXJ2aWNlIHNldHRpbmdzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgc2V0dGluZ3MubG9jYXRpb24gLSB0ZXh0XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGluZ3Mub25TdWNjZXNzIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0aW5ncy5vbkZhaWx1cmUgLSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fcmVxdWVzdEdlb2NvZGluZyA9IGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAgICAgICAvLyBvbiBuZSBmYWl0IHBhcyBkZSByZXF1w6p0ZSBzaSBvbiBuJ2EgcGFzIHJlbnNlaWduw6kgZGUgcGFyYW1ldHJlcyAhXG4gICAgICAgIGlmICghc2V0dGluZ3MgfHwgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhzZXR0aW5ncykubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gbmUgZmFpdCBwYXMgZGUgcmVxdcOqdGUgc2kgbGEgcGFyYW1ldHJlICd0ZXh0JyBlc3QgdmlkZSAhXG4gICAgICAgIGlmIChzZXR0aW5ncy5xdWVyeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhzZXR0aW5ncyk7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gb24gcmVjdXBlcmUgbGVzIG9wdGlvbnMgZHUgc2VydmljZVxuICAgICAgICBVdGlscy5hc3NpZ24ob3B0aW9ucywgdGhpcy5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zKTtcbiAgICAgICAgLy8gYWluc2kgcXVlIGxhIHJlY2hlcmNoZSBldCBsZXMgY2FsbGJhY2tzXG4gICAgICAgIFV0aWxzLmFzc2lnbihvcHRpb25zLCBzZXR0aW5ncyk7XG4gICAgICAgIC8vIG9uIHJlZGVmaW5pZSBsZXMgY2FsbGJhY2tzIHNpIGxlcyBjYWxsYmFja3MgZGUgc2VydmljZSBleGlzdGVudFxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBiT25GYWlsdXJlID0gISEodGhpcy5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zLm9uRmFpbHVyZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zLm9uRmFpbHVyZSA9PT0gXCJmdW5jdGlvblwiKTsgLy8gY2FzdCB2YXJpYWJsZSB0byBib29sZWFuXG4gICAgICAgIHZhciBiT25TdWNjZXNzID0gISEodGhpcy5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zLm9uU3VjY2VzcyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zLm9uU3VjY2VzcyA9PT0gXCJmdW5jdGlvblwiKTtcbiAgICAgICAgaWYgKGJPblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHZhciBjYk9uU3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3Mub25TdWNjZXNzLmNhbGwoc2VsZiwgZSk7XG4gICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zLm9uU3VjY2Vzcy5jYWxsKHNlbGYsIGUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdWNjZXNzID0gY2JPblN1Y2Nlc3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJPbkZhaWx1cmUpIHtcbiAgICAgICAgICAgIHZhciBjYk9uRmFpbHVyZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3Mub25GYWlsdXJlLmNhbGwoc2VsZiwgZSk7XG4gICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmdlb2NvZGVPcHRpb25zLnNlcnZpY2VPcHRpb25zLm9uRmFpbHVyZS5jYWxsKHNlbGYsIGUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9wdGlvbnMub25GYWlsdXJlID0gY2JPbkZhaWx1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbiBham91dGUgbGUgcGFyYW3DqHRyZSBpbmRleCBzcMOpY2lmaWFudCBsZXMgcmVzc291cmNlcy5cbiAgICAgICAgdmFyIHJlc291cmNlcyA9IHRoaXMub3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZTtcbiAgICAgICAgaWYgKHJlc291cmNlcykge1xuICAgICAgICAgICAgLy8gaWwgc2UgcGV1dCBxdWUgbCd1dGlsaXNhdGV1ciBhaXQgc3VyY2hhcmfDqSBjZSBwYXJhbcOodHJlIGRhbnMgZ2VvY29kZU9wdGlvbnMsXG4gICAgICAgICAgICAvLyBvdSBxdSdpbCBhaXQgZMOpasOgIMOpdMOpIHJlbXBsaSAoY2FzIGRlIGxhIHJlY2hlcmNoZSBhdmFuY8OpZSlcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pbmRleCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSByZXNvdXJjZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYXMgb8O5IGxhIGNsZWYgQVBJIG4nZXN0IHBhcyByZW5zZWlnbsOpZSBkYW5zIGxlcyBvcHRpb25zIGR1IHNlcnZpY2UsXG4gICAgICAgIC8vIG9uIHV0aWxpc2UgY2VsbGUgcmVuc2VpZ27DqWUgYXUgbml2ZWF1IGR1IGNvbnRyb2xlIG91IGxhIGNsw6kgXCJjYWxjdWxcIiBwYXIgZMOpZmF1dFxuICAgICAgICBvcHRpb25zLmFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHRoaXMub3B0aW9ucy5hcGlLZXk7XG5cbiAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBhIHNww6ljaWZpw6kgbGUgcGFyYW3DqHRyZSBzc2wgYXUgbml2ZWF1IGR1IGNvbnRyb2wsIG9uIHMnZW4gc2VydFxuICAgICAgICAvLyB0cnVlIHBhciBkw6lmYXV0IChodHRwcylcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNzbCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnNzbCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNzbCA9IHRoaXMub3B0aW9ucy5zc2w7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc3NsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cob3B0aW9ucyk7XG5cbiAgICAgICAgR3AuU2VydmljZXMuZ2VvY29kZShvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub25HZW9jb2RpbmdTZWFyY2goKVxuICAgICAqIGFuZCBmaWxscyB0aGUgY29udGFpbmVyIG9mIHRoZSBsb2NhdGlvbiByZXN1bHRzLlxuICAgICAqIGl0IGNyZWF0ZXMgYSBIVE1MIEVsZW1lbnQgcGVyIGxvY2F0aW9uXG4gICAgICogKGNmLiB0aGlzLiAuLi4pXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBsb2NhdGlvbnMgLSBsb2NhdGlvbnNcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fZmlsbEdlb2NvZGVkTG9jYXRpb25MaXN0Q29udGFpbmVyID0gZnVuY3Rpb24gKGxvY2F0aW9ucykge1xuICAgICAgICBpZiAoIWxvY2F0aW9ucyB8fCBsb2NhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhckdlb2NvZGVkTG9jYXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIHZpZGUgbGEgbGlzdGUgYXZhbnQgZGUgbGEgY29uc3RydWlyZVxuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCkge1xuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKGxvY2F0aW9uc1tpXSk7XG4gICAgICAgICAgICAvLyBQcm9wb3NhbHMgYXJlIGR5bmFtaWNhbGx5IGZpbGxlZCBpbiBKYXZhc2NyaXB0IGJ5IGF1dG9jb21wbGV0ZSBzZXJ2aWNlXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVHZW9jb2RlZExvY2F0aW9uRWxlbWVudChsb2NhdGlvbnNbaV0sIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F1dmVnYXJkZSBkZSBsJ2V0YXQgZGVzIGxvY2F0aW9uc1xuICAgICAgICB0aGlzLl9nZW9jb2RlZExvY2F0aW9ucyA9IGxvY2F0aW9ucztcbiAgICB9O1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgb3RoZXIgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiB0aGlzIHNlbmRzIHRoZSBsYWJlbCB0byB0aGUgcGFuZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBsYWJlbCBzdWdnZXN0ZWQgbG9jYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX3NldExhYmVsID0gZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiR1BzZWFyY2hJbnB1dFRleHQtXCIgKyB0aGlzLl91aWQpLnZhbHVlID0gbGFiZWw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uKlJlc3VsdHNJdGVtQ2xpY2soKVxuICAgICAqIGFuZCBtb3ZlL3pvb20gb24gYSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBvc2l0aW9uIC0gb2wuQ29vcmRpbmF0ZSBvYmplY3QgW2xvbiwgbGF0XSAoZW4gbGF0L2xvbiA6IFwiRVBTRzo0MzI2XCIpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHpvb20gLSB6b29tIGxldmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgem9vbSkge1xuICAgICAgICB2YXIgdmlldyA9IHRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpO1xuICAgICAgICB2aWV3LnNldENlbnRlcihwb3NpdGlvbik7XG4gICAgICAgIHZpZXcuc2V0Wm9vbSh6b29tKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub24qUmVzdWx0c0l0ZW1DbGljaygpXG4gICAgICogYW5kIGRpc3BsYXlzIGEgbWFya2VyLlxuICAgICAqIEZJWE1FXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiAtIG9sLkNvb3JkaW5hdGUgb2JqZWN0IFtsb24sIGxhdF0gb3UgW3gsIHldXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gLSBsb2NhdGlvbiBpbmZvcm1hdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fc2V0TWFya2VyID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBpbmZvKSB7XG4gICAgICAgIHZhciBtYXAgPSB0aGlzLmdldE1hcCgpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzIG1hcmtlcnNcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXAucmVtb3ZlT3ZlcmxheSh0aGlzLl9tYXJrZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFya2VyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgLy8gY3LDqWF0aW9uIGRlIGwnw6lsw6ltZW50IERPTVxuICAgICAgICAgICAgdmFyIG1hcmtlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgICBtYXJrZXJEaXYuc3JjID0gdGhpcy5fbWFya2VyVXJsO1xuXG4gICAgICAgICAgICAvLyBham91dCBkZSBsJ8OpdsOobmVtZW50IG9uY2xpY2sgKHBvdXIgYWZmaWNoZXIgdW5lIHBvcHVwKVxuICAgICAgICAgICAgaWYgKG1hcmtlckRpdi5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgbWFya2VyRGl2LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fb25SZXN1bHRNYXJrZXJTZWxlY3QoaW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrZXJEaXYuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlclxuICAgICAgICAgICAgICAgIG1hcmtlckRpdi5hdHRhY2hFdmVudChcbiAgICAgICAgICAgICAgICAgICAgXCJvbmNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX29uUmVzdWx0TWFya2VyU2VsZWN0KGluZm8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY3LDqWF0aW9uIGR1IG1hcmtlciAob3ZlcmxheSlcbiAgICAgICAgICAgIHRoaXMuX21hcmtlciA9IG5ldyBPdmVybGF5KHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA6IHBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG9mZnNldCA6IFstMjUuNSwgLTM4XSxcbiAgICAgICAgICAgICAgICBlbGVtZW50IDogbWFya2VyRGl2LFxuICAgICAgICAgICAgICAgIHN0b3BFdmVudCA6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1hcC5hZGRPdmVybGF5KHRoaXMuX21hcmtlcik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub24qUmVzdWx0c0l0ZW1DbGljaygpXG4gICAgICogYW5kIGdldCB6b29tIHRvIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5mbyAtIGluZm9cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtJbnRlZ2VyfSB6b29tXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9nZXRab29tID0gZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm9wdGlvbnMuem9vbVRvO1xuICAgICAgICB2YXIgem9vbSA9IG51bGw7XG5cbiAgICAgICAgLy8gbGVzIHZhbGV1cnMgZHUgem9vbXMgc29udCBkZXRlcm1pbsOpZXNcbiAgICAgICAgLy8gc29pdCBwYXIgbGVzIG1vdHMgY2xlZnMgc3VpdmFudHMgOiAgbWF4LCBtaW4gb3UgYXV0b1xuICAgICAgICAvLyBzb2l0IHBhciB1biBuaXZlYXUgZGUgem9vbVxuICAgICAgICAvLyBzb2l0IGRlZmluaSBwYXIgbCd1dGlsaXNhdGV1ciB2aWEgdW5lIGZvbmN0aW9uXG5cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBmdW5jdGlvblwiKTtcbiAgICAgICAgICAgIHpvb20gPSBrZXkuY2FsbCh0aGlzLCBpbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJ6b29tIGxldmVsXCIpO1xuICAgICAgICAgICAgem9vbSA9IGtleTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBpZiAoa2V5ID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAvLyAgICAgem9vbSA9IG1hcC5nZXRNYXhab29tKCk7XG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGtleSA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgLy8gICAgIHpvb20gPSBtYXAuZ2V0TWluWm9vbSgpO1xuICAgICAgICAgICAgLy8gfSBlbHNlXG5cbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBhdXRvXCIpO1xuICAgICAgICAgICAgICAgIHpvb20gPSBTZWFyY2hFbmdpbmVVdGlscy56b29tVG9SZXN1bHRzQnlEZWZhdWx0KGluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJ6b29tIGxldmVsIHBhcnNpbmdcIik7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VJbnQoa2V5LCAxMCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBwYXJzaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICB6b29tID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcG9seWZpbGwgSUVcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlciA9IE51bWJlci5pc0ludGVnZXIgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHRlc3QgZGUgdmFsaWRpdMOpIGR1IHpvb20sXG4gICAgICAgIC8vIG9uIHByZW5kIGxlIHpvb20gY291cmFudCBwYXIgZGVmYXV0IC4uLlxuICAgICAgICBpZiAoIXpvb20gfHwgem9vbSA9PT0gXCJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcih6b29tKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBub3QgZm91bmQsIGN1cnJlbnQgem9vbS4uLlwiKTtcbiAgICAgICAgICAgIHpvb20gPSBtYXAuZ2V0VmlldygpLmdldFpvb20oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJWE1FIHRlc3Qgc2kgbGUgem9vbSBlc3QgZGFucyBsJ2VzcGFjZSBkZSBsYSBjYXJ0ZVxuICAgICAgICB2YXIgbWluID0gbWFwLm1pblpvb207IC8vIC5nZXRNaW5ab29tKCk7XG4gICAgICAgIHZhciBtYXggPSBtYXAubWF4Wm9vbTsgLy8gLmdldE1heFpvb20oKTtcbiAgICAgICAgaWYgKHpvb20gPCBtaW4pIHtcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInpvb20gbGV2ZWwgbWluLi4uXCIpO1xuICAgICAgICAgICAgem9vbSA9IG1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoem9vbSA+IG1heCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBsZXZlbCBtYXguLi5cIik7XG4gICAgICAgICAgICB6b29tID0gbWF4O1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbVwiLCB6b29tKTtcbiAgICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiAnY2xpY2snIG9uIHRoaXMuX21hcmtlclxuICAgICAqIChjZi4gdGhpcy5fc2V0TWFya2VyKCkgKVxuICAgICAqIGFuZCBzZXRzIGEgcG9wdXAgd2l0aCBtYXJrZXIgaW5mb3JtYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvcm1hdGlvbiAtIGxvY2F0aW9uIGluZm9ybWF0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9vblJlc3VsdE1hcmtlclNlbGVjdCA9IGZ1bmN0aW9uIChpbmZvcm1hdGlvbikge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5nZXRNYXAoKTtcblxuICAgICAgICB2YXIgcG9wdXBDb250ZW50ID0gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmZvcm1hdGlvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uLnNlcnZpY2UgPT09IFwiR2VvY29kZWRMb2NhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ID0gXCI8dWw+XCI7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBpbmZvcm1hdGlvbi5sb2NhdGlvbi5wbGFjZUF0dHJpYnV0ZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPT0gXCJ0cnVlR2VvbWV0cnlcIiAmJiBhdHRyICE9PSBcImV4dHJhRmllbGRzXCIgJiYgYXR0ciAhPT0gXCJob3VzZU51bWJlckluZm9zXCIgJiYgYXR0ciAhPT0gXCJfY291bnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwQ29udGVudCArPSBcIjxsaT5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENvbnRlbnQgKz0gXCI8c3BhbiBjbGFzcz1cXFwiZ3AtYXR0bmFtZS1vdGhlcnMtc3BhblxcXCI+XCIgKyBhdHRyLnRvVXBwZXJDYXNlKCkgKyBcIiA6IDwvc3Bhbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENvbnRlbnQgKz0gYXR0cmlidXRlc1thdHRyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENvbnRlbnQgKz0gXCIgPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3B1cENvbnRlbnQgKz0gXCIgPC91bD5cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mb3JtYXRpb24uc2VydmljZSA9PT0gXCJTdWdnZXN0ZWRMb2NhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ID0gR2VvY29kZVV0aWxzLmdldFN1Z2dlc3RlZExvY2F0aW9uRnJlZWZvcm0oaW5mb3JtYXRpb24ubG9jYXRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3B1cENvbnRlbnQgPSBcInNhbnMgaW5mb3JtYXRpb25zLlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXBDb250ZW50ID0gaW5mb3JtYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3B1cENvbnRlbnQuaW5uZXJIVE1MID0gcG9wdXBDb250ZW50O1xuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwT3ZlcmxheSkge1xuICAgICAgICAgICAgLy8gYWpvdXQgZGUgbGEgcG9wdXAgYSBsYSBjYXJ0ZSBjb21tZSB1biBvdmVybGF5XG4gICAgICAgICAgICB0aGlzLl9wb3B1cE92ZXJsYXkgPSBuZXcgT3ZlcmxheSh7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA6IHRoaXMuX3BvcHVwRGl2LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uaW5nIDogXCJib3R0b20tY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb24gOiB0aGlzLl9tYXJrZXIuZ2V0UG9zaXRpb24oKSxcbiAgICAgICAgICAgICAgICBvZmZzZXQgOiBbMCwgLTQyXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtYXAuYWRkT3ZlcmxheSh0aGlzLl9wb3B1cE92ZXJsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2kgbCdvdmVybGF5IGVzdCBkw6lqw6AgY3LDqcOpLCBvbiBtb2RpZmllIGp1c3RlIHNhIHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLl9wb3B1cE92ZXJsYXkuc2V0UG9zaXRpb24odGhpcy5fbWFya2VyLmdldFBvc2l0aW9uKCkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIG90aGVyIGhhbmRsZXJzIGV2ZW50cyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdjbGljaycgb24gJ0dQc2hvd1NlYXJjaEVuZ2luZVBpY3RvJyB0YWcgbGFiZWxcbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZVNob3dTZWFyY2hFbmdpbmVQaWN0b0VsZW1lbnQpLCBhbmQgaXQgY2xlYW5zIHRoZSBjb21wb25lbnRcbiAgICAgKiB3aGVuIGl0J3MgY2xvc2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uU2hvd1NlYXJjaEVuZ2luZUNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5nZXRNYXAoKTtcbiAgICAgICAgLy8gb24gc3VwcHJpbWUgdG91dGVzIGxlcyBpbnRlcmFjdGlvbnNcbiAgICAgICAgSW50ZXJhY3Rpb25zLnVuc2V0KG1hcCk7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gdGhpcy5fc2hvd1NlYXJjaEVuZ2luZUlucHV0LmNoZWNrZWQ7XG4gICAgICAgIC8vIG9uIGfDqW7DqHJlIG5vdXMgbcOqbWUgbCdldmVuZW1lbnQgT3BlbkxheWVycyBkZSBjaGFuZ2VtZW50IGRlIHByb3ByacOpdMOpXG4gICAgICAgIC8vICh1dGlsaXNlciBvbC5jb250cm9sLlNlYXJjaEVuZ2luZS5vbihcImNoYW5nZTpjb2xsYXBzZWRcIiwgZnVuY3Rpb24gKSBwb3VyIHMnYWJvbm5lciDDoCBjZXQgw6l2w6huZW1lbnQpXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcImNoYW5nZTpjb2xsYXBzZWRcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2xpY2snIG9uICdHUHNlYXJjaElucHV0UmVzZXQnIHRhZyBkaXZcbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZVNlYXJjaElucHV0RWxlbWVudCksIGFuZCBpdCBjbGVhbnMgdGhlIHZhbHVlIG9mIGlucHV0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uU2VhcmNoUmVzZXRDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJSZXN1bHRzKCk7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIEF1dG9Db21wbGV0ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdjbGljaycgb24gJ0dQbG9jYXRpb25PcmlnaW4nIGlucHV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUub25BdXRvQ29tcGxldGVJbnB1dENsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5wdXRTZWFyY2hUZXh0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJHUHNlYXJjaElucHV0VGV4dC1cIiArIHRoaXMuX3VpZCk7XG4gICAgICAgIGlmIChpbnB1dFNlYXJjaFRleHRDb250YWluZXIgJiYgIWlucHV0U2VhcmNoVGV4dENvbnRhaW5lci5kaXNhYmxlZCAmJiBpbnB1dFNlYXJjaFRleHRDb250YWluZXIudmFsdWUubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdGhpcy5fZGlzcGxheVN1Z2dlc3RlZExvY2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdrZXl1cCcgb24gJ0dQc2VhcmNoSW5wdXRUZXh0JyB0YWcgaW5wdXRcbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZVNlYXJjaElucHV0RWxlbWVudCksIGFuZCBpdCBnZXRzIHRoZSB2YWx1ZSBvZiBpbnB1dC5cbiAgICAgKiB0aGlzIHZhbHVlIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBmb3IgdGhlIHNlcnZpY2UgYXV0b2NvbXBsZXRlICh0ZXh0KS5cbiAgICAgKiB0aGUgcmVzdWx0cyBvZiB0aGUgcmVxdWVzdCBhcmUgZGlzcGxheWVkIGludG8gYSBkcm9wIGRvd24gbWVudS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUub25BdXRvQ29tcGxldGVTZWFyY2hUZXh0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIHNhdXZlZ2FyZGUgbGUgbG9jYWxpc2FudFxuICAgICAgICB0aGlzLl9jdXJyZW50R2VvY29kaW5nTG9jYXRpb24gPSB2YWx1ZTtcblxuICAgICAgICAvLyBvbiBsaW1pdGUgbGVzIHJlcXXDqnRlcyDDoCBwYXJ0aXIgZGUgMyBjYXIuIHNhaXNpZSAhXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhclN1Z2dlc3RlZExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3RyaWdnZXJHZW9jb2RlID0gdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMudHJpZ2dlckdlb2NvZGU7XG4gICAgICAgIHZhciBfdHJpZ2dlckRlbGF5ID0gdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMudHJpZ2dlckRlbGF5O1xuXG4gICAgICAgIC8vIElORk9STUFUSU9OXG4gICAgICAgIC8vIG9uIGVmZmVjdHVlIGxhIHJlcXXDqnRlIGF1IHNlcnZpY2UgZCdhdXRvY29tcGxldGlvbi5cbiAgICAgICAgLy8gb24gbWV0IGVuIHBsYWNlIGRlcyBjYWxsYmFja3MgYWZpbiBkZSByZWN1cGVyZXIgbGVzIHJlc3VsdGF0cyBvdVxuICAgICAgICAvLyBsZXMgbWVzc2FnZXMgZCdlcnJldXJzIGR1IHNlcnZpY2UuXG4gICAgICAgIC8vIGxlcyByZXN1bHRhdHMgc29udCBhZmZpY2jDqXMgZGFucyB1bmUgbGlzdGUgZGVyb3VsYW50ZS5cbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0QXV0b0NvbXBsZXRlKHtcbiAgICAgICAgICAgIHRleHQgOiB2YWx1ZSxcbiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9uU3VjY2Vzc1xuICAgICAgICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwicmVxdWVzdCBmcm9tIEF1dG9Db21wbGV0ZVwiLCByZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBzYXV2ZWdhcmRlIGwnZXRhdCBkZXMgcsOpc3VsdGF0c1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnMgPSByZXN1bHRzLnN1Z2dlc3RlZExvY2F0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fbG9jYXRpb25zVG9CZURpc3BsYXllZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiB2w6lyaWZpZSBxdSdvbiBuJ2EgcGFzIHLDqWN1cMOpcsOpIGRlcyBjb29yZG9ubsOpZXMgbnVsbGVzIChwYXIgZXggcmVjaGVyY2hlIHBhciBjb2RlIHBvc3RhbClcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbG9jYXRpb24gPSBjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWxvY2F0aW9uLnBvc2l0aW9uICYmIGlsb2NhdGlvbi5wb3NpdGlvbi54ID09PSAwICYmIGlsb2NhdGlvbi5wb3NpdGlvbi55ID09PSAwICYmIGlsb2NhdGlvbi5mdWxsVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGxlcyBjb29yZG9ubsOpZXMgc29udCBudWxsZXMsIGlsIGZhdXQgcmVsYW5jZXIgdW5lIHJlcXXDqnRlIGRlIGfDqW9jb2RhZ2UgYXZlYyBsJ2F0dHJpYnV0IFwiZnVsbFRleHRcIiByw6ljdXDDqXLDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2dldEdlb2NvZGVDb29yZGluYXRlc0Zyb21GdWxsVGV4dChpbG9jYXRpb24sIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5vbiBvbiBwZXV0IGFmZmljaGVyIG5vcm1hbGVtZW50IGxlIHLDqXN1bHRhdCBkYW5zIGxhIGxpc3RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fbG9jYXRpb25zVG9CZURpc3BsYXllZC5wdXNoKGlsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGFmZmljaGUgbGVzIHLDqXN1bHRhdHMgcXVpIG4nb250IHBhcyBkZXMgY29vcmRvbm7DqWVzIG51bGxlc1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9maWxsQXV0b0NvbXBsZXRlZExvY2F0aW9uTGlzdENvbnRhaW5lcihjb250ZXh0Ll9sb2NhdGlvbnNUb0JlRGlzcGxheWVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gYW5udWxlIGV2ZW50dWVsbGVtZW50IHVuZSByZXF1ZXRlIGRlIGdlb2NvZGFnZSBlbiBjb3VycyBjYXIgb24gb2J0aWVudCBkZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gZGUgbm91dmVhdSBkZXMgcmVzdWx0YXRzIGQnYXV0b2NvbXBsZXRpb24uLi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuX3RyaWdnZXJIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29udGV4dC5fdHJpZ2dlckhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fdHJpZ2dlckhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDYW5jZWwgYSBnZW9jb2RlIHJlcXVlc3QgIVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvbkZhaWx1cmVcbiAgICAgICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgLy8gb8O5IGFmZmljaGUgdCBvbiBsZXMgbWVzc2FnZXMgOiBleC4gJ05vIHN1Z2dlc3Rpb24gbWF0Y2hpbmcgdGhlIHNlYXJjaCcgP1xuICAgICAgICAgICAgICAgIGNvbnRleHQuX2NsZWFyU3VnZ2VzdGVkTG9jYXRpb24oKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIC8vIG9uIGVudm9pZSB1bmUgcmVxdWV0ZSBkZSBnZW9jb2RhZ2Ugc2kgYXVjdW4gcmVzdWx0YXQgZCdhdXRvY29tcGxldGlvblxuICAgICAgICAgICAgICAgIC8vIG4nYSDDqXTDqSB0cm91dsOpICEgRXQgb24gbidvdWJsaWUgcGFzIGQnYW5udWxlciBjZWxsZSBxdWkgZXN0IGVuIGNvdXJzICFcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PT0gXCJObyBzdWdnZXN0aW9uIG1hdGNoaW5nIHRoZSBzZWFyY2hcIiAmJiBfdHJpZ2dlckdlb2NvZGUgLyogJiYgdmFsdWUubGVuZ3RoID09PSA1ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Ll90cmlnZ2VySGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RyaWdnZXJIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ2FuY2VsIHRoZSBsYXN0IGdlb2NvZGUgcmVxdWVzdCAhXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3RyaWdnZXJIYW5kbGVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIkxhdW5jaCBhIGdlb2NvZGUgcmVxdWVzdCAoY29kZSBwb3N0YWwpICFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fcmVxdWVzdEdlb2NvZGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uIDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9uU3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcInJlcXVlc3QgZnJvbSBHZW9jb2RpbmdcIiwgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtb2RpZmllIGxhIHN0cnVjdHVyZSBkZXMgcmVwb25zZXMgcG91ciDDqnRyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgYXZlYyBsJ2F1dG9jb21wbGV0aW9uICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25zID0gcmVzdWx0cy5sb2NhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gbG9jYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5mdWxsVGV4dCA9IEdlb2NvZGVVdGlscy5nZXRHZW9jb2RlZExvY2F0aW9uRnJlZWZvcm0obG9jYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5wb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggOiBsb2NhdGlvbi5wb3NpdGlvbi5sb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDogbG9jYXRpb24ucG9zaXRpb24ubGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWQucHVzaChsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2ZpbGxBdXRvQ29tcGxldGVkTG9jYXRpb25MaXN0Q29udGFpbmVyKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9uRmFpbHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF90cmlnZ2VyRGVsYXlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBtYXAgPSB0aGlzLmdldE1hcCgpO1xuICAgICAgICBtYXAub24oXG4gICAgICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgICAgICB0aGlzLl9oaWRlU3VnZ2VzdGVkTG9jYXRpb24sXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICAgIG1hcC5vbihcbiAgICAgICAgICAgIFwicG9pbnRlcmRyYWdcIixcbiAgICAgICAgICAgIHRoaXMuX2hpZGVTdWdnZXN0ZWRMb2NhdGlvbixcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IEdwLlNlcnZpY2VzLmF1dG9Db21wbGV0ZSBjYWxsYmFjayBpbiBjYXNlIG9mIHN1Y2Nlc3NcbiAgICAgKiAoY2YuIHRoaXMub25BdXRvQ29tcGxldGVTZWFyY2hUZXh0KSwgZm9yIHN1Z2dlc3RlZCBsb2NhdGlvbnMgd2l0aCBudWxsIGNvb3JkaW5hdGVzXG4gICAgICogKGNhc2Ugb2YgcG9zdGFsQ29kZSByZXNlYXJjaCBmb3IgaW5zdGFuY2UpLlxuICAgICAqIFNlbmQgYSBnZW9jb2RlIHJlcXVlc3Qgd2l0aCBzdWdnZXN0ZWQgbG9jYXRpb24gJ2Z1bGxUZXh0JyBhdHRyaWJ1dGUsIHRvIGdldCBpdHMgY29vcmRpbmF0ZXMgYW5kIGRpc3BsYXkgaXQgaW4gYXV0b2NvbXBsZXRlIHJlc3VsdHMgbGlzdCBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0dwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZVJlc3BvbnNlLlN1Z2dlc3RlZExvY2F0aW9ufSBzdWdnZXN0ZWRMb2NhdGlvbiAtIGF1dG9jb21wbGV0aW9uIHJlc3VsdCAod2l0aCBudWxsIGNvb3JkaW5hdGVzKSB0byBiZSBnZW9jb2RlZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpIC0gc3VnZ2VzdGVkTG9jYXRpb24gcG9zaXRpb24gaW4gR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlUmVzcG9uc2Uuc3VnZ2VzdGVkTG9jYXRpb25zIGF1dG9jb21wbGV0ZSByZXN1bHRzIGxpc3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2dldEdlb2NvZGVDb29yZGluYXRlc0Zyb21GdWxsVGV4dCA9IGZ1bmN0aW9uIChzdWdnZXN0ZWRMb2NhdGlvbiwgaSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIEdwLlNlcnZpY2VzLmdlb2NvZGUoe1xuICAgICAgICAgICAgYXBpS2V5IDogdGhpcy5vcHRpb25zLmFwaUtleSxcbiAgICAgICAgICAgIHNzbCA6IHRoaXMub3B0aW9ucy5zc2wsXG4gICAgICAgICAgICBxIDogR2VvY29kZVV0aWxzLmdldFN1Z2dlc3RlZExvY2F0aW9uRnJlZWZvcm0oc3VnZ2VzdGVkTG9jYXRpb24pLFxuICAgICAgICAgICAgaW5kZXggOiBzdWdnZXN0ZWRMb2NhdGlvbi50eXBlLFxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgb25TdWNjZXNzXG4gICAgICAgICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwicmVxdWVzdCBmcm9tIEdlb2NvZGluZyAoY29vcmRpbmF0ZXMgbnVsbClcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sb2NhdGlvbnMgJiYgcmVzcG9uc2UubG9jYXRpb25zLmxlbmd0aCAhPT0gMCAmJiByZXNwb25zZS5sb2NhdGlvbnNbMF0ucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbW9kaWZpZSBsZXMgY29vcmRvbm7DqWVzIGR1IHLDqXN1bHRhdCBlbiBFUFNHOjQzMjYgZG9uYyBsYXQsbG9uXG4gICAgICAgICAgICAgICAgICAgIC8vLyBcXFRPRE8gdmVyaWZpZXIgc2kgbCdpbnZlcnNpb24gZGVzIGNvb3Jkb25uZWVzIGVzdCBuZWNlc3NhaXJlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnMgJiYgY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnNbaV0ucG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIDogcmVzcG9uc2UubG9jYXRpb25zWzBdLnBvc2l0aW9uLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0IDogcmVzcG9uc2UubG9jYXRpb25zWzBdLnBvc2l0aW9uLnhcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldCBvbiBsJ2FmZmljaGUgZGFucyBsYSBsaXN0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fbG9jYXRpb25zVG9CZURpc3BsYXllZC51bnNoaWZ0KGNvbnRleHQuX3N1Z2dlc3RlZExvY2F0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9maWxsQXV0b0NvbXBsZXRlZExvY2F0aW9uTGlzdENvbnRhaW5lcihjb250ZXh0Ll9sb2NhdGlvbnNUb0JlRGlzcGxheWVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvbkZhaWx1cmVcbiAgICAgICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBzaSBvbiBuJ2EgcGFzIHLDqXVzc2kgw6AgcsOpY3Vww6lyZXIgbGVzIGNvb3Jkb25uw6llcywgb24gYWZmaWNoZSBxdWFuZCBtw6ptZSBsZSByw6lzdWx0YXRcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zICYmIGNvbnRleHQuX3N1Z2dlc3RlZExvY2F0aW9uc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9jcmVhdGVBdXRvQ29tcGxldGVkTG9jYXRpb25FbGVtZW50KGNvbnRleHQuX3N1Z2dlc3RlZExvY2F0aW9uc1tpXSwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdjbGljaycgb24gJ0dQYXV0b0NvbXBsZXRlUmVzdWx0c0xpc3QnIHRhZyBkaXZcbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZUF1dG9Db21wbGV0ZUxpc3RFbGVtZW50KSwgYW5kIGl0IHNlbGVjdHMgdGhlIGxvY2F0aW9uLlxuICAgICAqIHRoaXMgbG9jYXRpb24gZGlzcGxheXMgYSBtYXJrZXIgb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUub25BdXRvQ29tcGxldGVkUmVzdWx0c0l0ZW1DbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIFRPRE8gb24gc291aGFpdGUgdW4gY29tcG9ydGVtZW50IGRpZmZlcmVudCBwb3VyIGxhIHNlbGVjdGlvbiBkZXMgcmVwb25zZXNcbiAgICAgICAgLy8gZGUgbCdhdXRvY29tcGxldGlvbiA6XG4gICAgICAgIC8vIC0gbGlzdGUgZGVyb3VsYW50ZSBkZXMgcmVwb25zZXMsXG4gICAgICAgIC8vIC0gcHVpcyBwb3NzaWJpbGl0w6kgZGUgY2xpcXVlciBzdXIgdW5lIHN1Z2dlc3Rpb25cbiAgICAgICAgLy8gLSBtYWlzIGF1c3NpIGRlIGxhIGNob2lzaXIgYXZlYyBsZSBjbGF2aWVyIChhcnJvdyB1cC9kb3duKSwgcHVpcyB2YWxpZGVyXG4gICAgICAgIC8vIHBhciB1biByZXR1cm5cbiAgICAgICAgLy8gY2V0dGUgc2VsZWN0aW9uIGF2ZWMgbGVzIGZsZWNoZXMgZG9pdCBtZXR0cmUgw6Agam91ciBsZSBpbnB1dCAhXG4gICAgICAgIC8vIChjb21tZSB1biBtb3RldXIgZGUgcmVjaGVyY2hlIGRlIG5hdmlnYXRldXIpXG5cbiAgICAgICAgdmFyIGlkeCA9IFNlbGVjdG9ySUQuaW5kZXgoZS50YXJnZXQuaWQpO1xuICAgICAgICBsb2dnZXIubG9nKGlkeCk7XG4gICAgICAgIGxvZ2dlci5sb2codGhpcy5fbG9jYXRpb25zVG9CZURpc3BsYXllZFtpZHhdKTtcblxuICAgICAgICBpZiAoIWlkeCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgdGhpcy5fbG9jYXRpb25zVG9CZURpc3BsYXllZFtpZHhdLnBvc2l0aW9uLngsXG4gICAgICAgICAgICB0aGlzLl9sb2NhdGlvbnNUb0JlRGlzcGxheWVkW2lkeF0ucG9zaXRpb24ueVxuICAgICAgICBdO1xuICAgICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgICAgIHNlcnZpY2UgOiBcIlN1Z2dlc3RlZExvY2F0aW9uXCIsXG4gICAgICAgICAgICBsb2NhdGlvbiA6IHRoaXMuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWRbaWR4XVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG9uIGFqb3V0ZSBsZSB0ZXh0ZSBkZSBsJ2F1dG9jb21wbMOpdGlvbiBkYW5zIGwnaW5wdXRcbiAgICAgICAgdmFyIGxhYmVsID0gR2VvY29kZVV0aWxzLmdldFN1Z2dlc3RlZExvY2F0aW9uRnJlZWZvcm0odGhpcy5fbG9jYXRpb25zVG9CZURpc3BsYXllZFtpZHhdKTtcbiAgICAgICAgdGhpcy5fc2V0TGFiZWwobGFiZWwpO1xuXG4gICAgICAgIC8vIG9uIHNhdXZlZ2FyZGUgbGUgbG9jYWxpc2FudFxuICAgICAgICB0aGlzLl9jdXJyZW50R2VvY29kaW5nTG9jYXRpb24gPSBsYWJlbDtcblxuICAgICAgICAvLyBJbmZvIDogbGEgcG9zaXRpb24gZXN0IGVuIEVQU0c6NDMyNiwgw6AgdHJhbnNmb3JtZXIgZGFucyBsYSBwcm9qZWN0aW9uIGRlIGxhIGNhcnRlXG4gICAgICAgIHZhciB2aWV3ID0gdGhpcy5nZXRNYXAoKS5nZXRWaWV3KCk7XG4gICAgICAgIHZhciBtYXBQcm9qID0gdmlldy5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpO1xuICAgICAgICBpZiAobWFwUHJvaiAhPT0gXCJFUFNHOjQzMjZcIikge1xuICAgICAgICAgICAgLy8gb24gcmV0cmFuc2Zvcm1lIGxlcyBjb29yZG9ubsOpZXMgZGUgbGEgcG9zaXRpb24gZGFucyBsYSBwcm9qZWN0aW9uIGRlIGxhIGNhcnRlXG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9sUHJvalRyYW5zZm9ybShwb3NpdGlvbiwgXCJFUFNHOjQzMjZcIiwgbWFwUHJvaik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb24gY2VudHJlIGxhIHZ1ZSBldCBwb3NpdGlvbm5lIGxlIG1hcmtlciwgw6AgbGEgcG9zaXRpb24gcmVwcm9qZXTDqWUgZGFucyBsYSBwcm9qZWN0aW9uIGRlIGxhIGNhcnRlXG4gICAgICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbShpbmZvKTtcbiAgICAgICAgdGhpcy5fc2V0UG9zaXRpb24ocG9zaXRpb24sIHpvb20pO1xuICAgICAgICBpZiAodGhpcy5fZGlzcGxheU1hcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fc2V0TWFya2VyKHBvc2l0aW9uLCBpbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogZXZlbnQgdHJpZ2dlcmVkIHdoZW4gYW4gZWxlbWVudCBvZiB0aGUgcmVzdWx0cyBpcyBjbGlja2VkIGZvciBhdXRvY29tcGxldGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgc2VhcmNoZW5naW5lOmF1dG9jb21wbGV0ZTpjbGlja1xuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdHlwZSAtIGV2ZW50XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2NhdGlvbiAtIGxvY2F0aW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0YXJnZXQgLSBpbnN0YW5jZSBTZWFyY2hFbmdpbmVcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogU2VhcmNoRW5naW5lLm9uKFwic2VhcmNoZW5naW5lOmF1dG9jb21wbGV0ZTpjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGUubG9jYXRpb24pO1xuICAgICAgICAgKiB9KVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHR5cGUgOiBcInNlYXJjaGVuZ2luZTphdXRvY29tcGxldGU6Y2xpY2tcIixcbiAgICAgICAgICAgIGxvY2F0aW9uIDogdGhpcy5fbG9jYXRpb25zVG9CZURpc3BsYXllZFtpZHhdXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgR2VvY29kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnc3VibWl0JyBvbiAnR1BzZWFyY2hJbnB1dCcgdGFnIGZvcm1cbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZVNlYXJjaElucHV0RWxlbWVudCksIGFuZCBpdCBnZXRzIHRoZSB2YWx1ZSBvZiBpbnB1dC5cbiAgICAgKiB0aGlzIHZhbHVlIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBmb3IgdGhlIHNlcnZpY2UgZ2VvY29kaW5nLlxuICAgICAqIHRoZSByZXN1bHRzIG9mIHRoZSByZXF1ZXN0IGFyZSBkaXNwbGF5ZWQgaW50byBhIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUub25HZW9jb2RpbmdTZWFyY2hTdWJtaXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBlLnRhcmdldFswXS52YWx1ZTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gc2F1dmVnYXJkZSBsZSBsb2NhbGlzYW50XG4gICAgICAgIHRoaXMuX2N1cnJlbnRHZW9jb2RpbmdMb2NhdGlvbiA9IHZhbHVlO1xuXG4gICAgICAgIC8vIG9uIG1ldCBlbiBwbGFjZSBsJ2FmZmljaGFnZSBkZXMgcmVzdWx0YXRzIGRhbnMgdW5lIGZlbmV0cmUgZGUgcmVjaGVyY2hlLlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RHZW9jb2Rpbmcoe1xuICAgICAgICAgICAgcXVlcnkgOiB2YWx1ZSxcbiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9uU3VjY2Vzc1xuICAgICAgICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwicmVxdWVzdCBmcm9tIEdlb2NvZGluZ1wiLCByZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25zID0gcmVzdWx0cy5sb2NhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2ZpbGxHZW9jb2RlZExvY2F0aW9uTGlzdENvbnRhaW5lcihsb2NhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvbkZhaWx1cmVcbiAgICAgICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNmLiB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoKClcbiAgICAgICAgICAgICAgICBjb250ZXh0Ll9jbGVhckdlb2NvZGVkTG9jYXRpb24oKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdzdWJtaXQnIG9uICdHUGdlb2NvZGVSZXN1bHRzTGlzdCcgdGFnIGRpdlxuICAgICAqIChjZi4gdGhpcy5fY3JlYXRlR2VvY29kZVJlc3VsdHNMaXN0RWxlbWVudCksIGFuZCBpdCBzZWxlY3RzIHRoZSBsb2NhdGlvbi5cbiAgICAgKiB0aGlzIGxvY2F0aW9uIGRpc3BsYXlzIGEgbWFya2VyIG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uR2VvY29kZWRSZXN1bHRzSXRlbUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGlkeCA9IFNlbGVjdG9ySUQuaW5kZXgoZS50YXJnZXQuaWQpO1xuXG4gICAgICAgIGlmICghaWR4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zaXRpb24gPSBbXG4gICAgICAgICAgICB0aGlzLl9nZW9jb2RlZExvY2F0aW9uc1tpZHhdLnBvc2l0aW9uLmxvbixcbiAgICAgICAgICAgIHRoaXMuX2dlb2NvZGVkTG9jYXRpb25zW2lkeF0ucG9zaXRpb24ubGF0XG4gICAgICAgIF07XG4gICAgICAgIHZhciBpbmZvID0ge1xuICAgICAgICAgICAgc2VydmljZSA6IFwiR2VvY29kZWRMb2NhdGlvblwiLFxuICAgICAgICAgICAgbG9jYXRpb24gOiB0aGlzLl9nZW9jb2RlZExvY2F0aW9uc1tpZHhdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gb24gYWpvdXRlIGxlIHRleHRlIGR1IGfDqW9jb2RhZ2UgZGFucyBsJ2lucHV0XG4gICAgICAgIHZhciBsYWJlbCA9IEdlb2NvZGVVdGlscy5nZXRHZW9jb2RlZExvY2F0aW9uRnJlZWZvcm0odGhpcy5fZ2VvY29kZWRMb2NhdGlvbnNbaWR4XSk7XG4gICAgICAgIHRoaXMuX3NldExhYmVsKGxhYmVsKTtcblxuICAgICAgICAvLyBJbmZvIDogbGEgcG9zaXRpb24gZXN0IGVuIEVQU0c6NDMyNiwgw6AgdHJhbnNmb3JtZXIgZGFucyBsYSBwcm9qZWN0aW9uIGRlIGxhIGNhcnRlXG4gICAgICAgIHZhciB2aWV3ID0gdGhpcy5nZXRNYXAoKS5nZXRWaWV3KCk7XG4gICAgICAgIHZhciBtYXBQcm9qID0gdmlldy5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpO1xuICAgICAgICBpZiAobWFwUHJvaiAhPT0gXCJFUFNHOjQzMjZcIikge1xuICAgICAgICAgICAgLy8gb24gcmV0cmFuc2Zvcm1lIGxlcyBjb29yZG9ubsOpZXMgZGUgbGEgcG9zaXRpb24gZGFucyBsYSBwcm9qZWN0aW9uIGRlIGxhIGNhcnRlXG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9sUHJvalRyYW5zZm9ybShwb3NpdGlvbiwgXCJFUFNHOjQzMjZcIiwgbWFwUHJvaik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb24gY2VudHJlIGxhIHZ1ZSBldCBwb3NpdGlvbm5lIGxlIG1hcmtlciwgw6AgbGEgcG9zaXRpb24gcmVwcm9qZXTDqWUgZGFucyBsYSBwcm9qZWN0aW9uIGRlIGxhIGNhcnRlXG4gICAgICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbShpbmZvKTtcbiAgICAgICAgdGhpcy5fc2V0UG9zaXRpb24ocG9zaXRpb24sIHpvb20pO1xuICAgICAgICBpZiAodGhpcy5fZGlzcGxheU1hcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fc2V0TWFya2VyKHBvc2l0aW9uLCBpbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogZXZlbnQgdHJpZ2dlcmVkIHdoZW4gYW4gZWxlbWVudCBvZiB0aGUgcmVzdWx0cyBpcyBjbGlja2VkIGZvciBnZW9jb2RpbmdcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IHNlYXJjaGVuZ2luZTpnZW9jb2RlOmNsaWNrXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0eXBlIC0gZXZlbnRcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IGxvY2F0aW9uIC0gbG9jYXRpb25cbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHRhcmdldCAtIGluc3RhbmNlIFNlYXJjaEVuZ2luZVxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBTZWFyY2hFbmdpbmUub24oXCJzZWFyY2hlbmdpbmU6Z2VvY29kZTpjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGUubG9jYXRpb24pO1xuICAgICAgICAgKiB9KVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHR5cGUgOiBcInNlYXJjaGVuZ2luZTpnZW9jb2RlOmNsaWNrXCIsXG4gICAgICAgICAgICBsb2NhdGlvbiA6IHRoaXMuX2dlb2NvZGVkTG9jYXRpb25zW2lkeF1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyBoYW5kbGVycyBldmVudHMgR2VvY29kZSBBZHZhbmNlZCAjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdjaGFuZ2UnIG9uICdHUGFkdmFuY2VkU2VhcmNoQ29kZScgdGFnIHNlbGVjdFxuICAgICAqIChjZi4gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hGb3JtQ29kZUVsZW1lbnQpLCBhbmQgaXQgZ2V0cyB0aGUgdmFsdWUgb2ZcbiAgICAgKiBvcHRpb24gc2VsZWN0ZWQuXG4gICAgICogdGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dHMgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5vbkdlb2NvZGluZ0FkdmFuY2VkU2VhcmNoQ29kZUNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGxvZ2dlci5sb2coZSk7XG4gICAgICAgIHZhciBpZHggPSBlLnRhcmdldC5zZWxlY3RlZEluZGV4O1xuICAgICAgICB2YXIgdmFsdWUgPSBlLnRhcmdldC5vcHRpb25zW2lkeF0udmFsdWU7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSU5GT1JNQVRJT05cbiAgICAgICAgLy8gbGUgZGVjbGVuY2hlbWVudCBkZSBsJ2V2ZW5lbWVudCB2YSBjcmVlciB1biBjb250YWluZXIgZGUgZmlsdHJlIMOgIGxhIHZvbMOpZS4uLlxuICAgICAgICAvLyBsJ2luc2VydGlvbiBkZXMgY29udGFpbmVycyBkJ2F0dHJpYnV0cyBkYW5zIGxlIERPTSBzb250IDpcbiAgICAgICAgLy8gLSBzb2l0IEdQYWR2YW5jZWRTZWFyY2hGaWx0ZXJzID4gUG9zaXRpb25PZkludGVyZXN0XG4gICAgICAgIC8vIC0gc29pdCBHUGFkdmFuY2VkU2VhcmNoRmlsdGVycyA+IFN0cmVldEFkZHJlc3NcbiAgICAgICAgLy8gLSBzb2l0IEdQYWR2YW5jZWRTZWFyY2hGaWx0ZXJzID4gQ2FkYXN0cmFsUGFyY2VsXG4gICAgICAgIC8vIGNmLiBfc2V0RmlsdGVyKCkgcG91ciBsYSBjcmVhdGlvbiBkdSBjb250YWluZXJcblxuICAgICAgICB0aGlzLl9zZXRGaWx0ZXIodmFsdWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJ3N1Ym1pdCcgb24gJ0dQYWR2YW5jZWRTZWFyY2hGb3JtJyB0YWcgZm9ybVxuICAgICAqIChjZi4gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hQYW5lbEZvcm1FbGVtZW50KSwgYW5kIGl0IGdldHMgdGhlIHZhbHVlIG9mIGFsbCBpbnB1dC5cbiAgICAgKiB0aGlzIHZhbHVlIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBmb3IgdGhlIHNlcnZpY2UgZ2VvY29kaW5nLlxuICAgICAqIHRoZSByZXN1bHRzIG9mIHRoZSByZXF1ZXN0IGFyZSBkaXNwbGF5ZWQgaW50byBhIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIC0gW3trZXk6IC4uLiwgdmFsdWU6IC4uLn1dXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uR2VvY29kaW5nQWR2YW5jZWRTZWFyY2hTdWJtaXQgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBsb2dnZXIubG9nKGRhdGEpO1xuICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbG9jYXRpb247XG4gICAgICAgIHZhciBfZmlsdGVyT3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpbHRlciA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZiAoZmlsdGVyLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZpbHRlck9wdGlvbnNbZmlsdGVyLmtleV0gPSBmaWx0ZXIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5wdXRTZWFyY2hUZXh0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJHUHNlYXJjaElucHV0VGV4dC1cIiArIHRoaXMuX3VpZCk7XG4gICAgICAgIF9sb2NhdGlvbiA9IGlucHV0U2VhcmNoVGV4dENvbnRhaW5lci52YWx1ZTtcblxuICAgICAgICAvLyBPbiBuZSBwcmVuZCBwYXMgZW4gY29tcHRlIGNlIHF1J2lsIHkgYSBkYW5zIGwnaW5wdXQgZGUgcmVjaGVyY2hlIHNpbXBsZSBwb3VyIGxhIHJlY2hlcmNoZSBhdmFuY2UgZGUgUENcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRHZW9jb2RpbmdDb2RlID09PSBcIkNhZGFzdHJhbFBhcmNlbFwiKSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gPSBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gbWV0IGVuIHBsYWNlIGwnYWZmaWNoYWdlIGRlcyByZXN1bHRhdHMgZGFucyB1bmUgZmVuZXRyZSBkZSByZWNoZXJjaGUuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgdGhpcy5fcmVxdWVzdEdlb2NvZGluZyh7XG4gICAgICAgICAgICBxdWVyeSA6IF9sb2NhdGlvbixcbiAgICAgICAgICAgIGluZGV4IDogdGhpcy5fY3VycmVudEdlb2NvZGluZ0NvZGUsXG4gICAgICAgICAgICBmaWx0ZXJzIDogX2ZpbHRlck9wdGlvbnMsXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvblN1Y2Nlc3NcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25zID0gcmVzdWx0cy5sb2NhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2ZpbGxHZW9jb2RlZExvY2F0aW9uTGlzdENvbnRhaW5lcihsb2NhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvbkZhaWx1cmVcbiAgICAgICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNmLiB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoKClcbiAgICAgICAgICAgICAgICBjb250ZXh0Ll9jbGVhckdlb2NvZGVkTG9jYXRpb24oKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5ICdvbkdlb2NvZGluZ0FkdmFuY2VkU2VhcmNoU3VibWl0JyBtZXRob2QsXG4gICAgICogaW4gY2FzZSBnZW9jb2RpbmcgdHlwZSBpcyAnQ2FkYXN0cmFsUGFyY2VsJyxcbiAgICAgKiBhbmQgZ2V0cyByZXF1ZXN0IHBhcmFtZXRlcnMgZnJvbSBpbnB1dHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWx0ZXJPcHRpb25zIC0gb2JqZWN0IHdpdGggaW5wdXRzIHZhbHVlIChkZXBhcnRtZW50LCBpbnNlZSwgLi4uKVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGxvY2F0aW9uIC0gY2FkYXN0cmFsIHBhcmNlbCBudW1iZXIgOiBjb25jYXRlbmF0aW9uIG9mIGlucHV0cyB2YWx1ZXMgKGUuZy4gOiA5NDA2NzAwMDBEMDA0MSBvciA5NDA2N19fX19fMDA0MSlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2dldENhZGFzdHJhbFBhcmNlbFJlcXVlc3RQYXJhbXMgPSBmdW5jdGlvbiAoZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAvKiBpbmZvOlxuICAgICAgICAgICAgbGEgcGFyY2VsbGUgY2FkYXN0cmFsZSBzZSBjb21wb3NlIGRlIDE0IGNoaWZmcmVzIG91IGxldHRyZXMsIGluZGlxdWFudCwgZGUgZ2F1Y2hlIMOgIGRyb2l0ZSA6XG4gICAgICAgICAgICAtIGxlIGNvZGUgZHUgZMOpcGFydGVtZW50ICgyIGNhcmFjdMOocmVzKVxuICAgICAgICAgICAgLSBsZSBjb2RlIGNvbW11bmUgKDMgY2FyYWN0w6hyZXMpLiAoUmVtYXJxdWUgOiBjb2RlIGTDqXBhcnRlbWVudCArIGNvZGUgY29tbXVuZSA9IGNvZGUgSU5TRUUpXG4gICAgICAgICAgICAtIE9VIGxlIGNvZGUgSU5TRUUgZGUgbGEgY29tbXVuZSAoNSBjaGlmZnJlcykgKHJlbXBsYWNlIGxlcyAyIHByw6ljw6lkZW50cylcbiAgICAgICAgICAgIC0gbGUgY29kZSBjb21tdW5lIGFic29yYsOpZSBJTlNFRSwgb3UgJzAwMCcgKDMgY2FyYWN0w6hyZXMpLFxuICAgICAgICAgICAgLSBsYSBzZWN0aW9uICgyIGNhcmFjdMOocmVzKSxcbiAgICAgICAgICAgIC0gbGUgbnVtw6lybyBkZSBwYXJjZWxsZSAoNCBjYXJhY3TDqHJlcykuXG4gICAgICAgICAgICBFeGVtcGxlIGRlIHBhcmNlbGxlIDogJzk0MDY3MDAwMEQwMDQxJy4gU2kgbCdpZGVudGlmaWFudCBlc3QgaW5jb21wbGV0IChwYXIgZXhlbXBsZSAnOTQwNjcwMDAwRCcpLCBsZSBzZXJ2aWNlIHJlbnZlcnJhIHVuaXF1ZW1lbnQgbGVzIDI1IHByZW1pZXJzIHLDqXN1bHRhdHMgcG91dmFudCBjb3JyZXNwb25kcmUuXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIF9sb2NhdGlvbiA9IFwiXCI7XG5cbiAgICAgICAgdmFyIGw7XG4gICAgICAgIC8vIGNvZGUgZMOpcGFydGVtZW50ICgyIGNhcmFjdMOocmVzKVxuICAgICAgICB2YXIgZGVwID0gZmlsdGVyT3B0aW9ucy5kZXBhcnRtZW50O1xuICAgICAgICBpZiAoZGVwKSB7XG4gICAgICAgICAgICBsID0gZGVwLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uID0gZGVwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gc2kgdW4gc2V1bCBudW3DqXJvIGEgw6l0w6kgc2Fpc2ksIG9uIHByw6lzdW1lIHF1ZSBjJ2VzdCB1biBudW3DqXJvIDwgMTBcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gPSBcIjBcIiArIGRlcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uID0gZGVwLnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9sb2NhdGlvbiA9IFwiX19cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvZGUgY29tbXVuZSBpbnNlZSAoMyBjYXJhY3TDqHJlcylcbiAgICAgICAgdmFyIGNvbW11bmUgPSBmaWx0ZXJPcHRpb25zLmNvbW11bmU7XG4gICAgICAgIGlmIChjb21tdW5lKSB7XG4gICAgICAgICAgICBsID0gY29tbXVuZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobCA9PT0gMykge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBjb21tdW5lO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IFwiX1wiICsgY29tbXVuZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9fXCIgKyBjb21tdW5lO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gbCA+IDNcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gY29tbXVuZS5zdWJzdHJpbmcoMCwgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX19cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvZGUgaW5zZWUgKDUgY2FyYWN0w6hyZXMpIDogc3VyY2hhcmdlIGxlcyAyIGF1dHJlcyBzaSByZW5zZWlnbsOpXG4gICAgICAgIHZhciBpbnNlZSA9IGZpbHRlck9wdGlvbnMuaW5zZWU7XG4gICAgICAgIGlmIChpbnNlZSkge1xuICAgICAgICAgICAgaWYgKGluc2VlLmxlbmd0aCA9PT0gNSkge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiA9IGluc2VlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29kZSBjb21tdW5lIGFic29yYmVlIElOU0VFICgzIGNhcmFjdMOocmVzKVxuICAgICAgICB2YXIgYWJzb3JiZWRDaXR5ID0gZmlsdGVyT3B0aW9ucy5hYnNvcmJlZENpdHk7XG4gICAgICAgIGlmIChhYnNvcmJlZENpdHkpIHtcbiAgICAgICAgICAgIGwgPSBhYnNvcmJlZENpdHkubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGwgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gYWJzb3JiZWRDaXR5O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsIDwgMykge1xuICAgICAgICAgICAgICAgIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9cIiArIGFic29yYmVkQ2l0eTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IFwiX19cIiArIGFic29yYmVkQ2l0eTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBsID4gM1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBhYnNvcmJlZENpdHkuc3Vic3RyaW5nKDAsIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2xvY2F0aW9uICs9IFwiX19fXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWN0aW9uICgyIGNhcmFjdMOocmVzKVxuICAgICAgICB2YXIgc2VjdGlvbiA9IGZpbHRlck9wdGlvbnMuc2VjdGlvbjtcbiAgICAgICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgICAgICAgIGwgPSBzZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IHNlY3Rpb247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfXCIgKyBzZWN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gc2VjdGlvbi5zdWJzdHJpbmcoMCwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbnVtw6lybyBkZSBwYXJjZWxsZSAoNCBjYXJhY3TDqHJlcylcbiAgICAgICAgdmFyIG51bWJlciA9IGZpbHRlck9wdGlvbnMubnVtYmVyO1xuICAgICAgICBpZiAobnVtYmVyKSB7XG4gICAgICAgICAgICBsID0gbnVtYmVyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID09PSA0KSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IG51bWJlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMykge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9cIiArIG51bWJlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMikge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9fXCIgKyBudW1iZXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX19cIiArIG51bWJlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGwgPiA0XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IG51bWJlci5zdWJzdHJpbmcoMCwgNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX19cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2coXCJsb2NhdGlvbiA6IFwiICsgX2xvY2F0aW9uKTtcblxuICAgICAgICByZXR1cm4gX2xvY2F0aW9uO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGNsZWFuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uU2VhcmNoUmVzZXQoKVxuICAgICAqIGFuZCBpdCBjbGVhcnMgYWxsIHJlc3VsdHMgYW5kIHRoZSBtYXJrZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NsZWFyUmVzdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jbGVhclN1Z2dlc3RlZExvY2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX2NsZWFyR2VvY29kZWRMb2NhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuX3NldE1hcmtlcigpO1xuICAgICAgICAvLyBvbiByZXRpcmUgbCdvdmVybGF5IGRlIGxhIHBvcHVwIGRlIGxhIGNhcnRlXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cE92ZXJsYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwLnJlbW92ZU92ZXJsYXkodGhpcy5fcG9wdXBPdmVybGF5KTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwT3ZlcmxheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub25BdXRvQ29tcGxldGVTZWFyY2hUZXh0KClcbiAgICAgKiBhbmQgaXQgY2xlYXJzIGFsbCBzdWdnZXN0ZWQgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NsZWFyU3VnZ2VzdGVkTG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3RlZExvY2F0aW9ucyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWdnZXN0ZWRDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2xpY2snIG9uIG1hcFxuICAgICAqIGFuZCBpdCBoaWRlcyBzdWdnZXN0ZWQgbG9jYXRpb25zXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2hpZGVTdWdnZXN0ZWRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJ2NsaWNrJyBvbiBsYWJlbCBpbnB1dFxuICAgICAqIGFuZCBpdCBkaXNwbGF5cyBzdWdnZXN0ZWQgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2Rpc3BsYXlTdWdnZXN0ZWRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaFN1Ym1pdCgpXG4gICAgICogYW5kIGl0IGNsZWFycyBhbGwgZ2VvY29kZWQgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NsZWFyR2VvY29kZWRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZ2VvY29kZWRMb2NhdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5fZ2VvY29kZWRDb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBTZWFyY2hFbmdpbmU7XG59KENvbnRyb2wpKTtcblxuZXhwb3J0IGRlZmF1bHQgU2VhcmNoRW5naW5lO1xuXG4vLyBFeHBvc2UgU2VhcmNoRW5naW5lIGFzIG9sLmNvbnRyb2wuU2VhcmNoRW5naW5lIChmb3IgYSBidWlsZCBidW5kbGUpXG5pZiAod2luZG93Lm9sICYmIHdpbmRvdy5vbC5jb250cm9sKSB7XG4gICAgd2luZG93Lm9sLmNvbnRyb2wuU2VhcmNoRW5naW5lID0gU2VhcmNoRW5naW5lO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/SearchEngine.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSS_Controls_SearchEngine_GPsearchEngineOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CSS/Controls/SearchEngine/GPsearchEngineOpenLayers.css */ \"./src/OpenLayers/CSS/Controls/SearchEngine/GPsearchEngineOpenLayers.css\");\n/* harmony import */ var _CSS_Controls_SearchEngine_GPsearchEngineOpenLayers_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_SearchEngine_GPsearchEngineOpenLayers_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ol/control/Control */ \"ol/control/Control\");\n/* harmony import */ var ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ol_control_Control__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ol_Overlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ol/Overlay */ \"ol/Overlay\");\n/* harmony import */ var ol_Overlay__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ol_Overlay__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var ol_proj__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ol/proj */ \"ol/proj\");\n/* harmony import */ var ol_proj__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(ol_proj__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! geoportal-access-lib */ \"./node_modules/geoportal-access-lib/src/Gp.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Utils_Markers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Utils/Markers */ \"./src/OpenLayers/Controls/Utils/Markers.js\");\n/* harmony import */ var _Utils_Interactions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Utils/Interactions */ \"./src/OpenLayers/Controls/Utils/Interactions.js\");\n/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Common/Utils/SelectorID */ \"./src/Common/Utils/SelectorID.js\");\n/* harmony import */ var _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Common/Utils/SearchEngineUtils */ \"./src/Common/Utils/SearchEngineUtils.js\");\n/* harmony import */ var _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Common/Utils/GeocodeUtils */ \"./src/Common/Utils/GeocodeUtils.js\");\n/* harmony import */ var _Common_Controls_SearchEngineDOM__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Common/Controls/SearchEngineDOM */ \"./src/Common/Controls/SearchEngineDOM.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n// import CSS\n\n// import OpenLayers\n\n\n\n// import geoportal library access\n\n// import local\n\n\n\n\n\n\n\n// DOM\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getLogger(\"searchengine\");\n\n/**\n * @classdesc\n * SearchEngine control\n *\n * @constructor\n * @extends {ol.control.Control}\n * @type {ol.control.SearchEngine}\n * @alias ol.control.SearchEngine\n * @param {Object} options - control options\n * @param {String} [options.apiKey] - API key. The key \"calcul\" is used by default.\n * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)\n * @param {Boolean} [options.collapsed = true] - collapse mode, true by default\n * Value possible : auto or zoom level.\n * Possible to overload it with a function :\n * zoomTo : function (info) {\n * // do some stuff...\n * return zoom;\n * }\n * @param {String} [options.placeholder] - Placeholder in search bar. Default is \"Rechercher un lieu, une adresse\".\n * @param {Boolean} [options.displayMarker = true] - set a marker on search result, defaults to true.\n * @param {String} [options.markerStyle = \"lightOrange\"] - Marker style. Currently possible values are \"lightOrange\" (default value), \"darkOrange\", \"red\" and \"turquoiseBlue\".\n * @param {Boolean} [options.displayAdvancedSearch = true] - False to disable advanced search tools (it will not be displayed). Default is true (displayed)\n * @param {Object} [options.advancedSearch] - advanced search options for geocoding (filters). Properties can be found among geocode options.filterOptions (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode})\n * @param {Object} [options.resources] - resources to be used by geocode and autocompletion services :\n * @param {String} [options.resources.geocode] - resources geocoding, by default : \"location\"\n * @param {Array} [options.resources.autocomplete] - resources autocompletion, by default : [\"PositionOfInterest\", \"StreetAddress\"]\n * @param {Boolean} [options.displayAdvancedSearch = true] - False to disable advanced search tools (it will not be displayed). Default is true (displayed)\n * @param {Object} [options.advancedSearch] - advanced search options for geocoding (filters). Properties can be found among geocode options.filterOptions (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode})\n * @param {Object} [options.geocodeOptions = {}] - options of geocode service (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode})\n * @param {Object} [options.autocompleteOptions = {}] - options of autocomplete service (see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete Gp.Services.autoComplete}\n * @param {Object} [options.autocompleteOptions.serviceOptions] - options of autocomplete service\n * @param {Boolean} [options.autocompleteOptions.triggerGeocode = false] - trigger a geocoding request if the autocompletion does not return any suggestions, false by default\n * @param {Number} [options.autocompleteOptions.triggerDelay = 1000] - waiting time before sending the geocoding request, 1000ms by default\n * @param {Sting|Numeric|Function} [options.zoomTo] - zoom to results, by default, current zoom.\n * @fires searchengine:autocomplete:click\n * @fires searchengine:geocode:click\n * @example\n * var SearchEngine = ol.control.SearchEngine({\n * apiKey : \"CLEAPI\",\n * collapsed : true,\n * resources : {\n * geocode : [\"StreetAddress\", \"PositionOfInterest\"],\n * autocomplete : [\"StreetAddress\"]\n * },\n * advancedSearch : {\n * PositionOfInterest : [{name : \"municipality\", title : \"Ville\"}],\n * StreetAddress : [{...}]\n * },\n * geocodeOptions : {},\n * autocompleteOptions : {}\n * });\n *\n * SearchEngine.on(\"searchengine:autocomplete:click\", function (e) {\n * console.warn(\"autocomplete\", e.location);\n * });\n * SearchEngine.on(\"searchengine:geocode:click\", function (e) {\n * console.warn(\"geocode\", e.location);\n * });\n */\nvar SearchEngine = function (Control) {\n /**\n * See {@link ol.control.SearchEngine}\n * @module SearchEngine\n * @alias module:~Controls/SearchEngine\n * @param {*} options - options\n * @example\n * import SearchEngine from \"src/OpenLayers/Controls/SearchEngine\"\n */\n function SearchEngine(options) {\n options = options || {};\n if (!(this instanceof SearchEngine)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n\n // initialisation du composant\n this.initialize(options);\n\n // // Widget main DOM container\n this._container = this._initContainer();\n // info: le container sera complété lors de l'ajout à la carte (setMap), car certains composants nécessitent d'être liés à la map.\n this._containerElement = null;\n\n // on peut éventuellement encapsuler le composant dans une div passée par l'utilisateur\n if (options.element && options.element.appendChild) {\n // dans ce cas on stocke les deux container\n options.element.appendChild(this._container);\n this._containerElement = options.element;\n }\n\n // call ol.control.Control constructor\n Control.call(this, {\n element: this._containerElement || this._container,\n target: options.target,\n render: options.render\n });\n }\n ;\n\n // Inherits from ol.control.Control\n if (Control) SearchEngine.__proto__ = Control;\n\n /*\n * @lends module:SearchEngine\n */\n SearchEngine.prototype = Object.create(Control.prototype, {});\n\n // on récupère les méthodes de la classe commune IsoDOM\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(SearchEngine.prototype, _Common_Controls_SearchEngineDOM__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n\n /**\n * Constructor (alias)\n *\n * @private\n */\n SearchEngine.prototype.constructor = SearchEngine;\n\n // ################################################################### //\n // ##################### public methods ############################## //\n // ################################################################### //\n\n /**\n * Overwrite OpenLayers setMap method\n *\n * @param {ol.Map} map - Map.\n */\n SearchEngine.prototype.setMap = function (map) {\n if (!map) {\n this._clearResults();\n }\n\n // on appelle la méthode setMap originale d'OpenLayers\n Control.prototype.setMap.call(this, map);\n };\n\n /**\n * Returns true if widget is collapsed (minimized), false otherwise\n *\n * @returns {Boolean} collapsed - true if widget is collapsed\n */\n SearchEngine.prototype.getCollapsed = function () {\n return this.collapsed;\n };\n\n /**\n * Collapse or display widget main container\n *\n * @param {Boolean} collapsed - True to collapse widget, False to display it\n */\n SearchEngine.prototype.setCollapsed = function (collapsed) {\n if (collapsed === undefined) {\n logger.log(\"[ERROR] SearchEngine:setCollapsed - missing collapsed parameter\");\n return;\n }\n if (collapsed && this.collapsed || !collapsed && !this.collapsed) {\n return;\n }\n this._showSearchEngineInput.click();\n this.collapsed = collapsed;\n };\n\n /**\n * Get locations data from geocode service\n *\n * @returns {Object} data - locations\n */\n SearchEngine.prototype.getData = function () {\n return this._geocodedLocations;\n };\n // ################################################################### //\n // ##################### init component ############################## //\n // ################################################################### //\n\n /**\n * Initialize SearchEngine control (called by SearchEngine constructor)\n *\n * @param {Object} options - constructor options\n * @private\n */\n SearchEngine.prototype.initialize = function (options) {\n this._checkInputOptions(options);\n\n // define default options\n this.options = {\n collapsed: true,\n zoomTo: \"\",\n resources: {\n geocode: [],\n autocomplete: []\n },\n displayAdvancedSearch: true,\n advancedSearch: {},\n geocodeOptions: {\n serviceOptions: {}\n },\n autocompleteOptions: {\n serviceOptions: {},\n triggerGeocode: false,\n triggerDelay: 1000\n },\n displayMarker: true,\n markerStyle: \"lightOrange\",\n placeholder: \"Rechercher un lieu, une adresse\"\n };\n\n // merge with user options\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].mergeParams(this.options, options);\n if (this.options.resources.geocode === \"\") {\n this.options.resources.geocode = [\"PositionOfInterest\", \"StreetAddress\"];\n }\n if (this.options.resources.autocomplete.length === 0) {\n this.options.resources.autocomplete = [\"PositionOfInterest\", \"StreetAddress\"];\n }\n\n /** {Boolean} specify if searchEngine control is collapsed (true) or not (false) */\n this.collapsed = this.options.collapsed;\n\n // identifiant du contrôle : utile pour suffixer les identifiants CSS (pour gérer le cas où il y en a plusieurs dans la même page)\n this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__[\"default\"].generate();\n this._showSearchEngineInput = null;\n\n // container de l'input de recherche\n this._inputSearchContainer = null;\n\n // container des reponses de l'autocompletion\n this._autocompleteContainer = null;\n this._suggestedContainer = null;\n\n // listes des reponses de l'autocompletion\n this._suggestedLocations = [];\n\n // container des reponses du geocodage\n this._geocodedContainer = null;\n\n // liste des reponses du geocodage\n this._geocodedLocations = [];\n\n // container des filtres du geocodage\n this._filterContainer = null;\n\n // ressource de geocodage selectionnée pour le geocodage avancé\n this._currentGeocodingCode = null;\n\n // localisant */\n this._currentGeocodingLocation = null;\n\n // liste des filtres du geocodage pour le geocodage avancé\n this._advancedSearchFilters = {};\n this._initAdvancedSearchFilters();\n\n // liste des ressources du geocodage pour le geocodage avancé\n this._advancedSearchCodes = [];\n this._initAdvancedSearchCodes();\n\n // marker\n this._marker = null;\n\n // marker style\n var _markerStyle = this.options.markerStyle;\n this._markerUrl = Object.keys(_Utils_Markers__WEBPACK_IMPORTED_MODULE_7__[\"default\"]).indexOf(_markerStyle) === -1 ? _Utils_Markers__WEBPACK_IMPORTED_MODULE_7__[\"default\"][\"lightOrange\"] : _Utils_Markers__WEBPACK_IMPORTED_MODULE_7__[\"default\"][_markerStyle];\n\n // marker display\n this._displayMarker = this.options.displayMarker;\n\n // popup\n this._popupContent = null;\n this._popupDiv = this._initPopupDiv();\n this._popupOverlay = null;\n\n // trigger geocode\n this._triggerHandler = null;\n };\n\n /**\n * this method is called by this.initialize()\n * and makes sure input options are correctly formated\n *\n * @param {Object} options - options\n *\n * @private\n */\n SearchEngine.prototype._checkInputOptions = function (options) {\n var i;\n if (options.resources) {\n // on vérifie que resources est bien un objet\n if (_typeof(options.resources) === \"object\") {\n // ressources de geocodage\n var geocodeResources = options.resources.geocode;\n if (geocodeResources) {\n // on vérifie que la liste des ressources de geocodage est bien un tableau\n if (Array.isArray(geocodeResources)) {\n var geocodeResourcesList = [\"StreetAddress\", \"PositionOfInterest\", \"CadastralParcel\", \"Administratif\"];\n for (i = 0; i < geocodeResources.length; i++) {\n if (geocodeResourcesList.indexOf(geocodeResources[i]) === -1) {\n // si la resource n'est pas référencée, on l'enlève\n // geocodeResources.splice(i, 1);\n logger.log(\"[SearchEngine] options.resources.geocode : \" + geocodeResources[i] + \" is not a resource for geocode\");\n }\n }\n } else {\n logger.log(\"[SearchEngine] 'options.resources.geocode' parameter should be an array\");\n geocodeResources = null;\n }\n }\n\n // ressources d'autocompletion\n var autocompleteResources = options.resources.autocomplete;\n if (autocompleteResources) {\n // on vérifie que la liste des ressources d'autocompletion est bien un tableau\n if (Array.isArray(autocompleteResources)) {\n var autocompleteResourcesList = [\"StreetAddress\", \"PositionOfInterest\"];\n for (i = 0; i < autocompleteResources.length; i++) {\n if (autocompleteResourcesList.indexOf(autocompleteResources[i]) === -1) {\n // si la resource n'est pas référencée, on l'enlève\n // autocompleteResources.splice(i, 1);\n logger.log(\"[SearchEngine] options.resources.autocomplete : \" + autocompleteResources[i] + \" is not a resource for autocomplete\");\n }\n }\n } else {\n logger.log(\"[SearchEngine] 'options.resources.autocomplete' parameter should be an array\");\n autocompleteResources = null;\n }\n }\n } else {\n logger.log(\"[SearchEngine] 'resources' parameter should be an object\");\n options.resources = null;\n }\n }\n };\n\n /**\n * this method is called by this.initialize()\n * and initialize the geocoding resources titles.\n *\n * @private\n */\n SearchEngine.prototype._initAdvancedSearchCodes = function () {\n // INFORMATION\n // on y ajoute les filtres attributaires pour une table de ressources\n // selectionnée via un evenement (onchange) de la liste deroulante du\n // menu avancé du geocodage.\n // cf. onGeocodingAdvancedSearchCodeChange() pour la selection de la\n // ressource de geocodage à afficher\n\n var geocodeResources = this.options.resources.geocode;\n if (geocodeResources === \"location\") {\n geocodeResources = [\"PositionOfInterest\", \"StreetAddress\", \"CadastralParcel\"];\n }\n if (!Array.isArray(geocodeResources)) {\n geocodeResources = [geocodeResources];\n }\n for (var i = 0; i < geocodeResources.length; i++) {\n switch (geocodeResources[i]) {\n case \"PositionOfInterest\":\n this._advancedSearchCodes.push({\n id: \"PositionOfInterest\",\n title: \"Lieux/toponymes\"\n });\n break;\n case \"StreetAddress\":\n this._advancedSearchCodes.push({\n id: \"StreetAddress\",\n title: \"Adresses\"\n });\n break;\n case \"CadastralParcel\":\n this._advancedSearchCodes.push({\n id: \"CadastralParcel\",\n title: \"Parcelles cadastrales\"\n });\n break;\n default:\n break;\n }\n }\n // par défaut, au cas où aucune ressource passée en option ne correspond à celles attendues\n if (this._advancedSearchCodes.length === 0) {\n this._advancedSearchCodes = [{\n id: \"StreetAddress\",\n title: \"Adresses\"\n }, {\n id: \"PositionOfInterest\",\n title: \"Lieux/toponymes\"\n }, {\n id: \"CadastralParcel\",\n title: \"Cadastre\"\n }];\n }\n logger.log(\"advancedSearchCodes\", this._advancedSearchCodes);\n };\n\n /**\n * this method is called by this.onAdd()\n * and initialize the advanced geocoding filters.\n *\n * @private\n */\n SearchEngine.prototype._initAdvancedSearchFilters = function () {\n // liste des filtres par defauts pour toutes les ressources\n this._advancedSearchFilters = _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_10__[\"default\"].advancedSearchFiltersByDefault;\n\n // on merge les options avancées avec celles par defaut\n var advancedSearchFiltersCustom = this.options.advancedSearch;\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(this._advancedSearchFilters, advancedSearchFiltersCustom);\n logger.log(\"advancedSearchFilters\", this._advancedSearchFilters);\n };\n\n /**\n * this method is called by this.initialize() and initialize popup div\n * (to display results information on marker click)\n *\n * @return {Object} element - DOM element for popup\n * @private\n */\n SearchEngine.prototype._initPopupDiv = function () {\n var context = this;\n var element = document.createElement(\"div\");\n element.className = \"gp-feature-info-div\";\n var closer = document.createElement(\"input\");\n closer.type = \"button\";\n closer.className = \"gp-styling-button closer\";\n // on closer click : remove popup\n closer.onclick = function () {\n if (context._popupOverlay != null) {\n context._popupOverlay.setPosition(undefined);\n }\n return false;\n };\n this._popupContent = document.createElement(\"div\");\n this._popupContent.className = \"gp-features-content-div\";\n this._popupContent.style[\"min-width\"] = \"200px\";\n element.appendChild(this._popupContent);\n element.appendChild(closer);\n return element;\n };\n\n // ################################################################### //\n // ######################## DOM initialize ########################### //\n // ################################################################### //\n\n /**\n * Create control main container\n *\n * @returns {DOMElement} DOM element\n *\n * @private\n */\n SearchEngine.prototype._initContainer = function () {\n // create main container\n var container = this._createMainContainerElement();\n\n // create show search engine element\n var inputShow = this._showSearchEngineInput = this._createShowSearchEngineElement();\n container.appendChild(inputShow);\n\n // mode \"collapsed\"\n if (!this.options.collapsed) {\n inputShow.checked = true;\n }\n\n // create search engine picto\n var picto = this._createShowSearchEnginePictoElement();\n container.appendChild(picto);\n var search = this._inputSearchContainer = this._createSearchInputElement(this.options.placeholder);\n var context = this;\n if (search.addEventListener) {\n search.addEventListener(\"click\", function () {\n context.onAutoCompleteInputClick();\n });\n } else if (search.attachEvent) {\n search.attachEvent(\"onclick\", function () {\n context.onAutoCompleteInputClick();\n });\n }\n container.appendChild(search);\n if (this.options.displayAdvancedSearch) {\n var advancedShow = this._createShowAdvancedSearchElement();\n container.appendChild(advancedShow);\n\n // INFO je decompose les appels car j'ai besoin de recuperer le container\n // des filtres\n var advancedPanel = this._createAdvancedSearchPanelElement();\n var advancedHeader = this._createAdvancedSearchPanelHeaderElement();\n var advancedForm = this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes);\n var advancedFormFilters = this._filterContainer = this._createAdvancedSearchFormFiltersElement();\n this._setFilter(this._advancedSearchCodes[0].id); // ex \"PositionOfInterest\"\n var advancedFormInput = this._createAdvancedSearchFormInputElement();\n advancedForm.appendChild(advancedFormFilters);\n advancedForm.appendChild(advancedFormInput);\n advancedPanel.appendChild(advancedHeader);\n advancedPanel.appendChild(advancedForm);\n container.appendChild(advancedPanel);\n }\n\n // INFO je decompose les appels car j'ai besoin de recuperer le container\n // des resultats de l'autocompletion\n var autocomplete = this._autocompleteContainer = this._createAutoCompleteElement();\n var autocompleteList = this._suggestedContainer = this._createAutoCompleteListElement();\n autocomplete.appendChild(autocompleteList);\n container.appendChild(autocomplete);\n\n // INFO je decompose les appels car j'ai besoin de recuperer le container\n // des resultats du geocodage\n var geocode = this._createGeocodeResultsElement();\n var geocodeList = this._geocodedContainer = this._createGeocodeResultsListElement();\n geocode.appendChild(geocodeList);\n container.appendChild(geocode);\n return container;\n };\n\n /**\n * this method is called by :\n * - this._initContainer() : ...\n * - this.onGeocodingAdvancedSearchCodeChoice() : ...\n * and initialize or create the filters container HTMLElement\n * to the geocoding advanced menu.\n *\n * @param {String} code - resource geocoding name\n *\n * @returns {DOMElement} DOM element\n * @private\n */\n SearchEngine.prototype._setFilter = function (code) {\n // INFORMATION\n // Nous avons 2 solutions possibles pour la mise en place des filtres.\n // 1. Soit on decide de creer tous les filtres pour chaque ressource\n // de geocodage à l'initialisation du composant, et on joue sur le\n // mode 'hidden' pour n'afficher que la ressource selectionnée.\n // 2. Soit on decide de creer à chaque fois les filtres pour la\n // ressource selectionnée.\n // Chaque solution a ses inconvenients/avantages.\n // Implementation du choix 2 car elle offre plus de souplesse pour\n // recuperer les 'form-data'...\n\n var container = this._filterContainer;\n var codeFound = false;\n for (var i = 0; i < this._advancedSearchCodes.length; i++) {\n if (this._advancedSearchCodes[i].id === code) {\n codeFound = true;\n break;\n }\n }\n if (!codeFound) {\n // cette ressource n'est pas disponible,\n // on supprime les anciens enfants...\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n return;\n }\n\n // on sauvegarde la ressource de geocodage sélectionnée\n this._currentGeocodingCode = code;\n\n // on supprime les enfants...\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n var lstAttributs = this._advancedSearchFilters[code];\n if (!lstAttributs || lstAttributs.length === 0) {\n // cette ressource n'est pas parametrable\n return;\n }\n var divTable = this._createAdvancedSearchFiltersTableElement(code, true);\n for (var j = 0; j < lstAttributs.length; j++) {\n var divFilter = this._createAdvancedSearchFiltersAttributElement(lstAttributs[j]);\n divTable.appendChild(divFilter);\n }\n container.appendChild(divTable);\n return container;\n };\n\n // ################################################################### //\n // ################ methods to request and results ################### //\n // ################################################################### //\n\n /**\n * this method is called by this.onAutoCompleteSearch()\n * and executes a request to the service.\n *\n * @param {Object} settings - service settings\n * @param {String} settings.text - text\n * @param {Function} settings.onSuccess - callback\n * @param {Function} settings.onFailure - callback\n * @private\n */\n SearchEngine.prototype._requestAutoComplete = function (settings) {\n // on ne fait pas de requête si on n'a pas renseigné de parametres !\n if (!settings || _typeof(settings) === \"object\" && Object.keys(settings).length === 0) {\n return;\n }\n\n // on ne fait pas de requête si la parametre 'text' est vide !\n if (!settings.text) {\n return;\n }\n logger.log(settings);\n var options = {};\n // on recupere les options du service\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, this.options.autocompleteOptions.serviceOptions);\n // ainsi que la recherche et les callbacks\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, settings);\n\n // on ajoute le paramètre filterOptions.type spécifiant les ressources.\n var resources = this.options.resources.autocomplete;\n if (resources && Array.isArray(resources)) {\n // il se peut que l'utilisateur ait surchargé ce paramètre dans geocodeOptions,\n if (!options.type) {\n options.type = resources;\n }\n }\n\n // cas où la clef API n'est pas renseignée dans les options du service,\n // on utilise celle renseignée au niveau du controle ou la clé \"calcul\" par défaut.\n options.apiKey = options.apiKey || this.options.apiKey;\n\n // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert\n // true par défaut (https)\n if (typeof options.ssl !== \"boolean\") {\n if (typeof this.options.ssl === \"boolean\") {\n options.ssl = this.options.ssl;\n } else {\n options.ssl = true;\n }\n }\n logger.log(options);\n geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Services.autoComplete(options);\n };\n\n /**\n * this method is called by this.onAutoCompleteSearchText() (case of success)\n * and fills the container of the location list.\n * it creates a HTML Element per location\n *\n * @param {Array} locations - Array of Gp.Services.AutoComplete.SuggestedLocation corresponding to autocomplete results list\n * @private\n */\n SearchEngine.prototype._fillAutoCompletedLocationListContainer = function (locations) {\n if (!locations || locations.length === 0) {\n return;\n }\n\n // on vide la liste avant de la construire\n var element = this._suggestedContainer;\n if (element.childElementCount) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n }\n this._displaySuggestedLocation();\n for (var i = 0; i < locations.length; i++) {\n // Proposals are dynamically filled in Javascript by autocomplete service\n this._createAutoCompletedLocationElement(locations[i], i);\n }\n };\n\n /**\n * this method is called by this.onAutoCompleteSearch()\n * and executes a request to the service.\n *\n * @param {Object} settings - service settings\n * @param {String} settings.location - text\n * @param {Function} settings.onSuccess - callback\n * @param {Function} settings.onFailure - callback\n * @private\n */\n SearchEngine.prototype._requestGeocoding = function (settings) {\n // on ne fait pas de requête si on n'a pas renseigné de parametres !\n if (!settings || _typeof(settings) === \"object\" && Object.keys(settings).length === 0) {\n return;\n }\n\n // on ne fait pas de requête si la parametre 'text' est vide !\n if (settings.query === null) {\n return;\n }\n logger.log(settings);\n var options = {};\n // on recupere les options du service\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, this.options.geocodeOptions.serviceOptions);\n // ainsi que la recherche et les callbacks\n _Common_Utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"].assign(options, settings);\n // on redefinie les callbacks si les callbacks de service existent\n var self = this;\n var bOnFailure = !!(this.options.geocodeOptions.serviceOptions.onFailure !== null && typeof this.options.geocodeOptions.serviceOptions.onFailure === \"function\"); // cast variable to boolean\n var bOnSuccess = !!(this.options.geocodeOptions.serviceOptions.onSuccess !== null && typeof this.options.geocodeOptions.serviceOptions.onSuccess === \"function\");\n if (bOnSuccess) {\n var cbOnSuccess = function cbOnSuccess(e) {\n settings.onSuccess.call(self, e);\n self.options.geocodeOptions.serviceOptions.onSuccess.call(self, e);\n };\n options.onSuccess = cbOnSuccess;\n }\n if (bOnFailure) {\n var cbOnFailure = function cbOnFailure(e) {\n settings.onFailure.call(self, e);\n self.options.geocodeOptions.serviceOptions.onFailure.call(self, e);\n };\n options.onFailure = cbOnFailure;\n }\n\n // on ajoute le paramètre index spécifiant les ressources.\n var resources = this.options.resources.geocode;\n if (resources) {\n // il se peut que l'utilisateur ait surchargé ce paramètre dans geocodeOptions,\n // ou qu'il ait déjà été rempli (cas de la recherche avancée)\n if (!options.index) {\n options.index = resources;\n }\n }\n\n // cas où la clef API n'est pas renseignée dans les options du service,\n // on utilise celle renseignée au niveau du controle ou la clé \"calcul\" par défaut\n options.apiKey = options.apiKey || this.options.apiKey;\n\n // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert\n // true par défaut (https)\n if (typeof options.ssl !== \"boolean\") {\n if (typeof this.options.ssl === \"boolean\") {\n options.ssl = this.options.ssl;\n } else {\n options.ssl = true;\n }\n }\n logger.log(options);\n geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Services.geocode(options);\n };\n\n /**\n * this method is called by this.onGeocodingSearch()\n * and fills the container of the location results.\n * it creates a HTML Element per location\n * (cf. this. ...)\n *\n * @param {Object[]} locations - locations\n *\n * @private\n */\n SearchEngine.prototype._fillGeocodedLocationListContainer = function (locations) {\n if (!locations || locations.length === 0) {\n this._clearGeocodedLocation();\n return;\n }\n\n // on vide la liste avant de la construire\n var element = this._geocodedContainer;\n if (element.childElementCount) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n }\n for (var i = 0; i < locations.length; i++) {\n logger.log(locations[i]);\n // Proposals are dynamically filled in Javascript by autocomplete service\n this._createGeocodedLocationElement(locations[i], i);\n }\n\n // sauvegarde de l'etat des locations\n this._geocodedLocations = locations;\n };\n\n // ################################################################### //\n // ######################### other methods ########################### //\n // ################################################################### //\n\n /**\n * this sends the label to the panel.\n *\n * @param {String} label - label suggested location\n * @private\n */\n SearchEngine.prototype._setLabel = function (label) {\n document.getElementById(\"GPsearchInputText-\" + this._uid).value = label;\n };\n\n /**\n * this method is called by this.on*ResultsItemClick()\n * and move/zoom on a position.\n *\n * @param {Array} position - ol.Coordinate object [lon, lat] (en lat/lon : \"EPSG:4326\")\n * @param {Number} zoom - zoom level\n * @private\n */\n SearchEngine.prototype._setPosition = function (position, zoom) {\n var view = this.getMap().getView();\n view.setCenter(position);\n view.setZoom(zoom);\n };\n\n /**\n * this method is called by this.on*ResultsItemClick()\n * and displays a marker.\n * FIXME\n *\n * @param {Array} position - ol.Coordinate object [lon, lat] ou [x, y]\n * @param {Object} info - location information\n * @private\n */\n SearchEngine.prototype._setMarker = function (position, info) {\n var map = this.getMap();\n var context = this;\n\n // remove previous markers\n if (this._marker != null) {\n map.removeOverlay(this._marker);\n this._marker = null;\n }\n if (position) {\n // création de l'élément DOM\n var markerDiv = document.createElement(\"img\");\n markerDiv.src = this._markerUrl;\n\n // ajout de l'évènement onclick (pour afficher une popup)\n if (markerDiv.addEventListener) {\n markerDiv.addEventListener(\"click\", function () {\n context._onResultMarkerSelect(info);\n });\n } else if (markerDiv.attachEvent) {\n // Internet Explorer\n markerDiv.attachEvent(\"onclick\", function () {\n context._onResultMarkerSelect(info);\n });\n }\n\n // création du marker (overlay)\n this._marker = new ol_Overlay__WEBPACK_IMPORTED_MODULE_2___default.a({\n position: position,\n offset: [-25.5, -38],\n element: markerDiv,\n stopEvent: false\n });\n map.addOverlay(this._marker);\n }\n };\n\n /**\n * this method is called by this.on*ResultsItemClick()\n * and get zoom to results.\n *\n * @param {Object} info - info\n *\n * @returns {Integer} zoom\n * @private\n */\n SearchEngine.prototype._getZoom = function (info) {\n var map = this.getMap();\n var key = this.options.zoomTo;\n var zoom = null;\n\n // les valeurs du zooms sont determinées\n // soit par les mots clefs suivants : max, min ou auto\n // soit par un niveau de zoom\n // soit defini par l'utilisateur via une fonction\n\n if (typeof key === \"function\") {\n logger.trace(\"zoom function\");\n zoom = key.call(this, info);\n }\n if (typeof key === \"number\") {\n logger.trace(\"zoom level\");\n zoom = key;\n }\n if (typeof key === \"string\") {\n // if (key === \"max\") {\n // zoom = map.getMaxZoom();\n // } else if (key === \"min\") {\n // zoom = map.getMinZoom();\n // } else\n\n if (key === \"auto\") {\n logger.trace(\"zoom auto\");\n zoom = _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_10__[\"default\"].zoomToResultsByDefault(info);\n } else {\n logger.trace(\"zoom level parsing\");\n var value = parseInt(key, 10);\n if (!isNaN(value)) {\n logger.trace(\"zoom parsing\");\n zoom = value;\n }\n }\n }\n\n // polyfill IE\n Number.isInteger = Number.isInteger || function (value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n };\n\n // test de validité du zoom,\n // on prend le zoom courant par defaut ...\n if (!zoom || zoom === \"\" || !Number.isInteger(zoom)) {\n logger.trace(\"zoom not found, current zoom...\");\n zoom = map.getView().getZoom();\n }\n\n // FIXME test si le zoom est dans l'espace de la carte\n var min = map.minZoom; // .getMinZoom();\n var max = map.maxZoom; // .getMaxZoom();\n if (zoom < min) {\n logger.trace(\"zoom level min...\");\n zoom = min;\n }\n if (zoom > max) {\n logger.trace(\"zoom level max...\");\n zoom = max;\n }\n logger.trace(\"zoom\", zoom);\n return zoom;\n };\n\n /**\n * this method is called on 'click' on this._marker\n * (cf. this._setMarker() )\n * and sets a popup with marker information\n *\n * @param {Object} information - location information\n * @private\n */\n SearchEngine.prototype._onResultMarkerSelect = function (information) {\n var map = this.getMap();\n var popupContent = \"\";\n if (typeof information !== \"string\") {\n if (information.service === \"GeocodedLocation\") {\n popupContent = \"
    \";\n var attributes = information.location.placeAttributes;\n for (var attr in attributes) {\n if (attributes.hasOwnProperty(attr)) {\n if (attr !== \"trueGeometry\" && attr !== \"extraFields\" && attr !== \"houseNumberInfos\" && attr !== \"_count\") {\n popupContent += \"
  • \";\n popupContent += \"\" + attr.toUpperCase() + \" : \";\n popupContent += attributes[attr];\n popupContent += \"
  • \";\n }\n }\n }\n popupContent += \"
\";\n } else if (information.service === \"SuggestedLocation\") {\n popupContent = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getSuggestedLocationFreeform(information.location);\n } else {\n popupContent = \"sans informations.\";\n }\n } else {\n popupContent = information;\n }\n this._popupContent.innerHTML = popupContent;\n if (!this._popupOverlay) {\n // ajout de la popup a la carte comme un overlay\n this._popupOverlay = new ol_Overlay__WEBPACK_IMPORTED_MODULE_2___default.a({\n element: this._popupDiv,\n positioning: \"bottom-center\",\n position: this._marker.getPosition(),\n offset: [0, -42]\n });\n map.addOverlay(this._popupOverlay);\n } else {\n // si l'overlay est déjà créé, on modifie juste sa position\n this._popupOverlay.setPosition(this._marker.getPosition());\n }\n };\n\n // ################################################################### //\n // ###################### other handlers events ###################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'click' on 'GPshowSearchEnginePicto' tag label\n * (cf. this._createShowSearchEnginePictoElement), and it cleans the component\n * when it's closed.\n *\n * @private\n */\n SearchEngine.prototype.onShowSearchEngineClick = function () {\n var map = this.getMap();\n // on supprime toutes les interactions\n _Utils_Interactions__WEBPACK_IMPORTED_MODULE_8__[\"default\"].unset(map);\n this.collapsed = this._showSearchEngineInput.checked;\n // on génère nous même l'evenement OpenLayers de changement de propriété\n // (utiliser ol.control.SearchEngine.on(\"change:collapsed\", function ) pour s'abonner à cet évènement)\n this.dispatchEvent(\"change:collapsed\");\n };\n\n /**\n * this method is called by event 'click' on 'GPsearchInputReset' tag div\n * (cf. this._createSearchInputElement), and it cleans the value of input.\n *\n * @private\n */\n SearchEngine.prototype.onSearchResetClick = function () {\n this._clearResults();\n };\n\n // ################################################################### //\n // ################## handlers events AutoComplete ################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'click' on 'GPlocationOrigin' input\n *\n * @private\n */\n SearchEngine.prototype.onAutoCompleteInputClick = function () {\n var inputSearchTextContainer = document.getElementById(\"GPsearchInputText-\" + this._uid);\n if (inputSearchTextContainer && !inputSearchTextContainer.disabled && inputSearchTextContainer.value.length > 2) {\n this._displaySuggestedLocation();\n }\n };\n\n /**\n * this method is called by event 'keyup' on 'GPsearchInputText' tag input\n * (cf. this._createSearchInputElement), and it gets the value of input.\n * this value is passed as a parameter for the service autocomplete (text).\n * the results of the request are displayed into a drop down menu.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onAutoCompleteSearchText = function (e) {\n var value = e.target.value;\n if (!value) {\n return;\n }\n\n // on sauvegarde le localisant\n this._currentGeocodingLocation = value;\n\n // on limite les requêtes à partir de 3 car. saisie !\n if (value.length < 3) {\n this._clearSuggestedLocation();\n return;\n }\n var _triggerGeocode = this.options.autocompleteOptions.triggerGeocode;\n var _triggerDelay = this.options.autocompleteOptions.triggerDelay;\n\n // INFORMATION\n // on effectue la requête au service d'autocompletion.\n // on met en place des callbacks afin de recuperer les resultats ou\n // les messages d'erreurs du service.\n // les resultats sont affichés dans une liste deroulante.\n var context = this;\n this._requestAutoComplete({\n text: value,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(\"request from AutoComplete\", results);\n if (results) {\n // on sauvegarde l'etat des résultats\n context._suggestedLocations = results.suggestedLocations;\n context._locationsToBeDisplayed = [];\n // on vérifie qu'on n'a pas récupéré des coordonnées nulles (par ex recherche par code postal)\n for (var i = 0; i < context._suggestedLocations.length; i++) {\n var ilocation = context._suggestedLocations[i];\n if (ilocation.position && ilocation.position.x === 0 && ilocation.position.y === 0 && ilocation.fullText) {\n // si les coordonnées sont nulles, il faut relancer une requête de géocodage avec l'attribut \"fullText\" récupéré\n context._getGeocodeCoordinatesFromFullText(ilocation, i);\n } else {\n // sinon on peut afficher normalement le résultat dans la liste\n context._locationsToBeDisplayed.push(ilocation);\n }\n }\n ;\n // on affiche les résultats qui n'ont pas des coordonnées nulles\n context._fillAutoCompletedLocationListContainer(context._locationsToBeDisplayed);\n // on annule eventuellement une requete de geocodage en cours car on obtient des\n // de nouveau des resultats d'autocompletion...\n if (context._triggerHandler) {\n clearTimeout(context._triggerHandler);\n context._triggerHandler = null;\n logger.warn(\"Cancel a geocode request !\");\n }\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n // FIXME\n // où affiche t on les messages : ex. 'No suggestion matching the search' ?\n context._clearSuggestedLocation();\n logger.log(error.message);\n // on envoie une requete de geocodage si aucun resultat d'autocompletion\n // n'a été trouvé ! Et on n'oublie pas d'annuler celle qui est en cours !\n if (error.message === \"No suggestion matching the search\" && _triggerGeocode /* && value.length === 5 */) {\n if (context._triggerHandler) {\n clearTimeout(context._triggerHandler);\n logger.warn(\"Cancel the last geocode request !\");\n }\n context._triggerHandler = setTimeout(function () {\n logger.warn(\"Launch a geocode request (code postal) !\");\n context._requestGeocoding({\n location: value,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(\"request from Geocoding\", results);\n if (results) {\n context._locationsToBeDisplayed = [];\n // on modifie la structure des reponses pour être\n // compatible avec l'autocompletion !\n var locations = results.locations;\n for (var i = 0; i < locations.length; i++) {\n var location = locations[i];\n location.fullText = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getGeocodedLocationFreeform(location);\n location.position = {\n x: location.position.lon,\n y: location.position.lat\n };\n context._locationsToBeDisplayed.push(location);\n }\n context._fillAutoCompletedLocationListContainer(locations);\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n logger.log(error.message);\n }\n });\n }, _triggerDelay);\n }\n }\n });\n var map = this.getMap();\n map.on(\"click\", this._hideSuggestedLocation, this);\n map.on(\"pointerdrag\", this._hideSuggestedLocation, this);\n };\n\n /**\n * this method is called by Gp.Services.autoComplete callback in case of success\n * (cf. this.onAutoCompleteSearchText), for suggested locations with null coordinates\n * (case of postalCode research for instance).\n * Send a geocode request with suggested location 'fullText' attribute, to get its coordinates and display it in autocomplete results list container.\n *\n * @param {Gp.Services.AutoCompleteResponse.SuggestedLocation} suggestedLocation - autocompletion result (with null coordinates) to be geocoded\n * @param {Number} i - suggestedLocation position in Gp.Services.AutoCompleteResponse.suggestedLocations autocomplete results list\n * @private\n */\n SearchEngine.prototype._getGeocodeCoordinatesFromFullText = function (suggestedLocation, i) {\n var context = this;\n geoportal_access_lib__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Services.geocode({\n apiKey: this.options.apiKey,\n ssl: this.options.ssl,\n q: _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getSuggestedLocationFreeform(suggestedLocation),\n index: suggestedLocation.type,\n // callback onSuccess\n onSuccess: function onSuccess(response) {\n logger.log(\"request from Geocoding (coordinates null)\", response);\n if (response.locations && response.locations.length !== 0 && response.locations[0].position) {\n // on modifie les coordonnées du résultat en EPSG:4326 donc lat,lon\n /// \\TODO verifier si l'inversion des coordonnees est necessaire\n if (context._suggestedLocations && context._suggestedLocations[i]) {\n context._suggestedLocations[i].position = {\n lon: response.locations[0].position.y,\n lat: response.locations[0].position.x\n };\n // et on l'affiche dans la liste\n context._locationsToBeDisplayed.unshift(context._suggestedLocations[i]);\n context._fillAutoCompletedLocationListContainer(context._locationsToBeDisplayed);\n }\n }\n },\n // callback onFailure\n onFailure: function onFailure() {\n // si on n'a pas réussi à récupérer les coordonnées, on affiche quand même le résultat\n if (context._suggestedLocations && context._suggestedLocations[i]) {\n context._createAutoCompletedLocationElement(context._suggestedLocations[i], i);\n }\n }\n });\n };\n\n /**\n * this method is called by event 'click' on 'GPautoCompleteResultsList' tag div\n * (cf. this._createAutoCompleteListElement), and it selects the location.\n * this location displays a marker on the map.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onAutoCompletedResultsItemClick = function (e) {\n // TODO on souhaite un comportement different pour la selection des reponses\n // de l'autocompletion :\n // - liste deroulante des reponses,\n // - puis possibilité de cliquer sur une suggestion\n // - mais aussi de la choisir avec le clavier (arrow up/down), puis valider\n // par un return\n // cette selection avec les fleches doit mettre à jour le input !\n // (comme un moteur de recherche de navigateur)\n\n var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__[\"default\"].index(e.target.id);\n logger.log(idx);\n logger.log(this._locationsToBeDisplayed[idx]);\n if (!idx) {\n return;\n }\n var position = [this._locationsToBeDisplayed[idx].position.x, this._locationsToBeDisplayed[idx].position.y];\n var info = {\n service: \"SuggestedLocation\",\n location: this._locationsToBeDisplayed[idx]\n };\n\n // on ajoute le texte de l'autocomplétion dans l'input\n var label = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getSuggestedLocationFreeform(this._locationsToBeDisplayed[idx]);\n this._setLabel(label);\n\n // on sauvegarde le localisant\n this._currentGeocodingLocation = label;\n\n // Info : la position est en EPSG:4326, à transformer dans la projection de la carte\n var view = this.getMap().getView();\n var mapProj = view.getProjection().getCode();\n if (mapProj !== \"EPSG:4326\") {\n // on retransforme les coordonnées de la position dans la projection de la carte\n position = Object(ol_proj__WEBPACK_IMPORTED_MODULE_3__[\"transform\"])(position, \"EPSG:4326\", mapProj);\n }\n // on centre la vue et positionne le marker, à la position reprojetée dans la projection de la carte\n var zoom = this._getZoom(info);\n this._setPosition(position, zoom);\n if (this._displayMarker) {\n this._setMarker(position, info);\n }\n /**\n * event triggered when an element of the results is clicked for autocompletion\n *\n * @event searchengine:autocomplete:click\n * @property {Object} type - event\n * @property {Object} location - location\n * @property {Object} target - instance SearchEngine\n * @example\n * SearchEngine.on(\"searchengine:autocomplete:click\", function (e) {\n * console.log(e.location);\n * })\n */\n this.dispatchEvent({\n type: \"searchengine:autocomplete:click\",\n location: this._locationsToBeDisplayed[idx]\n });\n };\n\n // ################################################################### //\n // ################### handlers events Geocode ####################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'submit' on 'GPsearchInput' tag form\n * (cf. this._createSearchInputElement), and it gets the value of input.\n * this value is passed as a parameter for the service geocoding.\n * the results of the request are displayed into a window.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onGeocodingSearchSubmit = function (e) {\n var value = e.target[0].value;\n if (!value) {\n return;\n }\n\n // on sauvegarde le localisant\n this._currentGeocodingLocation = value;\n\n // on met en place l'affichage des resultats dans une fenetre de recherche.\n var context = this;\n this._requestGeocoding({\n query: value,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(\"request from Geocoding\", results);\n if (results) {\n var locations = results.locations;\n context._fillGeocodedLocationListContainer(locations);\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n // FIXME cf. this.onAutoCompleteSearch()\n context._clearGeocodedLocation();\n logger.log(error.message);\n }\n });\n };\n\n /**\n * this method is called by event 'submit' on 'GPgeocodeResultsList' tag div\n * (cf. this._createGeocodeResultsListElement), and it selects the location.\n * this location displays a marker on the map.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onGeocodedResultsItemClick = function (e) {\n var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_9__[\"default\"].index(e.target.id);\n if (!idx) {\n return;\n }\n var position = [this._geocodedLocations[idx].position.lon, this._geocodedLocations[idx].position.lat];\n var info = {\n service: \"GeocodedLocation\",\n location: this._geocodedLocations[idx]\n };\n\n // on ajoute le texte du géocodage dans l'input\n var label = _Common_Utils_GeocodeUtils__WEBPACK_IMPORTED_MODULE_11__[\"default\"].getGeocodedLocationFreeform(this._geocodedLocations[idx]);\n this._setLabel(label);\n\n // Info : la position est en EPSG:4326, à transformer dans la projection de la carte\n var view = this.getMap().getView();\n var mapProj = view.getProjection().getCode();\n if (mapProj !== \"EPSG:4326\") {\n // on retransforme les coordonnées de la position dans la projection de la carte\n position = Object(ol_proj__WEBPACK_IMPORTED_MODULE_3__[\"transform\"])(position, \"EPSG:4326\", mapProj);\n }\n // on centre la vue et positionne le marker, à la position reprojetée dans la projection de la carte\n var zoom = this._getZoom(info);\n this._setPosition(position, zoom);\n if (this._displayMarker) {\n this._setMarker(position, info);\n }\n /**\n * event triggered when an element of the results is clicked for geocoding\n *\n * @event searchengine:geocode:click\n * @property {Object} type - event\n * @property {Object} location - location\n * @property {Object} target - instance SearchEngine\n * @example\n * SearchEngine.on(\"searchengine:geocode:click\", function (e) {\n * console.log(e.location);\n * })\n */\n this.dispatchEvent({\n type: \"searchengine:geocode:click\",\n location: this._geocodedLocations[idx]\n });\n };\n\n // ################################################################### //\n // ############## handlers events Geocode Advanced ################### //\n // ################################################################### //\n\n /**\n * this method is called by event 'change' on 'GPadvancedSearchCode' tag select\n * (cf. this._createAdvancedSearchFormCodeElement), and it gets the value of\n * option selected.\n * this value is passed as a parameter to create the attributs container.\n *\n * @param {Object} e - HTMLElement\n * @private\n */\n SearchEngine.prototype.onGeocodingAdvancedSearchCodeChange = function (e) {\n logger.log(e);\n var idx = e.target.selectedIndex;\n var value = e.target.options[idx].value;\n if (!value) {\n return;\n }\n\n // INFORMATION\n // le declenchement de l'evenement va creer un container de filtre à la volée...\n // l'insertion des containers d'attributs dans le DOM sont :\n // - soit GPadvancedSearchFilters > PositionOfInterest\n // - soit GPadvancedSearchFilters > StreetAddress\n // - soit GPadvancedSearchFilters > CadastralParcel\n // cf. _setFilter() pour la creation du container\n\n this._setFilter(value);\n };\n\n /**\n * this method is called by event 'submit' on 'GPadvancedSearchForm' tag form\n * (cf. this._createAdvancedSearchPanelFormElement), and it gets the value of all input.\n * this value is passed as a parameter for the service geocoding.\n * the results of the request are displayed into a window.\n *\n * @param {Object} e - HTMLElement\n * @param {Array} data - [{key: ..., value: ...}]\n * @private\n */\n SearchEngine.prototype.onGeocodingAdvancedSearchSubmit = function (e, data) {\n logger.log(data);\n if (!data || data.length === 0) {\n return;\n }\n var _location;\n var _filterOptions = {};\n for (var i = 0; i < data.length; i++) {\n var filter = data[i];\n if (filter.value) {\n if (filter.key === \"section\") {\n filter.value = filter.value.toUpperCase();\n }\n _filterOptions[filter.key] = filter.value;\n }\n }\n var inputSearchTextContainer = document.getElementById(\"GPsearchInputText-\" + this._uid);\n _location = inputSearchTextContainer.value;\n\n // On ne prend pas en compte ce qu'il y a dans l'input de recherche simple pour la recherche avance de PC\n if (this._currentGeocodingCode === \"CadastralParcel\") {\n _location = \"\";\n }\n\n // on met en place l'affichage des resultats dans une fenetre de recherche.\n var context = this;\n this._requestGeocoding({\n query: _location,\n index: this._currentGeocodingCode,\n filters: _filterOptions,\n // callback onSuccess\n onSuccess: function onSuccess(results) {\n logger.log(results);\n if (results) {\n var locations = results.locations;\n context._fillGeocodedLocationListContainer(locations);\n }\n },\n // callback onFailure\n onFailure: function onFailure(error) {\n // FIXME cf. this.onAutoCompleteSearch()\n context._clearGeocodedLocation();\n logger.log(error.message);\n }\n });\n };\n\n /**\n * this method is called by 'onGeocodingAdvancedSearchSubmit' method,\n * in case geocoding type is 'CadastralParcel',\n * and gets request parameters from inputs\n *\n * @param {Object} filterOptions - object with inputs value (department, insee, ...)\n * @returns {String} location - cadastral parcel number : concatenation of inputs values (e.g. : 940670000D0041 or 94067_____0041)\n * @private\n */\n SearchEngine.prototype._getCadastralParcelRequestParams = function (filterOptions) {\n /* info:\n la parcelle cadastrale se compose de 14 chiffres ou lettres, indiquant, de gauche à droite :\n - le code du département (2 caractères)\n - le code commune (3 caractères). (Remarque : code département + code commune = code INSEE)\n - OU le code INSEE de la commune (5 chiffres) (remplace les 2 précédents)\n - le code commune absorbée INSEE, ou '000' (3 caractères),\n - la section (2 caractères),\n - le numéro de parcelle (4 caractères).\n Exemple de parcelle : '940670000D0041'. Si l'identifiant est incomplet (par exemple '940670000D'), le service renverra uniquement les 25 premiers résultats pouvant correspondre.\n */\n\n var _location = \"\";\n var l;\n // code département (2 caractères)\n var dep = filterOptions.department;\n if (dep) {\n l = dep.length;\n if (l === 2) {\n _location = dep;\n } else if (l === 1) {\n // si un seul numéro a été saisi, on présume que c'est un numéro < 10\n _location = \"0\" + dep;\n } else {\n _location = dep.substring(0, 2);\n }\n } else {\n _location = \"__\";\n }\n\n // code commune insee (3 caractères)\n var commune = filterOptions.commune;\n if (commune) {\n l = commune.length;\n if (l === 3) {\n _location += commune;\n } else if (l === 2) {\n _location += \"_\" + commune;\n } else if (l === 1) {\n _location += \"__\" + commune;\n } else {\n // l > 3\n _location += commune.substring(0, 3);\n }\n } else {\n _location += \"___\";\n }\n\n // code insee (5 caractères) : surcharge les 2 autres si renseigné\n var insee = filterOptions.insee;\n if (insee) {\n if (insee.length === 5) {\n _location = insee;\n }\n }\n\n // code commune absorbee INSEE (3 caractères)\n var absorbedCity = filterOptions.absorbedCity;\n if (absorbedCity) {\n l = absorbedCity.length;\n if (l === 3) {\n _location += absorbedCity;\n } else if (l < 3) {\n if (l === 2) {\n _location += \"_\" + absorbedCity;\n } else if (l === 1) {\n _location += \"__\" + absorbedCity;\n }\n } else {\n // l > 3\n _location += absorbedCity.substring(0, 3);\n }\n } else {\n _location += \"___\";\n }\n\n // section (2 caractères)\n var section = filterOptions.section;\n if (section) {\n l = section.length;\n if (l === 2) {\n _location += section;\n } else if (l === 1) {\n _location += \"_\" + section;\n } else {\n _location += section.substring(0, 2);\n }\n } else {\n _location += \"__\";\n }\n\n // numéro de parcelle (4 caractères)\n var number = filterOptions.number;\n if (number) {\n l = number.length;\n if (l === 4) {\n _location += number;\n } else if (l === 3) {\n _location += \"_\" + number;\n } else if (l === 2) {\n _location += \"__\" + number;\n } else if (l === 1) {\n _location += \"___\" + number;\n } else {\n // l > 4\n _location += number.substring(0, 4);\n }\n } else {\n _location += \"___\";\n }\n logger.log(\"location : \" + _location);\n return _location;\n };\n\n // ################################################################### //\n // ############################## clean ############################## //\n // ################################################################### //\n\n /**\n * this method is called by this.onSearchReset()\n * and it clears all results and the marker.\n *\n * @private\n */\n SearchEngine.prototype._clearResults = function () {\n var map = this.getMap();\n this._currentGeocodingLocation = null;\n this._clearSuggestedLocation();\n this._clearGeocodedLocation();\n this._setMarker();\n // on retire l'overlay de la popup de la carte\n if (this._popupOverlay != null) {\n map.removeOverlay(this._popupOverlay);\n this._popupOverlay = null;\n }\n };\n\n /**\n * this method is called by this.onAutoCompleteSearchText()\n * and it clears all suggested location.\n *\n * @private\n */\n SearchEngine.prototype._clearSuggestedLocation = function () {\n this._suggestedLocations = [];\n if (this._suggestedContainer) {\n while (this._suggestedContainer.firstChild) {\n this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);\n }\n }\n };\n\n /**\n * this method is called by event 'click' on map\n * and it hides suggested locations\n *\n * @private\n */\n SearchEngine.prototype._hideSuggestedLocation = function () {\n if (this._autocompleteContainer) {\n this._autocompleteContainer.style.display = \"none\";\n }\n };\n\n /**\n * this method is called by event 'click' on label input\n * and it displays suggested location.\n *\n * @private\n */\n SearchEngine.prototype._displaySuggestedLocation = function () {\n if (this._autocompleteContainer) {\n this._autocompleteContainer.style.display = \"block\";\n }\n };\n\n /**\n * this method is called by this.onGeocodingAdvancedSearchSubmit()\n * and it clears all geocoded location.\n *\n * @private\n */\n SearchEngine.prototype._clearGeocodedLocation = function () {\n this._geocodedLocations = [];\n if (this._geocodedContainer) {\n while (this._geocodedContainer.firstChild) {\n this._geocodedContainer.removeChild(this._geocodedContainer.firstChild);\n }\n }\n };\n return SearchEngine;\n}(ol_control_Control__WEBPACK_IMPORTED_MODULE_1___default.a);\n/* harmony default export */ __webpack_exports__[\"default\"] = (SearchEngine);\n\n// Expose SearchEngine as ol.control.SearchEngine (for a build bundle)\nif (window.ol && window.ol.control) {\n window.ol.control.SearchEngine = SearchEngine;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0NvbnRyb2xzL1NlYXJjaEVuZ2luZS5qcz8zNGMwIl0sIm5hbWVzIjpbImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsIlNlYXJjaEVuZ2luZSIsIkNvbnRyb2wiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwiaW5pdGlhbGl6ZSIsIl9jb250YWluZXIiLCJfaW5pdENvbnRhaW5lciIsIl9jb250YWluZXJFbGVtZW50IiwiZWxlbWVudCIsImFwcGVuZENoaWxkIiwiY2FsbCIsInRhcmdldCIsInJlbmRlciIsIl9fcHJvdG9fXyIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsIlV0aWxzIiwiYXNzaWduIiwiU2VhcmNoRW5naW5lRE9NIiwiY29uc3RydWN0b3IiLCJzZXRNYXAiLCJtYXAiLCJfY2xlYXJSZXN1bHRzIiwiZ2V0Q29sbGFwc2VkIiwiY29sbGFwc2VkIiwic2V0Q29sbGFwc2VkIiwidW5kZWZpbmVkIiwibG9nIiwiX3Nob3dTZWFyY2hFbmdpbmVJbnB1dCIsImNsaWNrIiwiZ2V0RGF0YSIsIl9nZW9jb2RlZExvY2F0aW9ucyIsIl9jaGVja0lucHV0T3B0aW9ucyIsInpvb21UbyIsInJlc291cmNlcyIsImdlb2NvZGUiLCJhdXRvY29tcGxldGUiLCJkaXNwbGF5QWR2YW5jZWRTZWFyY2giLCJhZHZhbmNlZFNlYXJjaCIsImdlb2NvZGVPcHRpb25zIiwic2VydmljZU9wdGlvbnMiLCJhdXRvY29tcGxldGVPcHRpb25zIiwidHJpZ2dlckdlb2NvZGUiLCJ0cmlnZ2VyRGVsYXkiLCJkaXNwbGF5TWFya2VyIiwibWFya2VyU3R5bGUiLCJwbGFjZWhvbGRlciIsIm1lcmdlUGFyYW1zIiwibGVuZ3RoIiwiX3VpZCIsIlNlbGVjdG9ySUQiLCJnZW5lcmF0ZSIsIl9pbnB1dFNlYXJjaENvbnRhaW5lciIsIl9hdXRvY29tcGxldGVDb250YWluZXIiLCJfc3VnZ2VzdGVkQ29udGFpbmVyIiwiX3N1Z2dlc3RlZExvY2F0aW9ucyIsIl9nZW9jb2RlZENvbnRhaW5lciIsIl9maWx0ZXJDb250YWluZXIiLCJfY3VycmVudEdlb2NvZGluZ0NvZGUiLCJfY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uIiwiX2FkdmFuY2VkU2VhcmNoRmlsdGVycyIsIl9pbml0QWR2YW5jZWRTZWFyY2hGaWx0ZXJzIiwiX2FkdmFuY2VkU2VhcmNoQ29kZXMiLCJfaW5pdEFkdmFuY2VkU2VhcmNoQ29kZXMiLCJfbWFya2VyIiwiX21hcmtlclN0eWxlIiwiX21hcmtlclVybCIsImtleXMiLCJNYXJrZXJzIiwiaW5kZXhPZiIsIl9kaXNwbGF5TWFya2VyIiwiX3BvcHVwQ29udGVudCIsIl9wb3B1cERpdiIsIl9pbml0UG9wdXBEaXYiLCJfcG9wdXBPdmVybGF5IiwiX3RyaWdnZXJIYW5kbGVyIiwiaSIsIl90eXBlb2YiLCJnZW9jb2RlUmVzb3VyY2VzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2VvY29kZVJlc291cmNlc0xpc3QiLCJhdXRvY29tcGxldGVSZXNvdXJjZXMiLCJhdXRvY29tcGxldGVSZXNvdXJjZXNMaXN0IiwicHVzaCIsImlkIiwidGl0bGUiLCJTZWFyY2hFbmdpbmVVdGlscyIsImFkdmFuY2VkU2VhcmNoRmlsdGVyc0J5RGVmYXVsdCIsImFkdmFuY2VkU2VhcmNoRmlsdGVyc0N1c3RvbSIsImNvbnRleHQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJjbG9zZXIiLCJ0eXBlIiwib25jbGljayIsInNldFBvc2l0aW9uIiwic3R5bGUiLCJjb250YWluZXIiLCJfY3JlYXRlTWFpbkNvbnRhaW5lckVsZW1lbnQiLCJpbnB1dFNob3ciLCJfY3JlYXRlU2hvd1NlYXJjaEVuZ2luZUVsZW1lbnQiLCJjaGVja2VkIiwicGljdG8iLCJfY3JlYXRlU2hvd1NlYXJjaEVuZ2luZVBpY3RvRWxlbWVudCIsInNlYXJjaCIsIl9jcmVhdGVTZWFyY2hJbnB1dEVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25BdXRvQ29tcGxldGVJbnB1dENsaWNrIiwiYXR0YWNoRXZlbnQiLCJhZHZhbmNlZFNob3ciLCJfY3JlYXRlU2hvd0FkdmFuY2VkU2VhcmNoRWxlbWVudCIsImFkdmFuY2VkUGFuZWwiLCJfY3JlYXRlQWR2YW5jZWRTZWFyY2hQYW5lbEVsZW1lbnQiLCJhZHZhbmNlZEhlYWRlciIsIl9jcmVhdGVBZHZhbmNlZFNlYXJjaFBhbmVsSGVhZGVyRWxlbWVudCIsImFkdmFuY2VkRm9ybSIsIl9jcmVhdGVBZHZhbmNlZFNlYXJjaFBhbmVsRm9ybUVsZW1lbnQiLCJhZHZhbmNlZEZvcm1GaWx0ZXJzIiwiX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUZpbHRlcnNFbGVtZW50IiwiX3NldEZpbHRlciIsImFkdmFuY2VkRm9ybUlucHV0IiwiX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUlucHV0RWxlbWVudCIsIl9jcmVhdGVBdXRvQ29tcGxldGVFbGVtZW50IiwiYXV0b2NvbXBsZXRlTGlzdCIsIl9jcmVhdGVBdXRvQ29tcGxldGVMaXN0RWxlbWVudCIsIl9jcmVhdGVHZW9jb2RlUmVzdWx0c0VsZW1lbnQiLCJnZW9jb2RlTGlzdCIsIl9jcmVhdGVHZW9jb2RlUmVzdWx0c0xpc3RFbGVtZW50IiwiY29kZSIsImNvZGVGb3VuZCIsImZpcnN0Q2hpbGQiLCJyZW1vdmVDaGlsZCIsImxzdEF0dHJpYnV0cyIsImRpdlRhYmxlIiwiX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRmlsdGVyc1RhYmxlRWxlbWVudCIsImoiLCJkaXZGaWx0ZXIiLCJfY3JlYXRlQWR2YW5jZWRTZWFyY2hGaWx0ZXJzQXR0cmlidXRFbGVtZW50IiwiX3JlcXVlc3RBdXRvQ29tcGxldGUiLCJzZXR0aW5ncyIsInRleHQiLCJhcGlLZXkiLCJzc2wiLCJHcCIsIlNlcnZpY2VzIiwiYXV0b0NvbXBsZXRlIiwiX2ZpbGxBdXRvQ29tcGxldGVkTG9jYXRpb25MaXN0Q29udGFpbmVyIiwibG9jYXRpb25zIiwiY2hpbGRFbGVtZW50Q291bnQiLCJfZGlzcGxheVN1Z2dlc3RlZExvY2F0aW9uIiwiX2NyZWF0ZUF1dG9Db21wbGV0ZWRMb2NhdGlvbkVsZW1lbnQiLCJfcmVxdWVzdEdlb2NvZGluZyIsInF1ZXJ5Iiwic2VsZiIsImJPbkZhaWx1cmUiLCJvbkZhaWx1cmUiLCJiT25TdWNjZXNzIiwib25TdWNjZXNzIiwiY2JPblN1Y2Nlc3MiLCJlIiwiY2JPbkZhaWx1cmUiLCJpbmRleCIsIl9maWxsR2VvY29kZWRMb2NhdGlvbkxpc3RDb250YWluZXIiLCJfY2xlYXJHZW9jb2RlZExvY2F0aW9uIiwiX2NyZWF0ZUdlb2NvZGVkTG9jYXRpb25FbGVtZW50IiwiX3NldExhYmVsIiwibGFiZWwiLCJnZXRFbGVtZW50QnlJZCIsInZhbHVlIiwiX3NldFBvc2l0aW9uIiwicG9zaXRpb24iLCJ6b29tIiwidmlldyIsImdldE1hcCIsImdldFZpZXciLCJzZXRDZW50ZXIiLCJzZXRab29tIiwiX3NldE1hcmtlciIsImluZm8iLCJyZW1vdmVPdmVybGF5IiwibWFya2VyRGl2Iiwic3JjIiwiX29uUmVzdWx0TWFya2VyU2VsZWN0IiwiT3ZlcmxheSIsIm9mZnNldCIsInN0b3BFdmVudCIsImFkZE92ZXJsYXkiLCJfZ2V0Wm9vbSIsImtleSIsInRyYWNlIiwiem9vbVRvUmVzdWx0c0J5RGVmYXVsdCIsInBhcnNlSW50IiwiaXNOYU4iLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImdldFpvb20iLCJtaW4iLCJtaW5ab29tIiwibWF4IiwibWF4Wm9vbSIsImluZm9ybWF0aW9uIiwicG9wdXBDb250ZW50Iiwic2VydmljZSIsImF0dHJpYnV0ZXMiLCJsb2NhdGlvbiIsInBsYWNlQXR0cmlidXRlcyIsImF0dHIiLCJoYXNPd25Qcm9wZXJ0eSIsInRvVXBwZXJDYXNlIiwiR2VvY29kZVV0aWxzIiwiZ2V0U3VnZ2VzdGVkTG9jYXRpb25GcmVlZm9ybSIsImlubmVySFRNTCIsInBvc2l0aW9uaW5nIiwiZ2V0UG9zaXRpb24iLCJvblNob3dTZWFyY2hFbmdpbmVDbGljayIsIkludGVyYWN0aW9ucyIsInVuc2V0IiwiZGlzcGF0Y2hFdmVudCIsIm9uU2VhcmNoUmVzZXRDbGljayIsImlucHV0U2VhcmNoVGV4dENvbnRhaW5lciIsImRpc2FibGVkIiwib25BdXRvQ29tcGxldGVTZWFyY2hUZXh0IiwiX2NsZWFyU3VnZ2VzdGVkTG9jYXRpb24iLCJfdHJpZ2dlckdlb2NvZGUiLCJfdHJpZ2dlckRlbGF5IiwicmVzdWx0cyIsInN1Z2dlc3RlZExvY2F0aW9ucyIsIl9sb2NhdGlvbnNUb0JlRGlzcGxheWVkIiwiaWxvY2F0aW9uIiwieCIsInkiLCJmdWxsVGV4dCIsIl9nZXRHZW9jb2RlQ29vcmRpbmF0ZXNGcm9tRnVsbFRleHQiLCJjbGVhclRpbWVvdXQiLCJ3YXJuIiwiZXJyb3IiLCJtZXNzYWdlIiwic2V0VGltZW91dCIsImdldEdlb2NvZGVkTG9jYXRpb25GcmVlZm9ybSIsImxvbiIsImxhdCIsIm9uIiwiX2hpZGVTdWdnZXN0ZWRMb2NhdGlvbiIsInN1Z2dlc3RlZExvY2F0aW9uIiwicSIsInJlc3BvbnNlIiwidW5zaGlmdCIsIm9uQXV0b0NvbXBsZXRlZFJlc3VsdHNJdGVtQ2xpY2siLCJpZHgiLCJtYXBQcm9qIiwiZ2V0UHJvamVjdGlvbiIsImdldENvZGUiLCJvbFByb2pUcmFuc2Zvcm0iLCJvbkdlb2NvZGluZ1NlYXJjaFN1Ym1pdCIsIm9uR2VvY29kZWRSZXN1bHRzSXRlbUNsaWNrIiwib25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaENvZGVDaGFuZ2UiLCJzZWxlY3RlZEluZGV4Iiwib25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaFN1Ym1pdCIsImRhdGEiLCJfbG9jYXRpb24iLCJfZmlsdGVyT3B0aW9ucyIsImZpbHRlciIsImZpbHRlcnMiLCJfZ2V0Q2FkYXN0cmFsUGFyY2VsUmVxdWVzdFBhcmFtcyIsImZpbHRlck9wdGlvbnMiLCJsIiwiZGVwIiwiZGVwYXJ0bWVudCIsInN1YnN0cmluZyIsImNvbW11bmUiLCJpbnNlZSIsImFic29yYmVkQ2l0eSIsInNlY3Rpb24iLCJudW1iZXIiLCJkaXNwbGF5Iiwid2luZG93Iiwib2wiLCJjb250cm9sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDbUU7QUFDbkU7QUFDeUM7QUFDUjtBQUNzQjtBQUN2RDtBQUNzQztBQUN0QztBQUN3RDtBQUNqQjtBQUNEO0FBQ1U7QUFDTztBQUNjO0FBQ1Y7QUFDM0Q7QUFDb0U7QUFFcEUsSUFBSUEsTUFBTSxHQUFHQyxxRUFBTSxDQUFDQyxTQUFTLENBQUMsY0FBYyxDQUFDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsWUFBWSxHQUFJLFVBQVVDLE9BQU8sRUFBRTtFQUNuQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksU0FBU0QsWUFBWUEsQ0FBRUUsT0FBTyxFQUFFO0lBQzVCQSxPQUFPLEdBQUdBLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFFdkIsSUFBSSxFQUFFLElBQUksWUFBWUYsWUFBWSxDQUFDLEVBQUU7TUFDakMsTUFBTSxJQUFJRyxTQUFTLENBQUMseUJBQXlCLENBQUM7SUFDbEQ7O0lBRUE7SUFDQSxJQUFJLENBQUNDLFVBQVUsQ0FBQ0YsT0FBTyxDQUFDOztJQUV4QjtJQUNBLElBQUksQ0FBQ0csVUFBVSxHQUFHLElBQUksQ0FBQ0MsY0FBYyxDQUFDLENBQUM7SUFDdkM7SUFDQSxJQUFJLENBQUNDLGlCQUFpQixHQUFHLElBQUk7O0lBRTdCO0lBQ0EsSUFBSUwsT0FBTyxDQUFDTSxPQUFPLElBQUlOLE9BQU8sQ0FBQ00sT0FBTyxDQUFDQyxXQUFXLEVBQUU7TUFDaEQ7TUFDQVAsT0FBTyxDQUFDTSxPQUFPLENBQUNDLFdBQVcsQ0FBQyxJQUFJLENBQUNKLFVBQVUsQ0FBQztNQUM1QyxJQUFJLENBQUNFLGlCQUFpQixHQUFHTCxPQUFPLENBQUNNLE9BQU87SUFDNUM7O0lBRUE7SUFDQVAsT0FBTyxDQUFDUyxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ2ZGLE9BQU8sRUFBRyxJQUFJLENBQUNELGlCQUFpQixJQUFJLElBQUksQ0FBQ0YsVUFBVTtNQUNuRE0sTUFBTSxFQUFHVCxPQUFPLENBQUNTLE1BQU07TUFDdkJDLE1BQU0sRUFBR1YsT0FBTyxDQUFDVTtJQUNyQixDQUFDLENBQUM7RUFDTjtFQUFDOztFQUVEO0VBQ0EsSUFBSVgsT0FBTyxFQUFFRCxZQUFZLENBQUNhLFNBQVMsR0FBR1osT0FBTzs7RUFFN0M7QUFDSjtBQUNBO0VBQ0lELFlBQVksQ0FBQ2MsU0FBUyxHQUFHQyxNQUFNLENBQUNDLE1BQU0sQ0FBQ2YsT0FBTyxDQUFDYSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0VBRTdEO0VBQ0FHLHFEQUFLLENBQUNDLE1BQU0sQ0FBQ2xCLFlBQVksQ0FBQ2MsU0FBUyxFQUFFSyx5RUFBZSxDQUFDOztFQUVyRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0luQixZQUFZLENBQUNjLFNBQVMsQ0FBQ00sV0FBVyxHQUFHcEIsWUFBWTs7RUFFakQ7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSUEsWUFBWSxDQUFDYyxTQUFTLENBQUNPLE1BQU0sR0FBRyxVQUFVQyxHQUFHLEVBQUU7SUFDM0MsSUFBSSxDQUFDQSxHQUFHLEVBQUU7TUFDTixJQUFJLENBQUNDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hCOztJQUVBO0lBQ0F0QixPQUFPLENBQUNhLFNBQVMsQ0FBQ08sTUFBTSxDQUFDWCxJQUFJLENBQUMsSUFBSSxFQUFFWSxHQUFHLENBQUM7RUFDNUMsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0l0QixZQUFZLENBQUNjLFNBQVMsQ0FBQ1UsWUFBWSxHQUFHLFlBQVk7SUFDOUMsT0FBTyxJQUFJLENBQUNDLFNBQVM7RUFDekIsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0l6QixZQUFZLENBQUNjLFNBQVMsQ0FBQ1ksWUFBWSxHQUFHLFVBQVVELFNBQVMsRUFBRTtJQUN2RCxJQUFJQSxTQUFTLEtBQUtFLFNBQVMsRUFBRTtNQUN6QjlCLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQyxpRUFBaUUsQ0FBQztNQUM3RTtJQUNKO0lBQ0EsSUFBS0gsU0FBUyxJQUFJLElBQUksQ0FBQ0EsU0FBUyxJQUFNLENBQUNBLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQ0EsU0FBVSxFQUFFO01BQ2xFO0lBQ0o7SUFFQSxJQUFJLENBQUNJLHNCQUFzQixDQUFDQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUNMLFNBQVMsR0FBR0EsU0FBUztFQUM5QixDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSXpCLFlBQVksQ0FBQ2MsU0FBUyxDQUFDaUIsT0FBTyxHQUFHLFlBQVk7SUFDekMsT0FBTyxJQUFJLENBQUNDLGtCQUFrQjtFQUNsQyxDQUFDO0VBQ0Q7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJaEMsWUFBWSxDQUFDYyxTQUFTLENBQUNWLFVBQVUsR0FBRyxVQUFVRixPQUFPLEVBQUU7SUFDbkQsSUFBSSxDQUFDK0Isa0JBQWtCLENBQUMvQixPQUFPLENBQUM7O0lBRWhDO0lBQ0EsSUFBSSxDQUFDQSxPQUFPLEdBQUc7TUFDWHVCLFNBQVMsRUFBRyxJQUFJO01BQ2hCUyxNQUFNLEVBQUcsRUFBRTtNQUNYQyxTQUFTLEVBQUc7UUFDUkMsT0FBTyxFQUFHLEVBQUU7UUFDWkMsWUFBWSxFQUFHO01BQ25CLENBQUM7TUFDREMscUJBQXFCLEVBQUcsSUFBSTtNQUM1QkMsY0FBYyxFQUFHLENBQUMsQ0FBQztNQUNuQkMsY0FBYyxFQUFHO1FBQ2JDLGNBQWMsRUFBRyxDQUFDO01BQ3RCLENBQUM7TUFDREMsbUJBQW1CLEVBQUc7UUFDbEJELGNBQWMsRUFBRyxDQUFDLENBQUM7UUFDbkJFLGNBQWMsRUFBRyxLQUFLO1FBQ3RCQyxZQUFZLEVBQUc7TUFDbkIsQ0FBQztNQUNEQyxhQUFhLEVBQUcsSUFBSTtNQUNwQkMsV0FBVyxFQUFHLGFBQWE7TUFDM0JDLFdBQVcsRUFBRztJQUNsQixDQUFDOztJQUVEO0lBQ0E5QixxREFBSyxDQUFDK0IsV0FBVyxDQUFDLElBQUksQ0FBQzlDLE9BQU8sRUFBRUEsT0FBTyxDQUFDO0lBQ3hDLElBQUksSUFBSSxDQUFDQSxPQUFPLENBQUNpQyxTQUFTLENBQUNDLE9BQU8sS0FBSyxFQUFFLEVBQUU7TUFDdkMsSUFBSSxDQUFDbEMsT0FBTyxDQUFDaUMsU0FBUyxDQUFDQyxPQUFPLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxlQUFlLENBQUM7SUFDNUU7SUFDQSxJQUFJLElBQUksQ0FBQ2xDLE9BQU8sQ0FBQ2lDLFNBQVMsQ0FBQ0UsWUFBWSxDQUFDWSxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2xELElBQUksQ0FBQy9DLE9BQU8sQ0FBQ2lDLFNBQVMsQ0FBQ0UsWUFBWSxHQUFHLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDO0lBQ2pGOztJQUVBO0lBQ0EsSUFBSSxDQUFDWixTQUFTLEdBQUcsSUFBSSxDQUFDdkIsT0FBTyxDQUFDdUIsU0FBUzs7SUFFdkM7SUFDQSxJQUFJLENBQUN5QixJQUFJLEdBQUdDLGdFQUFVLENBQUNDLFFBQVEsQ0FBQyxDQUFDO0lBRWpDLElBQUksQ0FBQ3ZCLHNCQUFzQixHQUFHLElBQUk7O0lBRWxDO0lBQ0EsSUFBSSxDQUFDd0IscUJBQXFCLEdBQUcsSUFBSTs7SUFFakM7SUFDQSxJQUFJLENBQUNDLHNCQUFzQixHQUFHLElBQUk7SUFDbEMsSUFBSSxDQUFDQyxtQkFBbUIsR0FBRyxJQUFJOztJQUUvQjtJQUNBLElBQUksQ0FBQ0MsbUJBQW1CLEdBQUcsRUFBRTs7SUFFN0I7SUFDQSxJQUFJLENBQUNDLGtCQUFrQixHQUFHLElBQUk7O0lBRTlCO0lBQ0EsSUFBSSxDQUFDekIsa0JBQWtCLEdBQUcsRUFBRTs7SUFFNUI7SUFDQSxJQUFJLENBQUMwQixnQkFBZ0IsR0FBRyxJQUFJOztJQUU1QjtJQUNBLElBQUksQ0FBQ0MscUJBQXFCLEdBQUcsSUFBSTs7SUFFakM7SUFDQSxJQUFJLENBQUNDLHlCQUF5QixHQUFHLElBQUk7O0lBRXJDO0lBQ0EsSUFBSSxDQUFDQyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDQywwQkFBMEIsQ0FBQyxDQUFDOztJQUVqQztJQUNBLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsRUFBRTtJQUM5QixJQUFJLENBQUNDLHdCQUF3QixDQUFDLENBQUM7O0lBRS9CO0lBQ0EsSUFBSSxDQUFDQyxPQUFPLEdBQUcsSUFBSTs7SUFFbkI7SUFDQSxJQUFJQyxZQUFZLEdBQUcsSUFBSSxDQUFDaEUsT0FBTyxDQUFDNEMsV0FBVztJQUMzQyxJQUFJLENBQUNxQixVQUFVLEdBQUlwRCxNQUFNLENBQUNxRCxJQUFJLENBQUNDLHNEQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDSixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBSUcsc0RBQU8sQ0FBQyxhQUFhLENBQUMsR0FBR0Esc0RBQU8sQ0FBQ0gsWUFBWSxDQUFDOztJQUV0SDtJQUNBLElBQUksQ0FBQ0ssY0FBYyxHQUFHLElBQUksQ0FBQ3JFLE9BQU8sQ0FBQzJDLGFBQWE7O0lBRWhEO0lBQ0EsSUFBSSxDQUFDMkIsYUFBYSxHQUFHLElBQUk7SUFDekIsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSSxDQUFDQyxhQUFhLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUNDLGFBQWEsR0FBRyxJQUFJOztJQUV6QjtJQUNBLElBQUksQ0FBQ0MsZUFBZSxHQUFHLElBQUk7RUFDL0IsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0k1RSxZQUFZLENBQUNjLFNBQVMsQ0FBQ21CLGtCQUFrQixHQUFHLFVBQVUvQixPQUFPLEVBQUU7SUFDM0QsSUFBSTJFLENBQUM7SUFFTCxJQUFJM0UsT0FBTyxDQUFDaUMsU0FBUyxFQUFFO01BQ25CO01BQ0EsSUFBSTJDLE9BQUEsQ0FBTzVFLE9BQU8sQ0FBQ2lDLFNBQVMsTUFBSyxRQUFRLEVBQUU7UUFDdkM7UUFDQSxJQUFJNEMsZ0JBQWdCLEdBQUc3RSxPQUFPLENBQUNpQyxTQUFTLENBQUNDLE9BQU87UUFDaEQsSUFBSTJDLGdCQUFnQixFQUFFO1VBQ2xCO1VBQ0EsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLGdCQUFnQixDQUFDLEVBQUU7WUFDakMsSUFBSUcsb0JBQW9CLEdBQUcsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDO1lBQ3RHLEtBQUtMLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0UsZ0JBQWdCLENBQUM5QixNQUFNLEVBQUU0QixDQUFDLEVBQUUsRUFBRTtjQUMxQyxJQUFJSyxvQkFBb0IsQ0FBQ1osT0FBTyxDQUFDUyxnQkFBZ0IsQ0FBQ0YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDMUQ7Z0JBQ0E7Z0JBQ0FoRixNQUFNLENBQUMrQixHQUFHLENBQUMsNkNBQTZDLEdBQUdtRCxnQkFBZ0IsQ0FBQ0YsQ0FBQyxDQUFDLEdBQUcsZ0NBQWdDLENBQUM7Y0FDdEg7WUFDSjtVQUNKLENBQUMsTUFBTTtZQUNIaEYsTUFBTSxDQUFDK0IsR0FBRyxDQUFDLHlFQUF5RSxDQUFDO1lBQ3JGbUQsZ0JBQWdCLEdBQUcsSUFBSTtVQUMzQjtRQUNKOztRQUVBO1FBQ0EsSUFBSUkscUJBQXFCLEdBQUdqRixPQUFPLENBQUNpQyxTQUFTLENBQUNFLFlBQVk7UUFDMUQsSUFBSThDLHFCQUFxQixFQUFFO1VBQ3ZCO1VBQ0EsSUFBSUgsS0FBSyxDQUFDQyxPQUFPLENBQUNFLHFCQUFxQixDQUFDLEVBQUU7WUFDdEMsSUFBSUMseUJBQXlCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUM7WUFDdkUsS0FBS1AsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHTSxxQkFBcUIsQ0FBQ2xDLE1BQU0sRUFBRTRCLENBQUMsRUFBRSxFQUFFO2NBQy9DLElBQUlPLHlCQUF5QixDQUFDZCxPQUFPLENBQUNhLHFCQUFxQixDQUFDTixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNwRTtnQkFDQTtnQkFDQWhGLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQyxrREFBa0QsR0FBR3VELHFCQUFxQixDQUFDTixDQUFDLENBQUMsR0FBRyxxQ0FBcUMsQ0FBQztjQUNySTtZQUNKO1VBQ0osQ0FBQyxNQUFNO1lBQ0hoRixNQUFNLENBQUMrQixHQUFHLENBQUMsOEVBQThFLENBQUM7WUFDMUZ1RCxxQkFBcUIsR0FBRyxJQUFJO1VBQ2hDO1FBQ0o7TUFDSixDQUFDLE1BQU07UUFDSHRGLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQywwREFBMEQsQ0FBQztRQUN0RTFCLE9BQU8sQ0FBQ2lDLFNBQVMsR0FBRyxJQUFJO01BQzVCO0lBQ0o7RUFDSixDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJbkMsWUFBWSxDQUFDYyxTQUFTLENBQUNrRCx3QkFBd0IsR0FBRyxZQUFZO0lBQzFEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQSxJQUFJZSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM3RSxPQUFPLENBQUNpQyxTQUFTLENBQUNDLE9BQU87SUFDckQsSUFBSTJDLGdCQUFnQixLQUFLLFVBQVUsRUFBRTtNQUNqQ0EsZ0JBQWdCLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUM7SUFDakY7SUFDQSxJQUFJLENBQUNDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDRixnQkFBZ0IsQ0FBQyxFQUFFO01BQ2xDQSxnQkFBZ0IsR0FBRyxDQUFDQSxnQkFBZ0IsQ0FBQztJQUN6QztJQUNBLEtBQUssSUFBSUYsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHRSxnQkFBZ0IsQ0FBQzlCLE1BQU0sRUFBRTRCLENBQUMsRUFBRSxFQUFFO01BQzlDLFFBQVFFLGdCQUFnQixDQUFDRixDQUFDLENBQUM7UUFDdkIsS0FBSyxvQkFBb0I7VUFDckIsSUFBSSxDQUFDZCxvQkFBb0IsQ0FBQ3NCLElBQUksQ0FBQztZQUMzQkMsRUFBRSxFQUFHLG9CQUFvQjtZQUN6QkMsS0FBSyxFQUFHO1VBQ1osQ0FBQyxDQUFDO1VBQ0Y7UUFDSixLQUFLLGVBQWU7VUFDaEIsSUFBSSxDQUFDeEIsb0JBQW9CLENBQUNzQixJQUFJLENBQUM7WUFDM0JDLEVBQUUsRUFBRyxlQUFlO1lBQ3BCQyxLQUFLLEVBQUc7VUFDWixDQUFDLENBQUM7VUFDRjtRQUNKLEtBQUssaUJBQWlCO1VBQ2xCLElBQUksQ0FBQ3hCLG9CQUFvQixDQUFDc0IsSUFBSSxDQUFDO1lBQzNCQyxFQUFFLEVBQUcsaUJBQWlCO1lBQ3RCQyxLQUFLLEVBQUc7VUFDWixDQUFDLENBQUM7VUFDRjtRQUNKO1VBQ0k7TUFDUjtJQUNKO0lBQ0E7SUFDQSxJQUFJLElBQUksQ0FBQ3hCLG9CQUFvQixDQUFDZCxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3hDLElBQUksQ0FBQ2Msb0JBQW9CLEdBQUcsQ0FBQztRQUN6QnVCLEVBQUUsRUFBRyxlQUFlO1FBQ3BCQyxLQUFLLEVBQUc7TUFDWixDQUFDLEVBQUU7UUFDQ0QsRUFBRSxFQUFHLG9CQUFvQjtRQUN6QkMsS0FBSyxFQUFHO01BQ1osQ0FBQyxFQUFFO1FBQ0NELEVBQUUsRUFBRyxpQkFBaUI7UUFDdEJDLEtBQUssRUFBRztNQUNaLENBQUMsQ0FBQztJQUNOO0lBRUExRixNQUFNLENBQUMrQixHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDbUMsb0JBQW9CLENBQUM7RUFDaEUsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSS9ELFlBQVksQ0FBQ2MsU0FBUyxDQUFDZ0QsMEJBQTBCLEdBQUcsWUFBWTtJQUM1RDtJQUNBLElBQUksQ0FBQ0Qsc0JBQXNCLEdBQUcyQix3RUFBaUIsQ0FBQ0MsOEJBQThCOztJQUU5RTtJQUNBLElBQUlDLDJCQUEyQixHQUFHLElBQUksQ0FBQ3hGLE9BQU8sQ0FBQ3FDLGNBQWM7SUFDN0R0QixxREFBSyxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDMkMsc0JBQXNCLEVBQUU2QiwyQkFBMkIsQ0FBQztJQUV0RTdGLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUNpQyxzQkFBc0IsQ0FBQztFQUNwRSxDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0k3RCxZQUFZLENBQUNjLFNBQVMsQ0FBQzRELGFBQWEsR0FBRyxZQUFZO0lBQy9DLElBQUlpQixPQUFPLEdBQUcsSUFBSTtJQUNsQixJQUFJbkYsT0FBTyxHQUFHb0YsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQzNDckYsT0FBTyxDQUFDc0YsU0FBUyxHQUFHLHFCQUFxQjtJQUN6QyxJQUFJQyxNQUFNLEdBQUdILFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUM1Q0UsTUFBTSxDQUFDQyxJQUFJLEdBQUcsUUFBUTtJQUN0QkQsTUFBTSxDQUFDRCxTQUFTLEdBQUcsMEJBQTBCO0lBQzdDO0lBQ0FDLE1BQU0sQ0FBQ0UsT0FBTyxHQUFHLFlBQVk7TUFDekIsSUFBSU4sT0FBTyxDQUFDaEIsYUFBYSxJQUFJLElBQUksRUFBRTtRQUMvQmdCLE9BQU8sQ0FBQ2hCLGFBQWEsQ0FBQ3VCLFdBQVcsQ0FBQ3ZFLFNBQVMsQ0FBQztNQUNoRDtNQUNBLE9BQU8sS0FBSztJQUNoQixDQUFDO0lBQ0QsSUFBSSxDQUFDNkMsYUFBYSxHQUFHb0IsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQ2xELElBQUksQ0FBQ3JCLGFBQWEsQ0FBQ3NCLFNBQVMsR0FBRyx5QkFBeUI7SUFDeEQsSUFBSSxDQUFDdEIsYUFBYSxDQUFDMkIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU87SUFDL0MzRixPQUFPLENBQUNDLFdBQVcsQ0FBQyxJQUFJLENBQUMrRCxhQUFhLENBQUM7SUFDdkNoRSxPQUFPLENBQUNDLFdBQVcsQ0FBQ3NGLE1BQU0sQ0FBQztJQUUzQixPQUFPdkYsT0FBTztFQUNsQixDQUFDOztFQUVEO0VBQ0E7RUFDQTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJUixZQUFZLENBQUNjLFNBQVMsQ0FBQ1IsY0FBYyxHQUFHLFlBQVk7SUFDaEQ7SUFDQSxJQUFJOEYsU0FBUyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQzs7SUFFbEQ7SUFDQSxJQUFJQyxTQUFTLEdBQUcsSUFBSSxDQUFDekUsc0JBQXNCLEdBQUcsSUFBSSxDQUFDMEUsOEJBQThCLENBQUMsQ0FBQztJQUNuRkgsU0FBUyxDQUFDM0YsV0FBVyxDQUFDNkYsU0FBUyxDQUFDOztJQUVoQztJQUNBLElBQUksQ0FBQyxJQUFJLENBQUNwRyxPQUFPLENBQUN1QixTQUFTLEVBQUU7TUFDekI2RSxTQUFTLENBQUNFLE9BQU8sR0FBRyxJQUFJO0lBQzVCOztJQUVBO0lBQ0EsSUFBSUMsS0FBSyxHQUFHLElBQUksQ0FBQ0MsbUNBQW1DLENBQUMsQ0FBQztJQUN0RE4sU0FBUyxDQUFDM0YsV0FBVyxDQUFDZ0csS0FBSyxDQUFDO0lBRTVCLElBQUlFLE1BQU0sR0FBRyxJQUFJLENBQUN0RCxxQkFBcUIsR0FBRyxJQUFJLENBQUN1RCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMxRyxPQUFPLENBQUM2QyxXQUFXLENBQUM7SUFDbEcsSUFBSTRDLE9BQU8sR0FBRyxJQUFJO0lBQ2xCLElBQUlnQixNQUFNLENBQUNFLGdCQUFnQixFQUFFO01BQ3pCRixNQUFNLENBQUNFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZO1FBQ3pDbEIsT0FBTyxDQUFDbUIsd0JBQXdCLENBQUMsQ0FBQztNQUN0QyxDQUFDLENBQUM7SUFDTixDQUFDLE1BQU0sSUFBSUgsTUFBTSxDQUFDSSxXQUFXLEVBQUU7TUFDM0JKLE1BQU0sQ0FBQ0ksV0FBVyxDQUFDLFNBQVMsRUFBRSxZQUFZO1FBQ3RDcEIsT0FBTyxDQUFDbUIsd0JBQXdCLENBQUMsQ0FBQztNQUN0QyxDQUFDLENBQUM7SUFDTjtJQUNBVixTQUFTLENBQUMzRixXQUFXLENBQUNrRyxNQUFNLENBQUM7SUFFN0IsSUFBSSxJQUFJLENBQUN6RyxPQUFPLENBQUNvQyxxQkFBcUIsRUFBRTtNQUNwQyxJQUFJMEUsWUFBWSxHQUFHLElBQUksQ0FBQ0MsZ0NBQWdDLENBQUMsQ0FBQztNQUMxRGIsU0FBUyxDQUFDM0YsV0FBVyxDQUFDdUcsWUFBWSxDQUFDOztNQUVuQztNQUNBO01BQ0EsSUFBSUUsYUFBYSxHQUFHLElBQUksQ0FBQ0MsaUNBQWlDLENBQUMsQ0FBQztNQUM1RCxJQUFJQyxjQUFjLEdBQUcsSUFBSSxDQUFDQyx1Q0FBdUMsQ0FBQyxDQUFDO01BQ25FLElBQUlDLFlBQVksR0FBRyxJQUFJLENBQUNDLHFDQUFxQyxDQUFDLElBQUksQ0FBQ3hELG9CQUFvQixDQUFDO01BQ3hGLElBQUl5RCxtQkFBbUIsR0FBRyxJQUFJLENBQUM5RCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMrRCx1Q0FBdUMsQ0FBQyxDQUFDO01BQ2hHLElBQUksQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQzNELG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNsRCxJQUFJcUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDQyxxQ0FBcUMsQ0FBQyxDQUFDO01BQ3BFTixZQUFZLENBQUM3RyxXQUFXLENBQUMrRyxtQkFBbUIsQ0FBQztNQUM3Q0YsWUFBWSxDQUFDN0csV0FBVyxDQUFDa0gsaUJBQWlCLENBQUM7TUFDM0NULGFBQWEsQ0FBQ3pHLFdBQVcsQ0FBQzJHLGNBQWMsQ0FBQztNQUN6Q0YsYUFBYSxDQUFDekcsV0FBVyxDQUFDNkcsWUFBWSxDQUFDO01BQ3ZDbEIsU0FBUyxDQUFDM0YsV0FBVyxDQUFDeUcsYUFBYSxDQUFDO0lBQ3hDOztJQUVBO0lBQ0E7SUFDQSxJQUFJN0UsWUFBWSxHQUFHLElBQUksQ0FBQ2lCLHNCQUFzQixHQUFHLElBQUksQ0FBQ3VFLDBCQUEwQixDQUFDLENBQUM7SUFDbEYsSUFBSUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDdkUsbUJBQW1CLEdBQUcsSUFBSSxDQUFDd0UsOEJBQThCLENBQUMsQ0FBQztJQUN2RjFGLFlBQVksQ0FBQzVCLFdBQVcsQ0FBQ3FILGdCQUFnQixDQUFDO0lBQzFDMUIsU0FBUyxDQUFDM0YsV0FBVyxDQUFDNEIsWUFBWSxDQUFDOztJQUVuQztJQUNBO0lBQ0EsSUFBSUQsT0FBTyxHQUFHLElBQUksQ0FBQzRGLDRCQUE0QixDQUFDLENBQUM7SUFDakQsSUFBSUMsV0FBVyxHQUFHLElBQUksQ0FBQ3hFLGtCQUFrQixHQUFHLElBQUksQ0FBQ3lFLGdDQUFnQyxDQUFDLENBQUM7SUFDbkY5RixPQUFPLENBQUMzQixXQUFXLENBQUN3SCxXQUFXLENBQUM7SUFDaEM3QixTQUFTLENBQUMzRixXQUFXLENBQUMyQixPQUFPLENBQUM7SUFFOUIsT0FBT2dFLFNBQVM7RUFDcEIsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXBHLFlBQVksQ0FBQ2MsU0FBUyxDQUFDNEcsVUFBVSxHQUFHLFVBQVVTLElBQUksRUFBRTtJQUNoRDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQSxJQUFJL0IsU0FBUyxHQUFHLElBQUksQ0FBQzFDLGdCQUFnQjtJQUVyQyxJQUFJMEUsU0FBUyxHQUFHLEtBQUs7SUFDckIsS0FBSyxJQUFJdkQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLElBQUksQ0FBQ2Qsb0JBQW9CLENBQUNkLE1BQU0sRUFBRTRCLENBQUMsRUFBRSxFQUFFO01BQ3ZELElBQUksSUFBSSxDQUFDZCxvQkFBb0IsQ0FBQ2MsQ0FBQyxDQUFDLENBQUNTLEVBQUUsS0FBSzZDLElBQUksRUFBRTtRQUMxQ0MsU0FBUyxHQUFHLElBQUk7UUFDaEI7TUFDSjtJQUNKO0lBRUEsSUFBSSxDQUFDQSxTQUFTLEVBQUU7TUFDWjtNQUNBO01BQ0EsT0FBT2hDLFNBQVMsQ0FBQ2lDLFVBQVUsRUFBRTtRQUN6QmpDLFNBQVMsQ0FBQ2tDLFdBQVcsQ0FBQ2xDLFNBQVMsQ0FBQ2lDLFVBQVUsQ0FBQztNQUMvQztNQUNBO0lBQ0o7O0lBRUE7SUFDQSxJQUFJLENBQUMxRSxxQkFBcUIsR0FBR3dFLElBQUk7O0lBRWpDO0lBQ0EsT0FBTy9CLFNBQVMsQ0FBQ2lDLFVBQVUsRUFBRTtNQUN6QmpDLFNBQVMsQ0FBQ2tDLFdBQVcsQ0FBQ2xDLFNBQVMsQ0FBQ2lDLFVBQVUsQ0FBQztJQUMvQztJQUVBLElBQUlFLFlBQVksR0FBRyxJQUFJLENBQUMxRSxzQkFBc0IsQ0FBQ3NFLElBQUksQ0FBQztJQUNwRCxJQUFJLENBQUNJLFlBQVksSUFBSUEsWUFBWSxDQUFDdEYsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUM1QztNQUNBO0lBQ0o7SUFFQSxJQUFJdUYsUUFBUSxHQUFHLElBQUksQ0FBQ0Msd0NBQXdDLENBQUNOLElBQUksRUFBRSxJQUFJLENBQUM7SUFFeEUsS0FBSyxJQUFJTyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdILFlBQVksQ0FBQ3RGLE1BQU0sRUFBRXlGLENBQUMsRUFBRSxFQUFFO01BQzFDLElBQUlDLFNBQVMsR0FBRyxJQUFJLENBQUNDLDJDQUEyQyxDQUFDTCxZQUFZLENBQUNHLENBQUMsQ0FBQyxDQUFDO01BQ2pGRixRQUFRLENBQUMvSCxXQUFXLENBQUNrSSxTQUFTLENBQUM7SUFDbkM7SUFFQXZDLFNBQVMsQ0FBQzNGLFdBQVcsQ0FBQytILFFBQVEsQ0FBQztJQUUvQixPQUFPcEMsU0FBUztFQUNwQixDQUFDOztFQUVEO0VBQ0E7RUFDQTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJcEcsWUFBWSxDQUFDYyxTQUFTLENBQUMrSCxvQkFBb0IsR0FBRyxVQUFVQyxRQUFRLEVBQUU7SUFDOUQ7SUFDQSxJQUFJLENBQUNBLFFBQVEsSUFBS2hFLE9BQUEsQ0FBT2dFLFFBQVEsTUFBSyxRQUFRLElBQUkvSCxNQUFNLENBQUNxRCxJQUFJLENBQUMwRSxRQUFRLENBQUMsQ0FBQzdGLE1BQU0sS0FBSyxDQUFFLEVBQUU7TUFDbkY7SUFDSjs7SUFFQTtJQUNBLElBQUksQ0FBQzZGLFFBQVEsQ0FBQ0MsSUFBSSxFQUFFO01BQ2hCO0lBQ0o7SUFFQWxKLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQ2tILFFBQVEsQ0FBQztJQUVwQixJQUFJNUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQjtJQUNBZSxxREFBSyxDQUFDQyxNQUFNLENBQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDQSxPQUFPLENBQUN3QyxtQkFBbUIsQ0FBQ0QsY0FBYyxDQUFDO0lBQ3RFO0lBQ0F4QixxREFBSyxDQUFDQyxNQUFNLENBQUNoQixPQUFPLEVBQUU0SSxRQUFRLENBQUM7O0lBRS9CO0lBQ0EsSUFBSTNHLFNBQVMsR0FBRyxJQUFJLENBQUNqQyxPQUFPLENBQUNpQyxTQUFTLENBQUNFLFlBQVk7SUFDbkQsSUFBSUYsU0FBUyxJQUFJNkMsS0FBSyxDQUFDQyxPQUFPLENBQUM5QyxTQUFTLENBQUMsRUFBRTtNQUN2QztNQUNBLElBQUksQ0FBQ2pDLE9BQU8sQ0FBQzhGLElBQUksRUFBRTtRQUNmOUYsT0FBTyxDQUFDOEYsSUFBSSxHQUFHN0QsU0FBUztNQUM1QjtJQUNKOztJQUVBO0lBQ0E7SUFDQWpDLE9BQU8sQ0FBQzhJLE1BQU0sR0FBRzlJLE9BQU8sQ0FBQzhJLE1BQU0sSUFBSSxJQUFJLENBQUM5SSxPQUFPLENBQUM4SSxNQUFNOztJQUV0RDtJQUNBO0lBQ0EsSUFBSSxPQUFPOUksT0FBTyxDQUFDK0ksR0FBRyxLQUFLLFNBQVMsRUFBRTtNQUNsQyxJQUFJLE9BQU8sSUFBSSxDQUFDL0ksT0FBTyxDQUFDK0ksR0FBRyxLQUFLLFNBQVMsRUFBRTtRQUN2Qy9JLE9BQU8sQ0FBQytJLEdBQUcsR0FBRyxJQUFJLENBQUMvSSxPQUFPLENBQUMrSSxHQUFHO01BQ2xDLENBQUMsTUFBTTtRQUNIL0ksT0FBTyxDQUFDK0ksR0FBRyxHQUFHLElBQUk7TUFDdEI7SUFDSjtJQUNBcEosTUFBTSxDQUFDK0IsR0FBRyxDQUFDMUIsT0FBTyxDQUFDO0lBRW5CZ0osNERBQUUsQ0FBQ0MsUUFBUSxDQUFDQyxZQUFZLENBQUNsSixPQUFPLENBQUM7RUFDckMsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lGLFlBQVksQ0FBQ2MsU0FBUyxDQUFDdUksdUNBQXVDLEdBQUcsVUFBVUMsU0FBUyxFQUFFO0lBQ2xGLElBQUksQ0FBQ0EsU0FBUyxJQUFJQSxTQUFTLENBQUNyRyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3RDO0lBQ0o7O0lBRUE7SUFDQSxJQUFJekMsT0FBTyxHQUFHLElBQUksQ0FBQytDLG1CQUFtQjtJQUN0QyxJQUFJL0MsT0FBTyxDQUFDK0ksaUJBQWlCLEVBQUU7TUFDM0IsT0FBTy9JLE9BQU8sQ0FBQzZILFVBQVUsRUFBRTtRQUN2QjdILE9BQU8sQ0FBQzhILFdBQVcsQ0FBQzlILE9BQU8sQ0FBQzZILFVBQVUsQ0FBQztNQUMzQztJQUNKO0lBRUEsSUFBSSxDQUFDbUIseUJBQXlCLENBQUMsQ0FBQztJQUNoQyxLQUFLLElBQUkzRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5RSxTQUFTLENBQUNyRyxNQUFNLEVBQUU0QixDQUFDLEVBQUUsRUFBRTtNQUN2QztNQUNBLElBQUksQ0FBQzRFLG1DQUFtQyxDQUFDSCxTQUFTLENBQUN6RSxDQUFDLENBQUMsRUFBRUEsQ0FBQyxDQUFDO0lBQzdEO0VBQ0osQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJN0UsWUFBWSxDQUFDYyxTQUFTLENBQUM0SSxpQkFBaUIsR0FBRyxVQUFVWixRQUFRLEVBQUU7SUFDM0Q7SUFDQSxJQUFJLENBQUNBLFFBQVEsSUFBS2hFLE9BQUEsQ0FBT2dFLFFBQVEsTUFBSyxRQUFRLElBQUkvSCxNQUFNLENBQUNxRCxJQUFJLENBQUMwRSxRQUFRLENBQUMsQ0FBQzdGLE1BQU0sS0FBSyxDQUFFLEVBQUU7TUFDbkY7SUFDSjs7SUFFQTtJQUNBLElBQUk2RixRQUFRLENBQUNhLEtBQUssS0FBSyxJQUFJLEVBQUU7TUFDekI7SUFDSjtJQUVBOUosTUFBTSxDQUFDK0IsR0FBRyxDQUFDa0gsUUFBUSxDQUFDO0lBRXBCLElBQUk1SSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCO0lBQ0FlLHFEQUFLLENBQUNDLE1BQU0sQ0FBQ2hCLE9BQU8sRUFBRSxJQUFJLENBQUNBLE9BQU8sQ0FBQ3NDLGNBQWMsQ0FBQ0MsY0FBYyxDQUFDO0lBQ2pFO0lBQ0F4QixxREFBSyxDQUFDQyxNQUFNLENBQUNoQixPQUFPLEVBQUU0SSxRQUFRLENBQUM7SUFDL0I7SUFDQSxJQUFJYyxJQUFJLEdBQUcsSUFBSTtJQUNmLElBQUlDLFVBQVUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDM0osT0FBTyxDQUFDc0MsY0FBYyxDQUFDQyxjQUFjLENBQUNxSCxTQUFTLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDNUosT0FBTyxDQUFDc0MsY0FBYyxDQUFDQyxjQUFjLENBQUNxSCxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNsSyxJQUFJQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQzdKLE9BQU8sQ0FBQ3NDLGNBQWMsQ0FBQ0MsY0FBYyxDQUFDdUgsU0FBUyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQzlKLE9BQU8sQ0FBQ3NDLGNBQWMsQ0FBQ0MsY0FBYyxDQUFDdUgsU0FBUyxLQUFLLFVBQVUsQ0FBQztJQUNoSyxJQUFJRCxVQUFVLEVBQUU7TUFDWixJQUFJRSxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBYUMsQ0FBQyxFQUFFO1FBQzNCcEIsUUFBUSxDQUFDa0IsU0FBUyxDQUFDdEosSUFBSSxDQUFDa0osSUFBSSxFQUFFTSxDQUFDLENBQUM7UUFDaENOLElBQUksQ0FBQzFKLE9BQU8sQ0FBQ3NDLGNBQWMsQ0FBQ0MsY0FBYyxDQUFDdUgsU0FBUyxDQUFDdEosSUFBSSxDQUFDa0osSUFBSSxFQUFFTSxDQUFDLENBQUM7TUFDdEUsQ0FBQztNQUNEaEssT0FBTyxDQUFDOEosU0FBUyxHQUFHQyxXQUFXO0lBQ25DO0lBQ0EsSUFBSUosVUFBVSxFQUFFO01BQ1osSUFBSU0sV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQWFELENBQUMsRUFBRTtRQUMzQnBCLFFBQVEsQ0FBQ2dCLFNBQVMsQ0FBQ3BKLElBQUksQ0FBQ2tKLElBQUksRUFBRU0sQ0FBQyxDQUFDO1FBQ2hDTixJQUFJLENBQUMxSixPQUFPLENBQUNzQyxjQUFjLENBQUNDLGNBQWMsQ0FBQ3FILFNBQVMsQ0FBQ3BKLElBQUksQ0FBQ2tKLElBQUksRUFBRU0sQ0FBQyxDQUFDO01BQ3RFLENBQUM7TUFDRGhLLE9BQU8sQ0FBQzRKLFNBQVMsR0FBR0ssV0FBVztJQUNuQzs7SUFFQTtJQUNBLElBQUloSSxTQUFTLEdBQUcsSUFBSSxDQUFDakMsT0FBTyxDQUFDaUMsU0FBUyxDQUFDQyxPQUFPO0lBQzlDLElBQUlELFNBQVMsRUFBRTtNQUNYO01BQ0E7TUFDQSxJQUFJLENBQUNqQyxPQUFPLENBQUNrSyxLQUFLLEVBQUU7UUFDaEJsSyxPQUFPLENBQUNrSyxLQUFLLEdBQUdqSSxTQUFTO01BQzdCO0lBQ0o7O0lBRUE7SUFDQTtJQUNBakMsT0FBTyxDQUFDOEksTUFBTSxHQUFHOUksT0FBTyxDQUFDOEksTUFBTSxJQUFJLElBQUksQ0FBQzlJLE9BQU8sQ0FBQzhJLE1BQU07O0lBRXREO0lBQ0E7SUFDQSxJQUFJLE9BQU85SSxPQUFPLENBQUMrSSxHQUFHLEtBQUssU0FBUyxFQUFFO01BQ2xDLElBQUksT0FBTyxJQUFJLENBQUMvSSxPQUFPLENBQUMrSSxHQUFHLEtBQUssU0FBUyxFQUFFO1FBQ3ZDL0ksT0FBTyxDQUFDK0ksR0FBRyxHQUFHLElBQUksQ0FBQy9JLE9BQU8sQ0FBQytJLEdBQUc7TUFDbEMsQ0FBQyxNQUFNO1FBQ0gvSSxPQUFPLENBQUMrSSxHQUFHLEdBQUcsSUFBSTtNQUN0QjtJQUNKO0lBRUFwSixNQUFNLENBQUMrQixHQUFHLENBQUMxQixPQUFPLENBQUM7SUFFbkJnSiw0REFBRSxDQUFDQyxRQUFRLENBQUMvRyxPQUFPLENBQUNsQyxPQUFPLENBQUM7RUFDaEMsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJRixZQUFZLENBQUNjLFNBQVMsQ0FBQ3VKLGtDQUFrQyxHQUFHLFVBQVVmLFNBQVMsRUFBRTtJQUM3RSxJQUFJLENBQUNBLFNBQVMsSUFBSUEsU0FBUyxDQUFDckcsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUN0QyxJQUFJLENBQUNxSCxzQkFBc0IsQ0FBQyxDQUFDO01BQzdCO0lBQ0o7O0lBRUE7SUFDQSxJQUFJOUosT0FBTyxHQUFHLElBQUksQ0FBQ2lELGtCQUFrQjtJQUNyQyxJQUFJakQsT0FBTyxDQUFDK0ksaUJBQWlCLEVBQUU7TUFDM0IsT0FBTy9JLE9BQU8sQ0FBQzZILFVBQVUsRUFBRTtRQUN2QjdILE9BQU8sQ0FBQzhILFdBQVcsQ0FBQzlILE9BQU8sQ0FBQzZILFVBQVUsQ0FBQztNQUMzQztJQUNKO0lBRUEsS0FBSyxJQUFJeEQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeUUsU0FBUyxDQUFDckcsTUFBTSxFQUFFNEIsQ0FBQyxFQUFFLEVBQUU7TUFDdkNoRixNQUFNLENBQUMrQixHQUFHLENBQUMwSCxTQUFTLENBQUN6RSxDQUFDLENBQUMsQ0FBQztNQUN4QjtNQUNBLElBQUksQ0FBQzBGLDhCQUE4QixDQUFDakIsU0FBUyxDQUFDekUsQ0FBQyxDQUFDLEVBQUVBLENBQUMsQ0FBQztJQUN4RDs7SUFFQTtJQUNBLElBQUksQ0FBQzdDLGtCQUFrQixHQUFHc0gsU0FBUztFQUN2QyxDQUFDOztFQUVEO0VBQ0E7RUFDQTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXRKLFlBQVksQ0FBQ2MsU0FBUyxDQUFDMEosU0FBUyxHQUFHLFVBQVVDLEtBQUssRUFBRTtJQUNoRDdFLFFBQVEsQ0FBQzhFLGNBQWMsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUN4SCxJQUFJLENBQUMsQ0FBQ3lILEtBQUssR0FBR0YsS0FBSztFQUMzRSxDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXpLLFlBQVksQ0FBQ2MsU0FBUyxDQUFDOEosWUFBWSxHQUFHLFVBQVVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFO0lBQzVELElBQUlDLElBQUksR0FBRyxJQUFJLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDRixJQUFJLENBQUNHLFNBQVMsQ0FBQ0wsUUFBUSxDQUFDO0lBQ3hCRSxJQUFJLENBQUNJLE9BQU8sQ0FBQ0wsSUFBSSxDQUFDO0VBQ3RCLENBQUM7O0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0k5SyxZQUFZLENBQUNjLFNBQVMsQ0FBQ3NLLFVBQVUsR0FBRyxVQUFVUCxRQUFRLEVBQUVRLElBQUksRUFBRTtJQUMxRCxJQUFJL0osR0FBRyxHQUFHLElBQUksQ0FBQzBKLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLElBQUlyRixPQUFPLEdBQUcsSUFBSTs7SUFFbEI7SUFDQSxJQUFJLElBQUksQ0FBQzFCLE9BQU8sSUFBSSxJQUFJLEVBQUU7TUFDdEIzQyxHQUFHLENBQUNnSyxhQUFhLENBQUMsSUFBSSxDQUFDckgsT0FBTyxDQUFDO01BQy9CLElBQUksQ0FBQ0EsT0FBTyxHQUFHLElBQUk7SUFDdkI7SUFFQSxJQUFJNEcsUUFBUSxFQUFFO01BQ1Y7TUFDQSxJQUFJVSxTQUFTLEdBQUczRixRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDN0MwRixTQUFTLENBQUNDLEdBQUcsR0FBRyxJQUFJLENBQUNySCxVQUFVOztNQUUvQjtNQUNBLElBQUlvSCxTQUFTLENBQUMxRSxnQkFBZ0IsRUFBRTtRQUM1QjBFLFNBQVMsQ0FBQzFFLGdCQUFnQixDQUN0QixPQUFPLEVBQ1AsWUFBWTtVQUNSbEIsT0FBTyxDQUFDOEYscUJBQXFCLENBQUNKLElBQUksQ0FBQztRQUN2QyxDQUNKLENBQUM7TUFDTCxDQUFDLE1BQU0sSUFBSUUsU0FBUyxDQUFDeEUsV0FBVyxFQUFFO1FBQzlCO1FBQ0F3RSxTQUFTLENBQUN4RSxXQUFXLENBQ2pCLFNBQVMsRUFDVCxZQUFZO1VBQ1JwQixPQUFPLENBQUM4RixxQkFBcUIsQ0FBQ0osSUFBSSxDQUFDO1FBQ3ZDLENBQ0osQ0FBQztNQUNMOztNQUVBO01BQ0EsSUFBSSxDQUFDcEgsT0FBTyxHQUFHLElBQUl5SCxpREFBTyxDQUFDO1FBQ3ZCYixRQUFRLEVBQUdBLFFBQVE7UUFDbkJjLE1BQU0sRUFBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JCbkwsT0FBTyxFQUFHK0ssU0FBUztRQUNuQkssU0FBUyxFQUFHO01BQ2hCLENBQUMsQ0FBQztNQUNGdEssR0FBRyxDQUFDdUssVUFBVSxDQUFDLElBQUksQ0FBQzVILE9BQU8sQ0FBQztJQUNoQztFQUNKLENBQUM7O0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lqRSxZQUFZLENBQUNjLFNBQVMsQ0FBQ2dMLFFBQVEsR0FBRyxVQUFVVCxJQUFJLEVBQUU7SUFDOUMsSUFBSS9KLEdBQUcsR0FBRyxJQUFJLENBQUMwSixNQUFNLENBQUMsQ0FBQztJQUN2QixJQUFJZSxHQUFHLEdBQUcsSUFBSSxDQUFDN0wsT0FBTyxDQUFDZ0MsTUFBTTtJQUM3QixJQUFJNEksSUFBSSxHQUFHLElBQUk7O0lBRWY7SUFDQTtJQUNBO0lBQ0E7O0lBRUEsSUFBSSxPQUFPaUIsR0FBRyxLQUFLLFVBQVUsRUFBRTtNQUMzQmxNLE1BQU0sQ0FBQ21NLEtBQUssQ0FBQyxlQUFlLENBQUM7TUFDN0JsQixJQUFJLEdBQUdpQixHQUFHLENBQUNyTCxJQUFJLENBQUMsSUFBSSxFQUFFMkssSUFBSSxDQUFDO0lBQy9CO0lBRUEsSUFBSSxPQUFPVSxHQUFHLEtBQUssUUFBUSxFQUFFO01BQ3pCbE0sTUFBTSxDQUFDbU0sS0FBSyxDQUFDLFlBQVksQ0FBQztNQUMxQmxCLElBQUksR0FBR2lCLEdBQUc7SUFDZDtJQUVBLElBQUksT0FBT0EsR0FBRyxLQUFLLFFBQVEsRUFBRTtNQUN6QjtNQUNBO01BQ0E7TUFDQTtNQUNBOztNQUVBLElBQUlBLEdBQUcsS0FBSyxNQUFNLEVBQUU7UUFDaEJsTSxNQUFNLENBQUNtTSxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3pCbEIsSUFBSSxHQUFHdEYsd0VBQWlCLENBQUN5RyxzQkFBc0IsQ0FBQ1osSUFBSSxDQUFDO01BQ3pELENBQUMsTUFBTTtRQUNIeEwsTUFBTSxDQUFDbU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDO1FBQ2xDLElBQUlyQixLQUFLLEdBQUd1QixRQUFRLENBQUNILEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDSSxLQUFLLENBQUN4QixLQUFLLENBQUMsRUFBRTtVQUNmOUssTUFBTSxDQUFDbU0sS0FBSyxDQUFDLGNBQWMsQ0FBQztVQUM1QmxCLElBQUksR0FBR0gsS0FBSztRQUNoQjtNQUNKO0lBQ0o7O0lBRUE7SUFDQXlCLE1BQU0sQ0FBQ0MsU0FBUyxHQUFHRCxNQUFNLENBQUNDLFNBQVMsSUFBSSxVQUFVMUIsS0FBSyxFQUFFO01BQ3BELE9BQU8sT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFDNUIyQixRQUFRLENBQUMzQixLQUFLLENBQUMsSUFDZjRCLElBQUksQ0FBQ0MsS0FBSyxDQUFDN0IsS0FBSyxDQUFDLEtBQUtBLEtBQUs7SUFDbkMsQ0FBQzs7SUFFRDtJQUNBO0lBQ0EsSUFBSSxDQUFDRyxJQUFJLElBQUlBLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQ3NCLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDdkIsSUFBSSxDQUFDLEVBQUU7TUFDakRqTCxNQUFNLENBQUNtTSxLQUFLLENBQUMsaUNBQWlDLENBQUM7TUFDL0NsQixJQUFJLEdBQUd4SixHQUFHLENBQUMySixPQUFPLENBQUMsQ0FBQyxDQUFDd0IsT0FBTyxDQUFDLENBQUM7SUFDbEM7O0lBRUE7SUFDQSxJQUFJQyxHQUFHLEdBQUdwTCxHQUFHLENBQUNxTCxPQUFPLENBQUMsQ0FBQztJQUN2QixJQUFJQyxHQUFHLEdBQUd0TCxHQUFHLENBQUN1TCxPQUFPLENBQUMsQ0FBQztJQUN2QixJQUFJL0IsSUFBSSxHQUFHNEIsR0FBRyxFQUFFO01BQ1o3TSxNQUFNLENBQUNtTSxLQUFLLENBQUMsbUJBQW1CLENBQUM7TUFDakNsQixJQUFJLEdBQUc0QixHQUFHO0lBQ2Q7SUFDQSxJQUFJNUIsSUFBSSxHQUFHOEIsR0FBRyxFQUFFO01BQ1ovTSxNQUFNLENBQUNtTSxLQUFLLENBQUMsbUJBQW1CLENBQUM7TUFDakNsQixJQUFJLEdBQUc4QixHQUFHO0lBQ2Q7SUFFQS9NLE1BQU0sQ0FBQ21NLEtBQUssQ0FBQyxNQUFNLEVBQUVsQixJQUFJLENBQUM7SUFDMUIsT0FBT0EsSUFBSTtFQUNmLENBQUM7O0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJOUssWUFBWSxDQUFDYyxTQUFTLENBQUMySyxxQkFBcUIsR0FBRyxVQUFVcUIsV0FBVyxFQUFFO0lBQ2xFLElBQUl4TCxHQUFHLEdBQUcsSUFBSSxDQUFDMEosTUFBTSxDQUFDLENBQUM7SUFFdkIsSUFBSStCLFlBQVksR0FBRyxFQUFFO0lBQ3JCLElBQUksT0FBT0QsV0FBVyxLQUFLLFFBQVEsRUFBRTtNQUNqQyxJQUFJQSxXQUFXLENBQUNFLE9BQU8sS0FBSyxrQkFBa0IsRUFBRTtRQUM1Q0QsWUFBWSxHQUFHLE1BQU07UUFDckIsSUFBSUUsVUFBVSxHQUFHSCxXQUFXLENBQUNJLFFBQVEsQ0FBQ0MsZUFBZTtRQUNyRCxLQUFLLElBQUlDLElBQUksSUFBSUgsVUFBVSxFQUFFO1VBQ3pCLElBQUlBLFVBQVUsQ0FBQ0ksY0FBYyxDQUFDRCxJQUFJLENBQUMsRUFBRTtZQUNqQyxJQUFJQSxJQUFJLEtBQUssY0FBYyxJQUFJQSxJQUFJLEtBQUssYUFBYSxJQUFJQSxJQUFJLEtBQUssa0JBQWtCLElBQUlBLElBQUksS0FBSyxRQUFRLEVBQUU7Y0FDdkdMLFlBQVksSUFBSSxNQUFNO2NBQ3RCQSxZQUFZLElBQUkseUNBQXlDLEdBQUdLLElBQUksQ0FBQ0UsV0FBVyxDQUFDLENBQUMsR0FBRyxZQUFZO2NBQzdGUCxZQUFZLElBQUlFLFVBQVUsQ0FBQ0csSUFBSSxDQUFDO2NBQ2hDTCxZQUFZLElBQUksUUFBUTtZQUM1QjtVQUNKO1FBQ0o7UUFDQUEsWUFBWSxJQUFJLFFBQVE7TUFDNUIsQ0FBQyxNQUFNLElBQUlELFdBQVcsQ0FBQ0UsT0FBTyxLQUFLLG1CQUFtQixFQUFFO1FBQ3BERCxZQUFZLEdBQUdRLG1FQUFZLENBQUNDLDRCQUE0QixDQUFDVixXQUFXLENBQUNJLFFBQVEsQ0FBQztNQUNsRixDQUFDLE1BQU07UUFDSEgsWUFBWSxHQUFHLG9CQUFvQjtNQUN2QztJQUNKLENBQUMsTUFBTTtNQUNIQSxZQUFZLEdBQUdELFdBQVc7SUFDOUI7SUFFQSxJQUFJLENBQUN0SSxhQUFhLENBQUNpSixTQUFTLEdBQUdWLFlBQVk7SUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQ3BJLGFBQWEsRUFBRTtNQUNyQjtNQUNBLElBQUksQ0FBQ0EsYUFBYSxHQUFHLElBQUkrRyxpREFBTyxDQUFDO1FBQzdCbEwsT0FBTyxFQUFHLElBQUksQ0FBQ2lFLFNBQVM7UUFDeEJpSixXQUFXLEVBQUcsZUFBZTtRQUM3QjdDLFFBQVEsRUFBRyxJQUFJLENBQUM1RyxPQUFPLENBQUMwSixXQUFXLENBQUMsQ0FBQztRQUNyQ2hDLE1BQU0sRUFBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7TUFDcEIsQ0FBQyxDQUFDO01BQ0ZySyxHQUFHLENBQUN1SyxVQUFVLENBQUMsSUFBSSxDQUFDbEgsYUFBYSxDQUFDO0lBQ3RDLENBQUMsTUFBTTtNQUNIO01BQ0EsSUFBSSxDQUFDQSxhQUFhLENBQUN1QixXQUFXLENBQUMsSUFBSSxDQUFDakMsT0FBTyxDQUFDMEosV0FBVyxDQUFDLENBQUMsQ0FBQztJQUM5RDtFQUNKLENBQUM7O0VBRUQ7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0kzTixZQUFZLENBQUNjLFNBQVMsQ0FBQzhNLHVCQUF1QixHQUFHLFlBQVk7SUFDekQsSUFBSXRNLEdBQUcsR0FBRyxJQUFJLENBQUMwSixNQUFNLENBQUMsQ0FBQztJQUN2QjtJQUNBNkMsMkRBQVksQ0FBQ0MsS0FBSyxDQUFDeE0sR0FBRyxDQUFDO0lBQ3ZCLElBQUksQ0FBQ0csU0FBUyxHQUFHLElBQUksQ0FBQ0ksc0JBQXNCLENBQUMyRSxPQUFPO0lBQ3BEO0lBQ0E7SUFDQSxJQUFJLENBQUN1SCxhQUFhLENBQUMsa0JBQWtCLENBQUM7RUFDMUMsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSS9OLFlBQVksQ0FBQ2MsU0FBUyxDQUFDa04sa0JBQWtCLEdBQUcsWUFBWTtJQUNwRCxJQUFJLENBQUN6TSxhQUFhLENBQUMsQ0FBQztFQUN4QixDQUFDOztFQUVEO0VBQ0E7RUFDQTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0l2QixZQUFZLENBQUNjLFNBQVMsQ0FBQ2dHLHdCQUF3QixHQUFHLFlBQVk7SUFDMUQsSUFBSW1ILHdCQUF3QixHQUFHckksUUFBUSxDQUFDOEUsY0FBYyxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQ3hILElBQUksQ0FBQztJQUN4RixJQUFJK0ssd0JBQXdCLElBQUksQ0FBQ0Esd0JBQXdCLENBQUNDLFFBQVEsSUFBSUQsd0JBQXdCLENBQUN0RCxLQUFLLENBQUMxSCxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzdHLElBQUksQ0FBQ3VHLHlCQUF5QixDQUFDLENBQUM7SUFDcEM7RUFDSixDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJeEosWUFBWSxDQUFDYyxTQUFTLENBQUNxTix3QkFBd0IsR0FBRyxVQUFVakUsQ0FBQyxFQUFFO0lBQzNELElBQUlTLEtBQUssR0FBR1QsQ0FBQyxDQUFDdkosTUFBTSxDQUFDZ0ssS0FBSztJQUMxQixJQUFJLENBQUNBLEtBQUssRUFBRTtNQUNSO0lBQ0o7O0lBRUE7SUFDQSxJQUFJLENBQUMvRyx5QkFBeUIsR0FBRytHLEtBQUs7O0lBRXRDO0lBQ0EsSUFBSUEsS0FBSyxDQUFDMUgsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNsQixJQUFJLENBQUNtTCx1QkFBdUIsQ0FBQyxDQUFDO01BQzlCO0lBQ0o7SUFFQSxJQUFJQyxlQUFlLEdBQUcsSUFBSSxDQUFDbk8sT0FBTyxDQUFDd0MsbUJBQW1CLENBQUNDLGNBQWM7SUFDckUsSUFBSTJMLGFBQWEsR0FBRyxJQUFJLENBQUNwTyxPQUFPLENBQUN3QyxtQkFBbUIsQ0FBQ0UsWUFBWTs7SUFFakU7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUkrQyxPQUFPLEdBQUcsSUFBSTtJQUNsQixJQUFJLENBQUNrRCxvQkFBb0IsQ0FBQztNQUN0QkUsSUFBSSxFQUFHNEIsS0FBSztNQUNaO01BQ0FYLFNBQVMsRUFBRyxTQUFBQSxVQUFVdUUsT0FBTyxFQUFFO1FBQzNCMU8sTUFBTSxDQUFDK0IsR0FBRyxDQUFDLDJCQUEyQixFQUFFMk0sT0FBTyxDQUFDO1FBQ2hELElBQUlBLE9BQU8sRUFBRTtVQUNUO1VBQ0E1SSxPQUFPLENBQUNuQyxtQkFBbUIsR0FBRytLLE9BQU8sQ0FBQ0Msa0JBQWtCO1VBQ3hEN0ksT0FBTyxDQUFDOEksdUJBQXVCLEdBQUcsRUFBRTtVQUNwQztVQUNBLEtBQUssSUFBSTVKLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2MsT0FBTyxDQUFDbkMsbUJBQW1CLENBQUNQLE1BQU0sRUFBRTRCLENBQUMsRUFBRSxFQUFFO1lBQ3pELElBQUk2SixTQUFTLEdBQUcvSSxPQUFPLENBQUNuQyxtQkFBbUIsQ0FBQ3FCLENBQUMsQ0FBQztZQUM5QyxJQUFJNkosU0FBUyxDQUFDN0QsUUFBUSxJQUFJNkQsU0FBUyxDQUFDN0QsUUFBUSxDQUFDOEQsQ0FBQyxLQUFLLENBQUMsSUFBSUQsU0FBUyxDQUFDN0QsUUFBUSxDQUFDK0QsQ0FBQyxLQUFLLENBQUMsSUFBSUYsU0FBUyxDQUFDRyxRQUFRLEVBQUU7Y0FDdEc7Y0FDQWxKLE9BQU8sQ0FBQ21KLGtDQUFrQyxDQUFDSixTQUFTLEVBQUU3SixDQUFDLENBQUM7WUFDNUQsQ0FBQyxNQUFNO2NBQ0g7Y0FDQWMsT0FBTyxDQUFDOEksdUJBQXVCLENBQUNwSixJQUFJLENBQUNxSixTQUFTLENBQUM7WUFDbkQ7VUFDSjtVQUFDO1VBQ0Q7VUFDQS9JLE9BQU8sQ0FBQzBELHVDQUF1QyxDQUFDMUQsT0FBTyxDQUFDOEksdUJBQXVCLENBQUM7VUFDaEY7VUFDQTtVQUNBLElBQUk5SSxPQUFPLENBQUNmLGVBQWUsRUFBRTtZQUN6Qm1LLFlBQVksQ0FBQ3BKLE9BQU8sQ0FBQ2YsZUFBZSxDQUFDO1lBQ3JDZSxPQUFPLENBQUNmLGVBQWUsR0FBRyxJQUFJO1lBQzlCL0UsTUFBTSxDQUFDbVAsSUFBSSxDQUFDLDRCQUE0QixDQUFDO1VBQzdDO1FBQ0o7TUFDSixDQUFDO01BQ0Q7TUFDQWxGLFNBQVMsRUFBRyxTQUFBQSxVQUFVbUYsS0FBSyxFQUFFO1FBQ3pCO1FBQ0E7UUFDQXRKLE9BQU8sQ0FBQ3lJLHVCQUF1QixDQUFDLENBQUM7UUFDakN2TyxNQUFNLENBQUMrQixHQUFHLENBQUNxTixLQUFLLENBQUNDLE9BQU8sQ0FBQztRQUN6QjtRQUNBO1FBQ0EsSUFBSUQsS0FBSyxDQUFDQyxPQUFPLEtBQUssbUNBQW1DLElBQUliLGVBQWUsQ0FBQyw2QkFBNkI7VUFDdEcsSUFBSTFJLE9BQU8sQ0FBQ2YsZUFBZSxFQUFFO1lBQ3pCbUssWUFBWSxDQUFDcEosT0FBTyxDQUFDZixlQUFlLENBQUM7WUFDckMvRSxNQUFNLENBQUNtUCxJQUFJLENBQUMsbUNBQW1DLENBQUM7VUFDcEQ7VUFDQXJKLE9BQU8sQ0FBQ2YsZUFBZSxHQUFHdUssVUFBVSxDQUNoQyxZQUFZO1lBQ1J0UCxNQUFNLENBQUNtUCxJQUFJLENBQUMsMENBQTBDLENBQUM7WUFDdkRySixPQUFPLENBQUMrRCxpQkFBaUIsQ0FBQztjQUN0QndELFFBQVEsRUFBR3ZDLEtBQUs7Y0FDaEI7Y0FDQVgsU0FBUyxFQUFHLFNBQUFBLFVBQVV1RSxPQUFPLEVBQUU7Z0JBQzNCMU8sTUFBTSxDQUFDK0IsR0FBRyxDQUFDLHdCQUF3QixFQUFFMk0sT0FBTyxDQUFDO2dCQUM3QyxJQUFJQSxPQUFPLEVBQUU7a0JBQ1Q1SSxPQUFPLENBQUM4SSx1QkFBdUIsR0FBRyxFQUFFO2tCQUNwQztrQkFDQTtrQkFDQSxJQUFJbkYsU0FBUyxHQUFHaUYsT0FBTyxDQUFDakYsU0FBUztrQkFDakMsS0FBSyxJQUFJekUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeUUsU0FBUyxDQUFDckcsTUFBTSxFQUFFNEIsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUlxSSxRQUFRLEdBQUc1RCxTQUFTLENBQUN6RSxDQUFDLENBQUM7b0JBQzNCcUksUUFBUSxDQUFDMkIsUUFBUSxHQUFHdEIsbUVBQVksQ0FBQzZCLDJCQUEyQixDQUFDbEMsUUFBUSxDQUFDO29CQUN0RUEsUUFBUSxDQUFDckMsUUFBUSxHQUFHO3NCQUNoQjhELENBQUMsRUFBR3pCLFFBQVEsQ0FBQ3JDLFFBQVEsQ0FBQ3dFLEdBQUc7c0JBQ3pCVCxDQUFDLEVBQUcxQixRQUFRLENBQUNyQyxRQUFRLENBQUN5RTtvQkFDMUIsQ0FBQztvQkFDRDNKLE9BQU8sQ0FBQzhJLHVCQUF1QixDQUFDcEosSUFBSSxDQUFDNkgsUUFBUSxDQUFDO2tCQUNsRDtrQkFDQXZILE9BQU8sQ0FBQzBELHVDQUF1QyxDQUFDQyxTQUFTLENBQUM7Z0JBQzlEO2NBQ0osQ0FBQztjQUNEO2NBQ0FRLFNBQVMsRUFBRyxTQUFBQSxVQUFVbUYsS0FBSyxFQUFFO2dCQUN6QnBQLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQ3FOLEtBQUssQ0FBQ0MsT0FBTyxDQUFDO2NBQzdCO1lBQ0osQ0FBQyxDQUFDO1VBQ04sQ0FBQyxFQUFFWixhQUNQLENBQUM7UUFDTDtNQUNKO0lBQ0osQ0FBQyxDQUFDO0lBRUYsSUFBSWhOLEdBQUcsR0FBRyxJQUFJLENBQUMwSixNQUFNLENBQUMsQ0FBQztJQUN2QjFKLEdBQUcsQ0FBQ2lPLEVBQUUsQ0FDRixPQUFPLEVBQ1AsSUFBSSxDQUFDQyxzQkFBc0IsRUFDM0IsSUFDSixDQUFDO0lBQ0RsTyxHQUFHLENBQUNpTyxFQUFFLENBQ0YsYUFBYSxFQUNiLElBQUksQ0FBQ0Msc0JBQXNCLEVBQzNCLElBQ0osQ0FBQztFQUNMLENBQUM7O0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXhQLFlBQVksQ0FBQ2MsU0FBUyxDQUFDZ08sa0NBQWtDLEdBQUcsVUFBVVcsaUJBQWlCLEVBQUU1SyxDQUFDLEVBQUU7SUFDeEYsSUFBSWMsT0FBTyxHQUFHLElBQUk7SUFDbEJ1RCw0REFBRSxDQUFDQyxRQUFRLENBQUMvRyxPQUFPLENBQUM7TUFDaEI0RyxNQUFNLEVBQUcsSUFBSSxDQUFDOUksT0FBTyxDQUFDOEksTUFBTTtNQUM1QkMsR0FBRyxFQUFHLElBQUksQ0FBQy9JLE9BQU8sQ0FBQytJLEdBQUc7TUFDdEJ5RyxDQUFDLEVBQUduQyxtRUFBWSxDQUFDQyw0QkFBNEIsQ0FBQ2lDLGlCQUFpQixDQUFDO01BQ2hFckYsS0FBSyxFQUFHcUYsaUJBQWlCLENBQUN6SixJQUFJO01BQzlCO01BQ0FnRSxTQUFTLEVBQUcsU0FBQUEsVUFBVTJGLFFBQVEsRUFBRTtRQUM1QjlQLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQywyQ0FBMkMsRUFBRStOLFFBQVEsQ0FBQztRQUNqRSxJQUFJQSxRQUFRLENBQUNyRyxTQUFTLElBQUlxRyxRQUFRLENBQUNyRyxTQUFTLENBQUNyRyxNQUFNLEtBQUssQ0FBQyxJQUFJME0sUUFBUSxDQUFDckcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDdUIsUUFBUSxFQUFFO1VBQ3pGO1VBQ0E7VUFDQSxJQUFJbEYsT0FBTyxDQUFDbkMsbUJBQW1CLElBQUltQyxPQUFPLENBQUNuQyxtQkFBbUIsQ0FBQ3FCLENBQUMsQ0FBQyxFQUFFO1lBQy9EYyxPQUFPLENBQUNuQyxtQkFBbUIsQ0FBQ3FCLENBQUMsQ0FBQyxDQUFDZ0csUUFBUSxHQUFHO2NBQ3RDd0UsR0FBRyxFQUFHTSxRQUFRLENBQUNyRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUN1QixRQUFRLENBQUMrRCxDQUFDO2NBQ3RDVSxHQUFHLEVBQUdLLFFBQVEsQ0FBQ3JHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ3VCLFFBQVEsQ0FBQzhEO1lBQ3pDLENBQUM7WUFDRDtZQUNBaEosT0FBTyxDQUFDOEksdUJBQXVCLENBQUNtQixPQUFPLENBQUNqSyxPQUFPLENBQUNuQyxtQkFBbUIsQ0FBQ3FCLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFYyxPQUFPLENBQUMwRCx1Q0FBdUMsQ0FBQzFELE9BQU8sQ0FBQzhJLHVCQUF1QixDQUFDO1VBQ3BGO1FBQ0o7TUFDSixDQUFDO01BQ0Q7TUFDQTNFLFNBQVMsRUFBRyxTQUFBQSxVQUFBLEVBQVk7UUFDcEI7UUFDQSxJQUFJbkUsT0FBTyxDQUFDbkMsbUJBQW1CLElBQUltQyxPQUFPLENBQUNuQyxtQkFBbUIsQ0FBQ3FCLENBQUMsQ0FBQyxFQUFFO1VBQy9EYyxPQUFPLENBQUM4RCxtQ0FBbUMsQ0FBQzlELE9BQU8sQ0FBQ25DLG1CQUFtQixDQUFDcUIsQ0FBQyxDQUFDLEVBQUVBLENBQUMsQ0FBQztRQUNsRjtNQUNKO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0k3RSxZQUFZLENBQUNjLFNBQVMsQ0FBQytPLCtCQUErQixHQUFHLFVBQVUzRixDQUFDLEVBQUU7SUFDbEU7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQSxJQUFJNEYsR0FBRyxHQUFHM00sZ0VBQVUsQ0FBQ2lILEtBQUssQ0FBQ0YsQ0FBQyxDQUFDdkosTUFBTSxDQUFDMkUsRUFBRSxDQUFDO0lBQ3ZDekYsTUFBTSxDQUFDK0IsR0FBRyxDQUFDa08sR0FBRyxDQUFDO0lBQ2ZqUSxNQUFNLENBQUMrQixHQUFHLENBQUMsSUFBSSxDQUFDNk0sdUJBQXVCLENBQUNxQixHQUFHLENBQUMsQ0FBQztJQUU3QyxJQUFJLENBQUNBLEdBQUcsRUFBRTtNQUNOO0lBQ0o7SUFFQSxJQUFJakYsUUFBUSxHQUFHLENBQ1gsSUFBSSxDQUFDNEQsdUJBQXVCLENBQUNxQixHQUFHLENBQUMsQ0FBQ2pGLFFBQVEsQ0FBQzhELENBQUMsRUFDNUMsSUFBSSxDQUFDRix1QkFBdUIsQ0FBQ3FCLEdBQUcsQ0FBQyxDQUFDakYsUUFBUSxDQUFDK0QsQ0FBQyxDQUMvQztJQUNELElBQUl2RCxJQUFJLEdBQUc7TUFDUDJCLE9BQU8sRUFBRyxtQkFBbUI7TUFDN0JFLFFBQVEsRUFBRyxJQUFJLENBQUN1Qix1QkFBdUIsQ0FBQ3FCLEdBQUc7SUFDL0MsQ0FBQzs7SUFFRDtJQUNBLElBQUlyRixLQUFLLEdBQUc4QyxtRUFBWSxDQUFDQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUNpQix1QkFBdUIsQ0FBQ3FCLEdBQUcsQ0FBQyxDQUFDO0lBQ3hGLElBQUksQ0FBQ3RGLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDOztJQUVyQjtJQUNBLElBQUksQ0FBQzdHLHlCQUF5QixHQUFHNkcsS0FBSzs7SUFFdEM7SUFDQSxJQUFJTSxJQUFJLEdBQUcsSUFBSSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxJQUFJOEUsT0FBTyxHQUFHaEYsSUFBSSxDQUFDaUYsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUM7SUFDNUMsSUFBSUYsT0FBTyxLQUFLLFdBQVcsRUFBRTtNQUN6QjtNQUNBbEYsUUFBUSxHQUFHcUYseURBQWUsQ0FBQ3JGLFFBQVEsRUFBRSxXQUFXLEVBQUVrRixPQUFPLENBQUM7SUFDOUQ7SUFDQTtJQUNBLElBQUlqRixJQUFJLEdBQUcsSUFBSSxDQUFDZ0IsUUFBUSxDQUFDVCxJQUFJLENBQUM7SUFDOUIsSUFBSSxDQUFDVCxZQUFZLENBQUNDLFFBQVEsRUFBRUMsSUFBSSxDQUFDO0lBQ2pDLElBQUksSUFBSSxDQUFDdkcsY0FBYyxFQUFFO01BQ3JCLElBQUksQ0FBQzZHLFVBQVUsQ0FBQ1AsUUFBUSxFQUFFUSxJQUFJLENBQUM7SUFDbkM7SUFDQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDUSxJQUFJLENBQUMwQyxhQUFhLENBQUM7TUFDZi9ILElBQUksRUFBRyxpQ0FBaUM7TUFDeENrSCxRQUFRLEVBQUcsSUFBSSxDQUFDdUIsdUJBQXVCLENBQUNxQixHQUFHO0lBQy9DLENBQUMsQ0FBQztFQUNOLENBQUM7O0VBRUQ7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJOVAsWUFBWSxDQUFDYyxTQUFTLENBQUNxUCx1QkFBdUIsR0FBRyxVQUFVakcsQ0FBQyxFQUFFO0lBQzFELElBQUlTLEtBQUssR0FBR1QsQ0FBQyxDQUFDdkosTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDZ0ssS0FBSztJQUM3QixJQUFJLENBQUNBLEtBQUssRUFBRTtNQUNSO0lBQ0o7O0lBRUE7SUFDQSxJQUFJLENBQUMvRyx5QkFBeUIsR0FBRytHLEtBQUs7O0lBRXRDO0lBQ0EsSUFBSWhGLE9BQU8sR0FBRyxJQUFJO0lBQ2xCLElBQUksQ0FBQytELGlCQUFpQixDQUFDO01BQ25CQyxLQUFLLEVBQUdnQixLQUFLO01BQ2I7TUFDQVgsU0FBUyxFQUFHLFNBQUFBLFVBQVV1RSxPQUFPLEVBQUU7UUFDM0IxTyxNQUFNLENBQUMrQixHQUFHLENBQUMsd0JBQXdCLEVBQUUyTSxPQUFPLENBQUM7UUFDN0MsSUFBSUEsT0FBTyxFQUFFO1VBQ1QsSUFBSWpGLFNBQVMsR0FBR2lGLE9BQU8sQ0FBQ2pGLFNBQVM7VUFDakMzRCxPQUFPLENBQUMwRSxrQ0FBa0MsQ0FBQ2YsU0FBUyxDQUFDO1FBQ3pEO01BQ0osQ0FBQztNQUNEO01BQ0FRLFNBQVMsRUFBRyxTQUFBQSxVQUFVbUYsS0FBSyxFQUFFO1FBQ3pCO1FBQ0F0SixPQUFPLENBQUMyRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hDekssTUFBTSxDQUFDK0IsR0FBRyxDQUFDcU4sS0FBSyxDQUFDQyxPQUFPLENBQUM7TUFDN0I7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSWxQLFlBQVksQ0FBQ2MsU0FBUyxDQUFDc1AsMEJBQTBCLEdBQUcsVUFBVWxHLENBQUMsRUFBRTtJQUM3RCxJQUFJNEYsR0FBRyxHQUFHM00sZ0VBQVUsQ0FBQ2lILEtBQUssQ0FBQ0YsQ0FBQyxDQUFDdkosTUFBTSxDQUFDMkUsRUFBRSxDQUFDO0lBRXZDLElBQUksQ0FBQ3dLLEdBQUcsRUFBRTtNQUNOO0lBQ0o7SUFFQSxJQUFJakYsUUFBUSxHQUFHLENBQ1gsSUFBSSxDQUFDN0ksa0JBQWtCLENBQUM4TixHQUFHLENBQUMsQ0FBQ2pGLFFBQVEsQ0FBQ3dFLEdBQUcsRUFDekMsSUFBSSxDQUFDck4sa0JBQWtCLENBQUM4TixHQUFHLENBQUMsQ0FBQ2pGLFFBQVEsQ0FBQ3lFLEdBQUcsQ0FDNUM7SUFDRCxJQUFJakUsSUFBSSxHQUFHO01BQ1AyQixPQUFPLEVBQUcsa0JBQWtCO01BQzVCRSxRQUFRLEVBQUcsSUFBSSxDQUFDbEwsa0JBQWtCLENBQUM4TixHQUFHO0lBQzFDLENBQUM7O0lBRUQ7SUFDQSxJQUFJckYsS0FBSyxHQUFHOEMsbUVBQVksQ0FBQzZCLDJCQUEyQixDQUFDLElBQUksQ0FBQ3BOLGtCQUFrQixDQUFDOE4sR0FBRyxDQUFDLENBQUM7SUFDbEYsSUFBSSxDQUFDdEYsU0FBUyxDQUFDQyxLQUFLLENBQUM7O0lBRXJCO0lBQ0EsSUFBSU0sSUFBSSxHQUFHLElBQUksQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUM7SUFDbEMsSUFBSThFLE9BQU8sR0FBR2hGLElBQUksQ0FBQ2lGLGFBQWEsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLElBQUlGLE9BQU8sS0FBSyxXQUFXLEVBQUU7TUFDekI7TUFDQWxGLFFBQVEsR0FBR3FGLHlEQUFlLENBQUNyRixRQUFRLEVBQUUsV0FBVyxFQUFFa0YsT0FBTyxDQUFDO0lBQzlEO0lBQ0E7SUFDQSxJQUFJakYsSUFBSSxHQUFHLElBQUksQ0FBQ2dCLFFBQVEsQ0FBQ1QsSUFBSSxDQUFDO0lBQzlCLElBQUksQ0FBQ1QsWUFBWSxDQUFDQyxRQUFRLEVBQUVDLElBQUksQ0FBQztJQUNqQyxJQUFJLElBQUksQ0FBQ3ZHLGNBQWMsRUFBRTtNQUNyQixJQUFJLENBQUM2RyxVQUFVLENBQUNQLFFBQVEsRUFBRVEsSUFBSSxDQUFDO0lBQ25DO0lBQ0E7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ1EsSUFBSSxDQUFDMEMsYUFBYSxDQUFDO01BQ2YvSCxJQUFJLEVBQUcsNEJBQTRCO01BQ25Da0gsUUFBUSxFQUFHLElBQUksQ0FBQ2xMLGtCQUFrQixDQUFDOE4sR0FBRztJQUMxQyxDQUFDLENBQUM7RUFDTixDQUFDOztFQUVEO0VBQ0E7RUFDQTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSTlQLFlBQVksQ0FBQ2MsU0FBUyxDQUFDdVAsbUNBQW1DLEdBQUcsVUFBVW5HLENBQUMsRUFBRTtJQUN0RXJLLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQ3NJLENBQUMsQ0FBQztJQUNiLElBQUk0RixHQUFHLEdBQUc1RixDQUFDLENBQUN2SixNQUFNLENBQUMyUCxhQUFhO0lBQ2hDLElBQUkzRixLQUFLLEdBQUdULENBQUMsQ0FBQ3ZKLE1BQU0sQ0FBQ1QsT0FBTyxDQUFDNFAsR0FBRyxDQUFDLENBQUNuRixLQUFLO0lBRXZDLElBQUksQ0FBQ0EsS0FBSyxFQUFFO01BQ1I7SUFDSjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQSxJQUFJLENBQUNqRCxVQUFVLENBQUNpRCxLQUFLLENBQUM7RUFDMUIsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJM0ssWUFBWSxDQUFDYyxTQUFTLENBQUN5UCwrQkFBK0IsR0FBRyxVQUFVckcsQ0FBQyxFQUFFc0csSUFBSSxFQUFFO0lBQ3hFM1EsTUFBTSxDQUFDK0IsR0FBRyxDQUFDNE8sSUFBSSxDQUFDO0lBQ2hCLElBQUksQ0FBQ0EsSUFBSSxJQUFJQSxJQUFJLENBQUN2TixNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzVCO0lBQ0o7SUFFQSxJQUFJd04sU0FBUztJQUNiLElBQUlDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFFdkIsS0FBSyxJQUFJN0wsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHMkwsSUFBSSxDQUFDdk4sTUFBTSxFQUFFNEIsQ0FBQyxFQUFFLEVBQUU7TUFDbEMsSUFBSThMLE1BQU0sR0FBR0gsSUFBSSxDQUFDM0wsQ0FBQyxDQUFDO01BQ3BCLElBQUk4TCxNQUFNLENBQUNoRyxLQUFLLEVBQUU7UUFDZCxJQUFJZ0csTUFBTSxDQUFDNUUsR0FBRyxLQUFLLFNBQVMsRUFBRTtVQUMxQjRFLE1BQU0sQ0FBQ2hHLEtBQUssR0FBR2dHLE1BQU0sQ0FBQ2hHLEtBQUssQ0FBQzJDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDO1FBQ0FvRCxjQUFjLENBQUNDLE1BQU0sQ0FBQzVFLEdBQUcsQ0FBQyxHQUFHNEUsTUFBTSxDQUFDaEcsS0FBSztNQUM3QztJQUNKO0lBRUEsSUFBSXNELHdCQUF3QixHQUFHckksUUFBUSxDQUFDOEUsY0FBYyxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQ3hILElBQUksQ0FBQztJQUN4RnVOLFNBQVMsR0FBR3hDLHdCQUF3QixDQUFDdEQsS0FBSzs7SUFFMUM7SUFDQSxJQUFJLElBQUksQ0FBQ2hILHFCQUFxQixLQUFLLGlCQUFpQixFQUFFO01BQ2xEOE0sU0FBUyxHQUFHLEVBQUU7SUFDbEI7O0lBRUE7SUFDQSxJQUFJOUssT0FBTyxHQUFHLElBQUk7SUFDbEIsSUFBSSxDQUFDK0QsaUJBQWlCLENBQUM7TUFDbkJDLEtBQUssRUFBRzhHLFNBQVM7TUFDakJyRyxLQUFLLEVBQUcsSUFBSSxDQUFDekcscUJBQXFCO01BQ2xDaU4sT0FBTyxFQUFHRixjQUFjO01BQ3hCO01BQ0ExRyxTQUFTLEVBQUcsU0FBQUEsVUFBVXVFLE9BQU8sRUFBRTtRQUMzQjFPLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQzJNLE9BQU8sQ0FBQztRQUNuQixJQUFJQSxPQUFPLEVBQUU7VUFDVCxJQUFJakYsU0FBUyxHQUFHaUYsT0FBTyxDQUFDakYsU0FBUztVQUNqQzNELE9BQU8sQ0FBQzBFLGtDQUFrQyxDQUFDZixTQUFTLENBQUM7UUFDekQ7TUFDSixDQUFDO01BQ0Q7TUFDQVEsU0FBUyxFQUFHLFNBQUFBLFVBQVVtRixLQUFLLEVBQUU7UUFDekI7UUFDQXRKLE9BQU8sQ0FBQzJFLHNCQUFzQixDQUFDLENBQUM7UUFDaEN6SyxNQUFNLENBQUMrQixHQUFHLENBQUNxTixLQUFLLENBQUNDLE9BQU8sQ0FBQztNQUM3QjtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUM7O0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lsUCxZQUFZLENBQUNjLFNBQVMsQ0FBQytQLGdDQUFnQyxHQUFHLFVBQVVDLGFBQWEsRUFBRTtJQUMvRTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7SUFFUSxJQUFJTCxTQUFTLEdBQUcsRUFBRTtJQUVsQixJQUFJTSxDQUFDO0lBQ0w7SUFDQSxJQUFJQyxHQUFHLEdBQUdGLGFBQWEsQ0FBQ0csVUFBVTtJQUNsQyxJQUFJRCxHQUFHLEVBQUU7TUFDTEQsQ0FBQyxHQUFHQyxHQUFHLENBQUMvTixNQUFNO01BQ2QsSUFBSThOLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDVE4sU0FBUyxHQUFHTyxHQUFHO01BQ25CLENBQUMsTUFBTSxJQUFJRCxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCO1FBQ0FOLFNBQVMsR0FBRyxHQUFHLEdBQUdPLEdBQUc7TUFDekIsQ0FBQyxNQUFNO1FBQ0hQLFNBQVMsR0FBR08sR0FBRyxDQUFDRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUNuQztJQUNKLENBQUMsTUFBTTtNQUNIVCxTQUFTLEdBQUcsSUFBSTtJQUNwQjs7SUFFQTtJQUNBLElBQUlVLE9BQU8sR0FBR0wsYUFBYSxDQUFDSyxPQUFPO0lBQ25DLElBQUlBLE9BQU8sRUFBRTtNQUNUSixDQUFDLEdBQUdJLE9BQU8sQ0FBQ2xPLE1BQU07TUFDbEIsSUFBSThOLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDVE4sU0FBUyxJQUFJVSxPQUFPO01BQ3hCLENBQUMsTUFBTSxJQUFJSixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCTixTQUFTLElBQUksR0FBRyxHQUFHVSxPQUFPO01BQzlCLENBQUMsTUFBTSxJQUFJSixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCTixTQUFTLElBQUksSUFBSSxHQUFHVSxPQUFPO01BQy9CLENBQUMsTUFBTTtRQUFFO1FBQ0xWLFNBQVMsSUFBSVUsT0FBTyxDQUFDRCxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUN4QztJQUNKLENBQUMsTUFBTTtNQUNIVCxTQUFTLElBQUksS0FBSztJQUN0Qjs7SUFFQTtJQUNBLElBQUlXLEtBQUssR0FBR04sYUFBYSxDQUFDTSxLQUFLO0lBQy9CLElBQUlBLEtBQUssRUFBRTtNQUNQLElBQUlBLEtBQUssQ0FBQ25PLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDcEJ3TixTQUFTLEdBQUdXLEtBQUs7TUFDckI7SUFDSjs7SUFFQTtJQUNBLElBQUlDLFlBQVksR0FBR1AsYUFBYSxDQUFDTyxZQUFZO0lBQzdDLElBQUlBLFlBQVksRUFBRTtNQUNkTixDQUFDLEdBQUdNLFlBQVksQ0FBQ3BPLE1BQU07TUFDdkIsSUFBSThOLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDVE4sU0FBUyxJQUFJWSxZQUFZO01BQzdCLENBQUMsTUFBTSxJQUFJTixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsSUFBSUEsQ0FBQyxLQUFLLENBQUMsRUFBRTtVQUNUTixTQUFTLElBQUksR0FBRyxHQUFHWSxZQUFZO1FBQ25DLENBQUMsTUFBTSxJQUFJTixDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ2hCTixTQUFTLElBQUksSUFBSSxHQUFHWSxZQUFZO1FBQ3BDO01BQ0osQ0FBQyxNQUFNO1FBQUU7UUFDTFosU0FBUyxJQUFJWSxZQUFZLENBQUNILFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQzdDO0lBQ0osQ0FBQyxNQUFNO01BQ0hULFNBQVMsSUFBSSxLQUFLO0lBQ3RCOztJQUVBO0lBQ0EsSUFBSWEsT0FBTyxHQUFHUixhQUFhLENBQUNRLE9BQU87SUFDbkMsSUFBSUEsT0FBTyxFQUFFO01BQ1RQLENBQUMsR0FBR08sT0FBTyxDQUFDck8sTUFBTTtNQUNsQixJQUFJOE4sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNUTixTQUFTLElBQUlhLE9BQU87TUFDeEIsQ0FBQyxNQUFNLElBQUlQLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEJOLFNBQVMsSUFBSSxHQUFHLEdBQUdhLE9BQU87TUFDOUIsQ0FBQyxNQUFNO1FBQ0hiLFNBQVMsSUFBSWEsT0FBTyxDQUFDSixTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUN4QztJQUNKLENBQUMsTUFBTTtNQUNIVCxTQUFTLElBQUksSUFBSTtJQUNyQjs7SUFFQTtJQUNBLElBQUljLE1BQU0sR0FBR1QsYUFBYSxDQUFDUyxNQUFNO0lBQ2pDLElBQUlBLE1BQU0sRUFBRTtNQUNSUixDQUFDLEdBQUdRLE1BQU0sQ0FBQ3RPLE1BQU07TUFDakIsSUFBSThOLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDVE4sU0FBUyxJQUFJYyxNQUFNO01BQ3ZCLENBQUMsTUFBTSxJQUFJUixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCTixTQUFTLElBQUksR0FBRyxHQUFHYyxNQUFNO01BQzdCLENBQUMsTUFBTSxJQUFJUixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCTixTQUFTLElBQUksSUFBSSxHQUFHYyxNQUFNO01BQzlCLENBQUMsTUFBTSxJQUFJUixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCTixTQUFTLElBQUksS0FBSyxHQUFHYyxNQUFNO01BQy9CLENBQUMsTUFBTTtRQUFFO1FBQ0xkLFNBQVMsSUFBSWMsTUFBTSxDQUFDTCxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUN2QztJQUNKLENBQUMsTUFBTTtNQUNIVCxTQUFTLElBQUksS0FBSztJQUN0QjtJQUVBNVEsTUFBTSxDQUFDK0IsR0FBRyxDQUFDLGFBQWEsR0FBRzZPLFNBQVMsQ0FBQztJQUVyQyxPQUFPQSxTQUFTO0VBQ3BCLENBQUM7O0VBRUQ7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJelEsWUFBWSxDQUFDYyxTQUFTLENBQUNTLGFBQWEsR0FBRyxZQUFZO0lBQy9DLElBQUlELEdBQUcsR0FBRyxJQUFJLENBQUMwSixNQUFNLENBQUMsQ0FBQztJQUV2QixJQUFJLENBQUNwSCx5QkFBeUIsR0FBRyxJQUFJO0lBRXJDLElBQUksQ0FBQ3dLLHVCQUF1QixDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDOUQsc0JBQXNCLENBQUMsQ0FBQztJQUU3QixJQUFJLENBQUNjLFVBQVUsQ0FBQyxDQUFDO0lBQ2pCO0lBQ0EsSUFBSSxJQUFJLENBQUN6RyxhQUFhLElBQUksSUFBSSxFQUFFO01BQzVCckQsR0FBRyxDQUFDZ0ssYUFBYSxDQUFDLElBQUksQ0FBQzNHLGFBQWEsQ0FBQztNQUNyQyxJQUFJLENBQUNBLGFBQWEsR0FBRyxJQUFJO0lBQzdCO0VBQ0osQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSTNFLFlBQVksQ0FBQ2MsU0FBUyxDQUFDc04sdUJBQXVCLEdBQUcsWUFBWTtJQUN6RCxJQUFJLENBQUM1SyxtQkFBbUIsR0FBRyxFQUFFO0lBQzdCLElBQUksSUFBSSxDQUFDRCxtQkFBbUIsRUFBRTtNQUMxQixPQUFPLElBQUksQ0FBQ0EsbUJBQW1CLENBQUM4RSxVQUFVLEVBQUU7UUFDeEMsSUFBSSxDQUFDOUUsbUJBQW1CLENBQUMrRSxXQUFXLENBQUMsSUFBSSxDQUFDL0UsbUJBQW1CLENBQUM4RSxVQUFVLENBQUM7TUFDN0U7SUFDSjtFQUNKLENBQUM7O0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lySSxZQUFZLENBQUNjLFNBQVMsQ0FBQzBPLHNCQUFzQixHQUFHLFlBQVk7SUFDeEQsSUFBSSxJQUFJLENBQUNsTSxzQkFBc0IsRUFBRTtNQUM3QixJQUFJLENBQUNBLHNCQUFzQixDQUFDNkMsS0FBSyxDQUFDcUwsT0FBTyxHQUFHLE1BQU07SUFDdEQ7RUFDSixDQUFDOztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJeFIsWUFBWSxDQUFDYyxTQUFTLENBQUMwSSx5QkFBeUIsR0FBRyxZQUFZO0lBQzNELElBQUksSUFBSSxDQUFDbEcsc0JBQXNCLEVBQUU7TUFDN0IsSUFBSSxDQUFDQSxzQkFBc0IsQ0FBQzZDLEtBQUssQ0FBQ3FMLE9BQU8sR0FBRyxPQUFPO0lBQ3ZEO0VBQ0osQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXhSLFlBQVksQ0FBQ2MsU0FBUyxDQUFDd0osc0JBQXNCLEdBQUcsWUFBWTtJQUN4RCxJQUFJLENBQUN0SSxrQkFBa0IsR0FBRyxFQUFFO0lBQzVCLElBQUksSUFBSSxDQUFDeUIsa0JBQWtCLEVBQUU7TUFDekIsT0FBTyxJQUFJLENBQUNBLGtCQUFrQixDQUFDNEUsVUFBVSxFQUFFO1FBQ3ZDLElBQUksQ0FBQzVFLGtCQUFrQixDQUFDNkUsV0FBVyxDQUFDLElBQUksQ0FBQzdFLGtCQUFrQixDQUFDNEUsVUFBVSxDQUFDO01BQzNFO0lBQ0o7RUFDSixDQUFDO0VBRUQsT0FBT3JJLFlBQVk7QUFDdkIsQ0FBQyxDQUFDQyx5REFBTyxDQUFFO0FBRUlELDJFQUFZLEVBQUM7O0FBRTVCO0FBQ0EsSUFBSXlSLE1BQU0sQ0FBQ0MsRUFBRSxJQUFJRCxNQUFNLENBQUNDLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFO0VBQ2hDRixNQUFNLENBQUNDLEVBQUUsQ0FBQ0MsT0FBTyxDQUFDM1IsWUFBWSxHQUFHQSxZQUFZO0FBQ2pEIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvQ29udHJvbHMvU2VhcmNoRW5naW5lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IENTU1xuaW1wb3J0IFwiLi4vQ1NTL0NvbnRyb2xzL1NlYXJjaEVuZ2luZS9HUHNlYXJjaEVuZ2luZU9wZW5MYXllcnMuY3NzXCI7XG4vLyBpbXBvcnQgT3BlbkxheWVyc1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcIm9sL2NvbnRyb2wvQ29udHJvbFwiO1xuaW1wb3J0IE92ZXJsYXkgZnJvbSBcIm9sL092ZXJsYXlcIjtcbmltcG9ydCB7IHRyYW5zZm9ybSBhcyBvbFByb2pUcmFuc2Zvcm0gfSBmcm9tIFwib2wvcHJvalwiO1xuLy8gaW1wb3J0IGdlb3BvcnRhbCBsaWJyYXJ5IGFjY2Vzc1xuaW1wb3J0IEdwIGZyb20gXCJnZW9wb3J0YWwtYWNjZXNzLWxpYlwiO1xuLy8gaW1wb3J0IGxvY2FsXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlsc1wiO1xuaW1wb3J0IE1hcmtlcnMgZnJvbSBcIi4vVXRpbHMvTWFya2Vyc1wiO1xuaW1wb3J0IEludGVyYWN0aW9ucyBmcm9tIFwiLi9VdGlscy9JbnRlcmFjdGlvbnNcIjtcbmltcG9ydCBTZWxlY3RvcklEIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvU2VsZWN0b3JJRFwiO1xuaW1wb3J0IFNlYXJjaEVuZ2luZVV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvU2VhcmNoRW5naW5lVXRpbHNcIjtcbmltcG9ydCBHZW9jb2RlVXRpbHMgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlscy9HZW9jb2RlVXRpbHNcIjtcbi8vIERPTVxuaW1wb3J0IFNlYXJjaEVuZ2luZURPTSBmcm9tIFwiLi4vLi4vQ29tbW9uL0NvbnRyb2xzL1NlYXJjaEVuZ2luZURPTVwiO1xuXG52YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcInNlYXJjaGVuZ2luZVwiKTtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBTZWFyY2hFbmdpbmUgY29udHJvbFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge29sLmNvbnRyb2wuQ29udHJvbH1cbiAqIEB0eXBlIHtvbC5jb250cm9sLlNlYXJjaEVuZ2luZX1cbiAqIEBhbGlhcyBvbC5jb250cm9sLlNlYXJjaEVuZ2luZVxuICogQHBhcmFtIHtPYmplY3R9ICBvcHRpb25zIC0gY29udHJvbCBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ30gICBbb3B0aW9ucy5hcGlLZXldIC0gQVBJIGtleS4gVGhlIGtleSBcImNhbGN1bFwiIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gICBbb3B0aW9ucy5zc2wgPSB0cnVlXSAtIHVzZSBvZiBzc2wgb3Igbm90IChkZWZhdWx0IHRydWUsIHNlcnZpY2UgcmVxdWVzdGVkIHVzaW5nIGh0dHBzIHByb3RvY29sKVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jb2xsYXBzZWQgPSB0cnVlXSAtIGNvbGxhcHNlIG1vZGUsIHRydWUgYnkgZGVmYXVsdFxuICogICAgICAgVmFsdWUgcG9zc2libGUgOiBhdXRvIG9yIHpvb20gbGV2ZWwuXG4gKiAgICAgICBQb3NzaWJsZSB0byBvdmVybG9hZCBpdCB3aXRoIGEgZnVuY3Rpb24gOlxuICogICAgICAgem9vbVRvIDogZnVuY3Rpb24gKGluZm8pIHtcbiAqICAgICAgICAgICAvLyBkbyBzb21lIHN0dWZmLi4uXG4gKiAgICAgICAgICAgcmV0dXJuIHpvb207XG4gKiAgICAgICB9XG4gKiBAcGFyYW0ge1N0cmluZ30gIFtvcHRpb25zLnBsYWNlaG9sZGVyXSAtIFBsYWNlaG9sZGVyIGluIHNlYXJjaCBiYXIuIERlZmF1bHQgaXMgXCJSZWNoZXJjaGVyIHVuIGxpZXUsIHVuZSBhZHJlc3NlXCIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRpc3BsYXlNYXJrZXIgPSB0cnVlXSAtIHNldCBhIG1hcmtlciBvbiBzZWFyY2ggcmVzdWx0LCBkZWZhdWx0cyB0byB0cnVlLlxuICogQHBhcmFtIHtTdHJpbmd9ICBbb3B0aW9ucy5tYXJrZXJTdHlsZSA9IFwibGlnaHRPcmFuZ2VcIl0gLSBNYXJrZXIgc3R5bGUuIEN1cnJlbnRseSBwb3NzaWJsZSB2YWx1ZXMgYXJlIFwibGlnaHRPcmFuZ2VcIiAoZGVmYXVsdCB2YWx1ZSksIFwiZGFya09yYW5nZVwiLCBcInJlZFwiIGFuZCBcInR1cnF1b2lzZUJsdWVcIi5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGlzcGxheUFkdmFuY2VkU2VhcmNoID0gdHJ1ZV0gLSBGYWxzZSB0byBkaXNhYmxlIGFkdmFuY2VkIHNlYXJjaCB0b29scyAoaXQgd2lsbCBub3QgYmUgZGlzcGxheWVkKS4gRGVmYXVsdCBpcyB0cnVlIChkaXNwbGF5ZWQpXG4gKiBAcGFyYW0ge09iamVjdH0gIFtvcHRpb25zLmFkdmFuY2VkU2VhcmNoXSAtIGFkdmFuY2VkIHNlYXJjaCBvcHRpb25zIGZvciBnZW9jb2RpbmcgKGZpbHRlcnMpLiBQcm9wZXJ0aWVzIGNhbiBiZSBmb3VuZCBhbW9uZyBnZW9jb2RlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucyAoc2VlIHtAbGluayBodHRwOi8vaWduZi5naXRodWIuaW8vZ2VvcG9ydGFsLWFjY2Vzcy1saWIvbGF0ZXN0L2pzZG9jL21vZHVsZS1TZXJ2aWNlcy5odG1sI35nZW9jb2RlIEdwLlNlcnZpY2VzLmdlb2NvZGV9KVxuICogQHBhcmFtIHtPYmplY3R9ICAgW29wdGlvbnMucmVzb3VyY2VzXSAtIHJlc291cmNlcyB0byBiZSB1c2VkIGJ5IGdlb2NvZGUgYW5kIGF1dG9jb21wbGV0aW9uIHNlcnZpY2VzIDpcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIFtvcHRpb25zLnJlc291cmNlcy5nZW9jb2RlXSAtIHJlc291cmNlcyBnZW9jb2RpbmcsIGJ5IGRlZmF1bHQgOiBcImxvY2F0aW9uXCJcbiAqIEBwYXJhbSB7QXJyYXl9ICAgW29wdGlvbnMucmVzb3VyY2VzLmF1dG9jb21wbGV0ZV0gLSByZXNvdXJjZXMgYXV0b2NvbXBsZXRpb24sIGJ5IGRlZmF1bHQgOiBbXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiwgXCJTdHJlZXRBZGRyZXNzXCJdXG4gKiBAcGFyYW0ge0Jvb2xlYW59ICBbb3B0aW9ucy5kaXNwbGF5QWR2YW5jZWRTZWFyY2ggPSB0cnVlXSAtIEZhbHNlIHRvIGRpc2FibGUgYWR2YW5jZWQgc2VhcmNoIHRvb2xzIChpdCB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQpLiBEZWZhdWx0IGlzIHRydWUgKGRpc3BsYXllZClcbiAqIEBwYXJhbSB7T2JqZWN0fSAgW29wdGlvbnMuYWR2YW5jZWRTZWFyY2hdIC0gYWR2YW5jZWQgc2VhcmNoIG9wdGlvbnMgZm9yIGdlb2NvZGluZyAoZmlsdGVycykuIFByb3BlcnRpZXMgY2FuIGJlIGZvdW5kIGFtb25nIGdlb2NvZGUgb3B0aW9ucy5maWx0ZXJPcHRpb25zIChzZWUge0BsaW5rIGh0dHA6Ly9pZ25mLmdpdGh1Yi5pby9nZW9wb3J0YWwtYWNjZXNzLWxpYi9sYXRlc3QvanNkb2MvbW9kdWxlLVNlcnZpY2VzLmh0bWwjfmdlb2NvZGUgR3AuU2VydmljZXMuZ2VvY29kZX0pXG4gKiBAcGFyYW0ge09iamVjdH0gIFtvcHRpb25zLmdlb2NvZGVPcHRpb25zID0ge31dIC0gb3B0aW9ucyBvZiBnZW9jb2RlIHNlcnZpY2UgKHNlZSB7QGxpbmsgaHR0cDovL2lnbmYuZ2l0aHViLmlvL2dlb3BvcnRhbC1hY2Nlc3MtbGliL2xhdGVzdC9qc2RvYy9tb2R1bGUtU2VydmljZXMuaHRtbCN+Z2VvY29kZSBHcC5TZXJ2aWNlcy5nZW9jb2RlfSlcbiAqIEBwYXJhbSB7T2JqZWN0fSAgW29wdGlvbnMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHt9XSAtIG9wdGlvbnMgb2YgYXV0b2NvbXBsZXRlIHNlcnZpY2UgKHNlZSB7QGxpbmsgaHR0cDovL2lnbmYuZ2l0aHViLmlvL2dlb3BvcnRhbC1hY2Nlc3MtbGliL2xhdGVzdC9qc2RvYy9tb2R1bGUtU2VydmljZXMuaHRtbCN+YXV0b0NvbXBsZXRlIEdwLlNlcnZpY2VzLmF1dG9Db21wbGV0ZX1cbiAqIEBwYXJhbSB7T2JqZWN0fSAgW29wdGlvbnMuYXV0b2NvbXBsZXRlT3B0aW9ucy5zZXJ2aWNlT3B0aW9uc10gLSBvcHRpb25zIG9mIGF1dG9jb21wbGV0ZSBzZXJ2aWNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9jb21wbGV0ZU9wdGlvbnMudHJpZ2dlckdlb2NvZGUgPSBmYWxzZV0gLSB0cmlnZ2VyIGEgZ2VvY29kaW5nIHJlcXVlc3QgaWYgdGhlIGF1dG9jb21wbGV0aW9uIGRvZXMgbm90IHJldHVybiBhbnkgc3VnZ2VzdGlvbnMsIGZhbHNlIGJ5IGRlZmF1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSAgW29wdGlvbnMuYXV0b2NvbXBsZXRlT3B0aW9ucy50cmlnZ2VyRGVsYXkgPSAxMDAwXSAtIHdhaXRpbmcgdGltZSBiZWZvcmUgc2VuZGluZyB0aGUgZ2VvY29kaW5nIHJlcXVlc3QsIDEwMDBtcyBieSBkZWZhdWx0XG4gKiBAcGFyYW0ge1N0aW5nfE51bWVyaWN8RnVuY3Rpb259IFtvcHRpb25zLnpvb21Ub10gLSB6b29tIHRvIHJlc3VsdHMsIGJ5IGRlZmF1bHQsIGN1cnJlbnQgem9vbS5cbiAqIEBmaXJlcyBzZWFyY2hlbmdpbmU6YXV0b2NvbXBsZXRlOmNsaWNrXG4gKiBAZmlyZXMgc2VhcmNoZW5naW5lOmdlb2NvZGU6Y2xpY2tcbiAqIEBleGFtcGxlXG4gKiAgdmFyIFNlYXJjaEVuZ2luZSA9IG9sLmNvbnRyb2wuU2VhcmNoRW5naW5lKHtcbiAqICAgICAgYXBpS2V5IDogXCJDTEVBUElcIixcbiAqICAgICAgY29sbGFwc2VkIDogdHJ1ZSxcbiAqICAgICAgcmVzb3VyY2VzIDoge1xuICogICAgICAgICAgZ2VvY29kZSA6IFtcIlN0cmVldEFkZHJlc3NcIiwgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIl0sXG4gKiAgICAgICAgICBhdXRvY29tcGxldGUgOiBbXCJTdHJlZXRBZGRyZXNzXCJdXG4gKiAgICAgIH0sXG4gKiAgICAgIGFkdmFuY2VkU2VhcmNoIDoge1xuICogICAgICAgICAgUG9zaXRpb25PZkludGVyZXN0IDogW3tuYW1lIDogXCJtdW5pY2lwYWxpdHlcIiwgdGl0bGUgOiBcIlZpbGxlXCJ9XSxcbiAqICAgICAgICAgIFN0cmVldEFkZHJlc3MgOiBbey4uLn1dXG4gKiAgICAgIH0sXG4gKiAgICAgIGdlb2NvZGVPcHRpb25zIDoge30sXG4gKiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgOiB7fVxuICogIH0pO1xuICpcbiAqICBTZWFyY2hFbmdpbmUub24oXCJzZWFyY2hlbmdpbmU6YXV0b2NvbXBsZXRlOmNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gKiAgICBjb25zb2xlLndhcm4oXCJhdXRvY29tcGxldGVcIiwgZS5sb2NhdGlvbik7XG4gKiAgfSk7XG4gKiAgU2VhcmNoRW5naW5lLm9uKFwic2VhcmNoZW5naW5lOmdlb2NvZGU6Y2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAqICAgIGNvbnNvbGUud2FybihcImdlb2NvZGVcIiwgZS5sb2NhdGlvbik7XG4gKiAgfSk7XG4gKi9cbnZhciBTZWFyY2hFbmdpbmUgPSAoZnVuY3Rpb24gKENvbnRyb2wpIHtcbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIG9sLmNvbnRyb2wuU2VhcmNoRW5naW5lfVxuICAgICAqIEBtb2R1bGUgU2VhcmNoRW5naW5lXG4gICAgICogQGFsaWFzIG1vZHVsZTp+Q29udHJvbHMvU2VhcmNoRW5naW5lXG4gICAgICogQHBhcmFtIHsqfSBvcHRpb25zIC0gb3B0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogaW1wb3J0IFNlYXJjaEVuZ2luZSBmcm9tIFwic3JjL09wZW5MYXllcnMvQ29udHJvbHMvU2VhcmNoRW5naW5lXCJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTZWFyY2hFbmdpbmUgKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNlYXJjaEVuZ2luZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUlJPUiBDTEFTU19DT05TVFJVQ1RPUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluaXRpYWxpc2F0aW9uIGR1IGNvbXBvc2FudFxuICAgICAgICB0aGlzLmluaXRpYWxpemUob3B0aW9ucyk7XG5cbiAgICAgICAgLy8gLy8gV2lkZ2V0IG1haW4gRE9NIGNvbnRhaW5lclxuICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9pbml0Q29udGFpbmVyKCk7XG4gICAgICAgIC8vIGluZm86IGxlIGNvbnRhaW5lciBzZXJhIGNvbXBsw6l0w6kgbG9ycyBkZSBsJ2Fqb3V0IMOgIGxhIGNhcnRlIChzZXRNYXApLCBjYXIgY2VydGFpbnMgY29tcG9zYW50cyBuw6ljZXNzaXRlbnQgZCfDqnRyZSBsacOpcyDDoCBsYSBtYXAuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIC8vIG9uIHBldXQgw6l2ZW50dWVsbGVtZW50IGVuY2Fwc3VsZXIgbGUgY29tcG9zYW50IGRhbnMgdW5lIGRpdiBwYXNzw6llIHBhciBsJ3V0aWxpc2F0ZXVyXG4gICAgICAgIGlmIChvcHRpb25zLmVsZW1lbnQgJiYgb3B0aW9ucy5lbGVtZW50LmFwcGVuZENoaWxkKSB7XG4gICAgICAgICAgICAvLyBkYW5zIGNlIGNhcyBvbiBzdG9ja2UgbGVzIGRldXggY29udGFpbmVyXG4gICAgICAgICAgICBvcHRpb25zLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxsIG9sLmNvbnRyb2wuQ29udHJvbCBjb25zdHJ1Y3RvclxuICAgICAgICBDb250cm9sLmNhbGwodGhpcywge1xuICAgICAgICAgICAgZWxlbWVudCA6IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgfHwgdGhpcy5fY29udGFpbmVyLFxuICAgICAgICAgICAgdGFyZ2V0IDogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgICAgICByZW5kZXIgOiBvcHRpb25zLnJlbmRlclxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gSW5oZXJpdHMgZnJvbSBvbC5jb250cm9sLkNvbnRyb2xcbiAgICBpZiAoQ29udHJvbCkgU2VhcmNoRW5naW5lLl9fcHJvdG9fXyA9IENvbnRyb2w7XG5cbiAgICAvKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6U2VhcmNoRW5naW5lXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29udHJvbC5wcm90b3R5cGUsIHt9KTtcblxuICAgIC8vIG9uIHLDqWN1cMOocmUgbGVzIG3DqXRob2RlcyBkZSBsYSBjbGFzc2UgY29tbXVuZSBJc29ET01cbiAgICBVdGlscy5hc3NpZ24oU2VhcmNoRW5naW5lLnByb3RvdHlwZSwgU2VhcmNoRW5naW5lRE9NKTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yIChhbGlhcylcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNlYXJjaEVuZ2luZTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHVibGljIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogT3ZlcndyaXRlIE9wZW5MYXllcnMgc2V0TWFwIG1ldGhvZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvbC5NYXB9IG1hcCAtIE1hcC5cbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLnNldE1hcCA9IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgaWYgKCFtYXApIHtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyUmVzdWx0cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gYXBwZWxsZSBsYSBtw6l0aG9kZSBzZXRNYXAgb3JpZ2luYWxlIGQnT3BlbkxheWVyc1xuICAgICAgICBDb250cm9sLnByb3RvdHlwZS5zZXRNYXAuY2FsbCh0aGlzLCBtYXApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgd2lkZ2V0IGlzIGNvbGxhcHNlZCAobWluaW1pemVkKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gY29sbGFwc2VkIC0gdHJ1ZSBpZiB3aWRnZXQgaXMgY29sbGFwc2VkXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5nZXRDb2xsYXBzZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNlZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2Ugb3IgZGlzcGxheSB3aWRnZXQgbWFpbiBjb250YWluZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29sbGFwc2VkIC0gVHJ1ZSB0byBjb2xsYXBzZSB3aWRnZXQsIEZhbHNlIHRvIGRpc3BsYXkgaXRcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLnNldENvbGxhcHNlZCA9IGZ1bmN0aW9uIChjb2xsYXBzZWQpIHtcbiAgICAgICAgaWYgKGNvbGxhcHNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiW0VSUk9SXSBTZWFyY2hFbmdpbmU6c2V0Q29sbGFwc2VkIC0gbWlzc2luZyBjb2xsYXBzZWQgcGFyYW1ldGVyXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY29sbGFwc2VkICYmIHRoaXMuY29sbGFwc2VkKSB8fCAoIWNvbGxhcHNlZCAmJiAhdGhpcy5jb2xsYXBzZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zaG93U2VhcmNoRW5naW5lSW5wdXQuY2xpY2soKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldCBsb2NhdGlvbnMgZGF0YSBmcm9tIGdlb2NvZGUgc2VydmljZVxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gZGF0YSAtIGxvY2F0aW9uc1xuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dlb2NvZGVkTG9jYXRpb25zO1xuICAgIH07XG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBpbml0IGNvbXBvbmVudCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIFNlYXJjaEVuZ2luZSBjb250cm9sIChjYWxsZWQgYnkgU2VhcmNoRW5naW5lIGNvbnN0cnVjdG9yKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25zdHJ1Y3RvciBvcHRpb25zXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB0aGlzLl9jaGVja0lucHV0T3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICAvLyBkZWZpbmUgZGVmYXVsdCBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNvbGxhcHNlZCA6IHRydWUsXG4gICAgICAgICAgICB6b29tVG8gOiBcIlwiLFxuICAgICAgICAgICAgcmVzb3VyY2VzIDoge1xuICAgICAgICAgICAgICAgIGdlb2NvZGUgOiBbXSxcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGUgOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXlBZHZhbmNlZFNlYXJjaCA6IHRydWUsXG4gICAgICAgICAgICBhZHZhbmNlZFNlYXJjaCA6IHt9LFxuICAgICAgICAgICAgZ2VvY29kZU9wdGlvbnMgOiB7XG4gICAgICAgICAgICAgICAgc2VydmljZU9wdGlvbnMgOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgOiB7XG4gICAgICAgICAgICAgICAgc2VydmljZU9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyR2VvY29kZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRyaWdnZXJEZWxheSA6IDEwMDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5TWFya2VyIDogdHJ1ZSxcbiAgICAgICAgICAgIG1hcmtlclN0eWxlIDogXCJsaWdodE9yYW5nZVwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXIgOiBcIlJlY2hlcmNoZXIgdW4gbGlldSwgdW5lIGFkcmVzc2VcIlxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1lcmdlIHdpdGggdXNlciBvcHRpb25zXG4gICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLmdlb2NvZGUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZSA9IFtcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLCBcIlN0cmVldEFkZHJlc3NcIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMuYXV0b2NvbXBsZXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlc291cmNlcy5hdXRvY29tcGxldGUgPSBbXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiwgXCJTdHJlZXRBZGRyZXNzXCJdO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIHtCb29sZWFufSBzcGVjaWZ5IGlmIHNlYXJjaEVuZ2luZSBjb250cm9sIGlzIGNvbGxhcHNlZCAodHJ1ZSkgb3Igbm90IChmYWxzZSkgKi9cbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2VkO1xuXG4gICAgICAgIC8vIGlkZW50aWZpYW50IGR1IGNvbnRyw7RsZSA6IHV0aWxlIHBvdXIgc3VmZml4ZXIgbGVzIGlkZW50aWZpYW50cyBDU1MgKHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgaWwgeSBlbiBhIHBsdXNpZXVycyBkYW5zIGxhIG3Dqm1lIHBhZ2UpXG4gICAgICAgIHRoaXMuX3VpZCA9IFNlbGVjdG9ySUQuZ2VuZXJhdGUoKTtcblxuICAgICAgICB0aGlzLl9zaG93U2VhcmNoRW5naW5lSW5wdXQgPSBudWxsO1xuXG4gICAgICAgIC8vIGNvbnRhaW5lciBkZSBsJ2lucHV0IGRlIHJlY2hlcmNoZVxuICAgICAgICB0aGlzLl9pbnB1dFNlYXJjaENvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gY29udGFpbmVyIGRlcyByZXBvbnNlcyBkZSBsJ2F1dG9jb21wbGV0aW9uXG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3RlZENvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gbGlzdGVzIGRlcyByZXBvbnNlcyBkZSBsJ2F1dG9jb21wbGV0aW9uXG4gICAgICAgIHRoaXMuX3N1Z2dlc3RlZExvY2F0aW9ucyA9IFtdO1xuXG4gICAgICAgIC8vIGNvbnRhaW5lciBkZXMgcmVwb25zZXMgZHUgZ2VvY29kYWdlXG4gICAgICAgIHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICAvLyBsaXN0ZSBkZXMgcmVwb25zZXMgZHUgZ2VvY29kYWdlXG4gICAgICAgIHRoaXMuX2dlb2NvZGVkTG9jYXRpb25zID0gW107XG5cbiAgICAgICAgLy8gY29udGFpbmVyIGRlcyBmaWx0cmVzIGR1IGdlb2NvZGFnZVxuICAgICAgICB0aGlzLl9maWx0ZXJDb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8vIHJlc3NvdXJjZSBkZSBnZW9jb2RhZ2Ugc2VsZWN0aW9ubsOpZSBwb3VyIGxlIGdlb2NvZGFnZSBhdmFuY8OpXG4gICAgICAgIHRoaXMuX2N1cnJlbnRHZW9jb2RpbmdDb2RlID0gbnVsbDtcblxuICAgICAgICAvLyBsb2NhbGlzYW50ICovXG4gICAgICAgIHRoaXMuX2N1cnJlbnRHZW9jb2RpbmdMb2NhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgLy8gbGlzdGUgZGVzIGZpbHRyZXMgZHUgZ2VvY29kYWdlIHBvdXIgbGUgZ2VvY29kYWdlIGF2YW5jw6lcbiAgICAgICAgdGhpcy5fYWR2YW5jZWRTZWFyY2hGaWx0ZXJzID0ge307XG4gICAgICAgIHRoaXMuX2luaXRBZHZhbmNlZFNlYXJjaEZpbHRlcnMoKTtcblxuICAgICAgICAvLyBsaXN0ZSBkZXMgcmVzc291cmNlcyBkdSBnZW9jb2RhZ2UgcG91ciBsZSBnZW9jb2RhZ2UgYXZhbmPDqVxuICAgICAgICB0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzID0gW107XG4gICAgICAgIHRoaXMuX2luaXRBZHZhbmNlZFNlYXJjaENvZGVzKCk7XG5cbiAgICAgICAgLy8gbWFya2VyXG4gICAgICAgIHRoaXMuX21hcmtlciA9IG51bGw7XG5cbiAgICAgICAgLy8gbWFya2VyIHN0eWxlXG4gICAgICAgIHZhciBfbWFya2VyU3R5bGUgPSB0aGlzLm9wdGlvbnMubWFya2VyU3R5bGU7XG4gICAgICAgIHRoaXMuX21hcmtlclVybCA9IChPYmplY3Qua2V5cyhNYXJrZXJzKS5pbmRleE9mKF9tYXJrZXJTdHlsZSkgPT09IC0xKSA/IE1hcmtlcnNbXCJsaWdodE9yYW5nZVwiXSA6IE1hcmtlcnNbX21hcmtlclN0eWxlXTtcblxuICAgICAgICAvLyBtYXJrZXIgZGlzcGxheVxuICAgICAgICB0aGlzLl9kaXNwbGF5TWFya2VyID0gdGhpcy5vcHRpb25zLmRpc3BsYXlNYXJrZXI7XG5cbiAgICAgICAgLy8gcG9wdXBcbiAgICAgICAgdGhpcy5fcG9wdXBDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcG9wdXBEaXYgPSB0aGlzLl9pbml0UG9wdXBEaXYoKTtcbiAgICAgICAgdGhpcy5fcG9wdXBPdmVybGF5ID0gbnVsbDtcblxuICAgICAgICAvLyB0cmlnZ2VyIGdlb2NvZGVcbiAgICAgICAgdGhpcy5fdHJpZ2dlckhhbmRsZXIgPSBudWxsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhpcy5pbml0aWFsaXplKClcbiAgICAgKiBhbmQgbWFrZXMgc3VyZSBpbnB1dCBvcHRpb25zIGFyZSBjb3JyZWN0bHkgZm9ybWF0ZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9jaGVja0lucHV0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlc291cmNlcykge1xuICAgICAgICAgICAgLy8gb24gdsOpcmlmaWUgcXVlIHJlc291cmNlcyBlc3QgYmllbiB1biBvYmpldFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlc291cmNlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIC8vIHJlc3NvdXJjZXMgZGUgZ2VvY29kYWdlXG4gICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVSZXNvdXJjZXMgPSBvcHRpb25zLnJlc291cmNlcy5nZW9jb2RlO1xuICAgICAgICAgICAgICAgIGlmIChnZW9jb2RlUmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHbDqXJpZmllIHF1ZSBsYSBsaXN0ZSBkZXMgcmVzc291cmNlcyBkZSBnZW9jb2RhZ2UgZXN0IGJpZW4gdW4gdGFibGVhdVxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShnZW9jb2RlUmVzb3VyY2VzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVSZXNvdXJjZXNMaXN0ID0gW1wiU3RyZWV0QWRkcmVzc1wiLCBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLCBcIkNhZGFzdHJhbFBhcmNlbFwiLCBcIkFkbWluaXN0cmF0aWZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvY29kZVJlc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW9jb2RlUmVzb3VyY2VzTGlzdC5pbmRleE9mKGdlb2NvZGVSZXNvdXJjZXNbaV0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBsYSByZXNvdXJjZSBuJ2VzdCBwYXMgcsOpZsOpcmVuY8OpZSwgb24gbCdlbmzDqHZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdlb2NvZGVSZXNvdXJjZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwiW1NlYXJjaEVuZ2luZV0gb3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZSA6IFwiICsgZ2VvY29kZVJlc291cmNlc1tpXSArIFwiIGlzIG5vdCBhIHJlc291cmNlIGZvciBnZW9jb2RlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJbU2VhcmNoRW5naW5lXSAnb3B0aW9ucy5yZXNvdXJjZXMuZ2VvY29kZScgcGFyYW1ldGVyIHNob3VsZCBiZSBhbiBhcnJheVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVSZXNvdXJjZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVzc291cmNlcyBkJ2F1dG9jb21wbGV0aW9uXG4gICAgICAgICAgICAgICAgdmFyIGF1dG9jb21wbGV0ZVJlc291cmNlcyA9IG9wdGlvbnMucmVzb3VyY2VzLmF1dG9jb21wbGV0ZTtcbiAgICAgICAgICAgICAgICBpZiAoYXV0b2NvbXBsZXRlUmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHbDqXJpZmllIHF1ZSBsYSBsaXN0ZSBkZXMgcmVzc291cmNlcyBkJ2F1dG9jb21wbGV0aW9uIGVzdCBiaWVuIHVuIHRhYmxlYXVcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXV0b2NvbXBsZXRlUmVzb3VyY2VzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF1dG9jb21wbGV0ZVJlc291cmNlc0xpc3QgPSBbXCJTdHJlZXRBZGRyZXNzXCIsIFwiUG9zaXRpb25PZkludGVyZXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF1dG9jb21wbGV0ZVJlc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvY29tcGxldGVSZXNvdXJjZXNMaXN0LmluZGV4T2YoYXV0b2NvbXBsZXRlUmVzb3VyY2VzW2ldKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgbGEgcmVzb3VyY2Ugbidlc3QgcGFzIHLDqWbDqXJlbmPDqWUsIG9uIGwnZW5sw6h2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdXRvY29tcGxldGVSZXNvdXJjZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwiW1NlYXJjaEVuZ2luZV0gb3B0aW9ucy5yZXNvdXJjZXMuYXV0b2NvbXBsZXRlIDogXCIgKyBhdXRvY29tcGxldGVSZXNvdXJjZXNbaV0gKyBcIiBpcyBub3QgYSByZXNvdXJjZSBmb3IgYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJbU2VhcmNoRW5naW5lXSAnb3B0aW9ucy5yZXNvdXJjZXMuYXV0b2NvbXBsZXRlJyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIGFycmF5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlUmVzb3VyY2VzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIltTZWFyY2hFbmdpbmVdICdyZXNvdXJjZXMnIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gb2JqZWN0XCIpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVzb3VyY2VzID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhpcy5pbml0aWFsaXplKClcbiAgICAgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgZ2VvY29kaW5nIHJlc291cmNlcyB0aXRsZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2luaXRBZHZhbmNlZFNlYXJjaENvZGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJTkZPUk1BVElPTlxuICAgICAgICAvLyBvbiB5IGFqb3V0ZSBsZXMgZmlsdHJlcyBhdHRyaWJ1dGFpcmVzIHBvdXIgdW5lIHRhYmxlIGRlIHJlc3NvdXJjZXNcbiAgICAgICAgLy8gc2VsZWN0aW9ubsOpZSB2aWEgdW4gZXZlbmVtZW50IChvbmNoYW5nZSkgZGUgbGEgbGlzdGUgZGVyb3VsYW50ZSBkdVxuICAgICAgICAvLyBtZW51IGF2YW5jw6kgZHUgZ2VvY29kYWdlLlxuICAgICAgICAvLyBjZi4gb25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaENvZGVDaGFuZ2UoKSBwb3VyIGxhIHNlbGVjdGlvbiBkZSBsYVxuICAgICAgICAvLyByZXNzb3VyY2UgZGUgZ2VvY29kYWdlIMOgIGFmZmljaGVyXG5cbiAgICAgICAgdmFyIGdlb2NvZGVSZXNvdXJjZXMgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2VzLmdlb2NvZGU7XG4gICAgICAgIGlmIChnZW9jb2RlUmVzb3VyY2VzID09PSBcImxvY2F0aW9uXCIpIHtcbiAgICAgICAgICAgIGdlb2NvZGVSZXNvdXJjZXMgPSBbXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiwgXCJTdHJlZXRBZGRyZXNzXCIsIFwiQ2FkYXN0cmFsUGFyY2VsXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9jb2RlUmVzb3VyY2VzKSkge1xuICAgICAgICAgICAgZ2VvY29kZVJlc291cmNlcyA9IFtnZW9jb2RlUmVzb3VyY2VzXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb2NvZGVSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZ2VvY29kZVJlc291cmNlc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogXCJQb3NpdGlvbk9mSW50ZXJlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIDogXCJMaWV1eC90b3BvbnltZXNcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN0cmVldEFkZHJlc3NcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIDogXCJTdHJlZXRBZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA6IFwiQWRyZXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNhZGFzdHJhbFBhcmNlbFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQgOiBcIkNhZGFzdHJhbFBhcmNlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiBcIlBhcmNlbGxlcyBjYWRhc3RyYWxlc1wiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBwYXIgZMOpZmF1dCwgYXUgY2FzIG/DuSBhdWN1bmUgcmVzc291cmNlIHBhc3PDqWUgZW4gb3B0aW9uIG5lIGNvcnJlc3BvbmQgw6AgY2VsbGVzIGF0dGVuZHVlc1xuICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXMgPSBbe1xuICAgICAgICAgICAgICAgIGlkIDogXCJTdHJlZXRBZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkFkcmVzc2VzXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpZCA6IFwiUG9zaXRpb25PZkludGVyZXN0XCIsXG4gICAgICAgICAgICAgICAgdGl0bGUgOiBcIkxpZXV4L3RvcG9ueW1lc1wiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgaWQgOiBcIkNhZGFzdHJhbFBhcmNlbFwiLFxuICAgICAgICAgICAgICAgIHRpdGxlIDogXCJDYWRhc3RyZVwiXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2coXCJhZHZhbmNlZFNlYXJjaENvZGVzXCIsIHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhpcy5vbkFkZCgpXG4gICAgICogYW5kIGluaXRpYWxpemUgdGhlIGFkdmFuY2VkIGdlb2NvZGluZyBmaWx0ZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9pbml0QWR2YW5jZWRTZWFyY2hGaWx0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBsaXN0ZSBkZXMgZmlsdHJlcyBwYXIgZGVmYXV0cyBwb3VyIHRvdXRlcyBsZXMgcmVzc291cmNlc1xuICAgICAgICB0aGlzLl9hZHZhbmNlZFNlYXJjaEZpbHRlcnMgPSBTZWFyY2hFbmdpbmVVdGlscy5hZHZhbmNlZFNlYXJjaEZpbHRlcnNCeURlZmF1bHQ7XG5cbiAgICAgICAgLy8gb24gbWVyZ2UgbGVzIG9wdGlvbnMgYXZhbmPDqWVzIGF2ZWMgY2VsbGVzIHBhciBkZWZhdXRcbiAgICAgICAgdmFyIGFkdmFuY2VkU2VhcmNoRmlsdGVyc0N1c3RvbSA9IHRoaXMub3B0aW9ucy5hZHZhbmNlZFNlYXJjaDtcbiAgICAgICAgVXRpbHMuYXNzaWduKHRoaXMuX2FkdmFuY2VkU2VhcmNoRmlsdGVycywgYWR2YW5jZWRTZWFyY2hGaWx0ZXJzQ3VzdG9tKTtcblxuICAgICAgICBsb2dnZXIubG9nKFwiYWR2YW5jZWRTZWFyY2hGaWx0ZXJzXCIsIHRoaXMuX2FkdmFuY2VkU2VhcmNoRmlsdGVycyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLmluaXRpYWxpemUoKSBhbmQgaW5pdGlhbGl6ZSBwb3B1cCBkaXZcbiAgICAgKiAodG8gZGlzcGxheSByZXN1bHRzIGluZm9ybWF0aW9uIG9uIG1hcmtlciBjbGljaylcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gZWxlbWVudCAtIERPTSBlbGVtZW50IGZvciBwb3B1cFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5faW5pdFBvcHVwRGl2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBcImdwLWZlYXR1cmUtaW5mby1kaXZcIjtcbiAgICAgICAgdmFyIGNsb3NlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgY2xvc2VyLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgICAgICBjbG9zZXIuY2xhc3NOYW1lID0gXCJncC1zdHlsaW5nLWJ1dHRvbiBjbG9zZXJcIjtcbiAgICAgICAgLy8gb24gY2xvc2VyIGNsaWNrIDogcmVtb3ZlIHBvcHVwXG4gICAgICAgIGNsb3Nlci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuX3BvcHVwT3ZlcmxheSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5fcG9wdXBPdmVybGF5LnNldFBvc2l0aW9uKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3BvcHVwQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuX3BvcHVwQ29udGVudC5jbGFzc05hbWUgPSBcImdwLWZlYXR1cmVzLWNvbnRlbnQtZGl2XCI7XG4gICAgICAgIHRoaXMuX3BvcHVwQ29udGVudC5zdHlsZVtcIm1pbi13aWR0aFwiXSA9IFwiMjAwcHhcIjtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wb3B1cENvbnRlbnQpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNsb3Nlcik7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRE9NIGluaXRpYWxpemUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGNvbnRyb2wgbWFpbiBjb250YWluZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtET01FbGVtZW50fSBET00gZWxlbWVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9pbml0Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjcmVhdGUgbWFpbiBjb250YWluZXJcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZU1haW5Db250YWluZXJFbGVtZW50KCk7XG5cbiAgICAgICAgLy8gY3JlYXRlIHNob3cgc2VhcmNoIGVuZ2luZSBlbGVtZW50XG4gICAgICAgIHZhciBpbnB1dFNob3cgPSB0aGlzLl9zaG93U2VhcmNoRW5naW5lSW5wdXQgPSB0aGlzLl9jcmVhdGVTaG93U2VhcmNoRW5naW5lRWxlbWVudCgpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXRTaG93KTtcblxuICAgICAgICAvLyBtb2RlIFwiY29sbGFwc2VkXCJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICBpbnB1dFNob3cuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgc2VhcmNoIGVuZ2luZSBwaWN0b1xuICAgICAgICB2YXIgcGljdG8gPSB0aGlzLl9jcmVhdGVTaG93U2VhcmNoRW5naW5lUGljdG9FbGVtZW50KCk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwaWN0byk7XG5cbiAgICAgICAgdmFyIHNlYXJjaCA9IHRoaXMuX2lucHV0U2VhcmNoQ29udGFpbmVyID0gdGhpcy5fY3JlYXRlU2VhcmNoSW5wdXRFbGVtZW50KHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcik7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgaWYgKHNlYXJjaC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBzZWFyY2guYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uQXV0b0NvbXBsZXRlSW5wdXRDbGljaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICBzZWFyY2guYXR0YWNoRXZlbnQoXCJvbmNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uQXV0b0NvbXBsZXRlSW5wdXRDbGljaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNlYXJjaCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNwbGF5QWR2YW5jZWRTZWFyY2gpIHtcbiAgICAgICAgICAgIHZhciBhZHZhbmNlZFNob3cgPSB0aGlzLl9jcmVhdGVTaG93QWR2YW5jZWRTZWFyY2hFbGVtZW50KCk7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYWR2YW5jZWRTaG93KTtcblxuICAgICAgICAgICAgLy8gSU5GTyBqZSBkZWNvbXBvc2UgbGVzIGFwcGVscyBjYXIgaidhaSBiZXNvaW4gZGUgcmVjdXBlcmVyIGxlIGNvbnRhaW5lclxuICAgICAgICAgICAgLy8gZGVzIGZpbHRyZXNcbiAgICAgICAgICAgIHZhciBhZHZhbmNlZFBhbmVsID0gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hQYW5lbEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHZhciBhZHZhbmNlZEhlYWRlciA9IHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoUGFuZWxIZWFkZXJFbGVtZW50KCk7XG4gICAgICAgICAgICB2YXIgYWR2YW5jZWRGb3JtID0gdGhpcy5fY3JlYXRlQWR2YW5jZWRTZWFyY2hQYW5lbEZvcm1FbGVtZW50KHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXMpO1xuICAgICAgICAgICAgdmFyIGFkdmFuY2VkRm9ybUZpbHRlcnMgPSB0aGlzLl9maWx0ZXJDb250YWluZXIgPSB0aGlzLl9jcmVhdGVBZHZhbmNlZFNlYXJjaEZvcm1GaWx0ZXJzRWxlbWVudCgpO1xuICAgICAgICAgICAgdGhpcy5fc2V0RmlsdGVyKHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29kZXNbMF0uaWQpOyAvLyBleCBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiXG4gICAgICAgICAgICB2YXIgYWR2YW5jZWRGb3JtSW5wdXQgPSB0aGlzLl9jcmVhdGVBZHZhbmNlZFNlYXJjaEZvcm1JbnB1dEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGFkdmFuY2VkRm9ybS5hcHBlbmRDaGlsZChhZHZhbmNlZEZvcm1GaWx0ZXJzKTtcbiAgICAgICAgICAgIGFkdmFuY2VkRm9ybS5hcHBlbmRDaGlsZChhZHZhbmNlZEZvcm1JbnB1dCk7XG4gICAgICAgICAgICBhZHZhbmNlZFBhbmVsLmFwcGVuZENoaWxkKGFkdmFuY2VkSGVhZGVyKTtcbiAgICAgICAgICAgIGFkdmFuY2VkUGFuZWwuYXBwZW5kQ2hpbGQoYWR2YW5jZWRGb3JtKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhZHZhbmNlZFBhbmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElORk8gamUgZGVjb21wb3NlIGxlcyBhcHBlbHMgY2FyIGonYWkgYmVzb2luIGRlIHJlY3VwZXJlciBsZSBjb250YWluZXJcbiAgICAgICAgLy8gZGVzIHJlc3VsdGF0cyBkZSBsJ2F1dG9jb21wbGV0aW9uXG4gICAgICAgIHZhciBhdXRvY29tcGxldGUgPSB0aGlzLl9hdXRvY29tcGxldGVDb250YWluZXIgPSB0aGlzLl9jcmVhdGVBdXRvQ29tcGxldGVFbGVtZW50KCk7XG4gICAgICAgIHZhciBhdXRvY29tcGxldGVMaXN0ID0gdGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyID0gdGhpcy5fY3JlYXRlQXV0b0NvbXBsZXRlTGlzdEVsZW1lbnQoKTtcbiAgICAgICAgYXV0b2NvbXBsZXRlLmFwcGVuZENoaWxkKGF1dG9jb21wbGV0ZUxpc3QpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYXV0b2NvbXBsZXRlKTtcblxuICAgICAgICAvLyBJTkZPIGplIGRlY29tcG9zZSBsZXMgYXBwZWxzIGNhciBqJ2FpIGJlc29pbiBkZSByZWN1cGVyZXIgbGUgY29udGFpbmVyXG4gICAgICAgIC8vIGRlcyByZXN1bHRhdHMgZHUgZ2VvY29kYWdlXG4gICAgICAgIHZhciBnZW9jb2RlID0gdGhpcy5fY3JlYXRlR2VvY29kZVJlc3VsdHNFbGVtZW50KCk7XG4gICAgICAgIHZhciBnZW9jb2RlTGlzdCA9IHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyID0gdGhpcy5fY3JlYXRlR2VvY29kZVJlc3VsdHNMaXN0RWxlbWVudCgpO1xuICAgICAgICBnZW9jb2RlLmFwcGVuZENoaWxkKGdlb2NvZGVMaXN0KTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGdlb2NvZGUpO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSA6XG4gICAgICogLSB0aGlzLl9pbml0Q29udGFpbmVyKCkgOiAuLi5cbiAgICAgKiAtIHRoaXMub25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaENvZGVDaG9pY2UoKSA6IC4uLlxuICAgICAqIGFuZCBpbml0aWFsaXplIG9yIGNyZWF0ZSB0aGUgZmlsdGVycyBjb250YWluZXIgSFRNTEVsZW1lbnRcbiAgICAgKiB0byB0aGUgZ2VvY29kaW5nIGFkdmFuY2VkIG1lbnUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29kZSAtIHJlc291cmNlIGdlb2NvZGluZyBuYW1lXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RE9NRWxlbWVudH0gRE9NIGVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX3NldEZpbHRlciA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgIC8vIElORk9STUFUSU9OXG4gICAgICAgIC8vIE5vdXMgYXZvbnMgMiBzb2x1dGlvbnMgcG9zc2libGVzIHBvdXIgbGEgbWlzZSBlbiBwbGFjZSBkZXMgZmlsdHJlcy5cbiAgICAgICAgLy8gMS4gU29pdCBvbiBkZWNpZGUgZGUgY3JlZXIgdG91cyBsZXMgZmlsdHJlcyBwb3VyIGNoYXF1ZSByZXNzb3VyY2VcbiAgICAgICAgLy8gZGUgZ2VvY29kYWdlIMOgIGwnaW5pdGlhbGlzYXRpb24gZHUgY29tcG9zYW50LCBldCBvbiBqb3VlIHN1ciBsZVxuICAgICAgICAvLyBtb2RlICdoaWRkZW4nIHBvdXIgbidhZmZpY2hlciBxdWUgbGEgcmVzc291cmNlIHNlbGVjdGlvbm7DqWUuXG4gICAgICAgIC8vIDIuIFNvaXQgb24gZGVjaWRlIGRlIGNyZWVyIMOgIGNoYXF1ZSBmb2lzIGxlcyBmaWx0cmVzIHBvdXIgbGFcbiAgICAgICAgLy8gcmVzc291cmNlIHNlbGVjdGlvbm7DqWUuXG4gICAgICAgIC8vIENoYXF1ZSBzb2x1dGlvbiBhIHNlcyBpbmNvbnZlbmllbnRzL2F2YW50YWdlcy5cbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZHUgY2hvaXggMiBjYXIgZWxsZSBvZmZyZSBwbHVzIGRlIHNvdXBsZXNzZSBwb3VyXG4gICAgICAgIC8vIHJlY3VwZXJlciBsZXMgJ2Zvcm0tZGF0YScuLi5cblxuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZmlsdGVyQ29udGFpbmVyO1xuXG4gICAgICAgIHZhciBjb2RlRm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9hZHZhbmNlZFNlYXJjaENvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRTZWFyY2hDb2Rlc1tpXS5pZCA9PT0gY29kZSkge1xuICAgICAgICAgICAgICAgIGNvZGVGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvZGVGb3VuZCkge1xuICAgICAgICAgICAgLy8gY2V0dGUgcmVzc291cmNlIG4nZXN0IHBhcyBkaXNwb25pYmxlLFxuICAgICAgICAgICAgLy8gb24gc3VwcHJpbWUgbGVzIGFuY2llbnMgZW5mYW50cy4uLlxuICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIHNhdXZlZ2FyZGUgbGEgcmVzc291cmNlIGRlIGdlb2NvZGFnZSBzw6lsZWN0aW9ubsOpZVxuICAgICAgICB0aGlzLl9jdXJyZW50R2VvY29kaW5nQ29kZSA9IGNvZGU7XG5cbiAgICAgICAgLy8gb24gc3VwcHJpbWUgbGVzIGVuZmFudHMuLi5cbiAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxzdEF0dHJpYnV0cyA9IHRoaXMuX2FkdmFuY2VkU2VhcmNoRmlsdGVyc1tjb2RlXTtcbiAgICAgICAgaWYgKCFsc3RBdHRyaWJ1dHMgfHwgbHN0QXR0cmlidXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY2V0dGUgcmVzc291cmNlIG4nZXN0IHBhcyBwYXJhbWV0cmFibGVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaXZUYWJsZSA9IHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRmlsdGVyc1RhYmxlRWxlbWVudChjb2RlLCB0cnVlKTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxzdEF0dHJpYnV0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGRpdkZpbHRlciA9IHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRmlsdGVyc0F0dHJpYnV0RWxlbWVudChsc3RBdHRyaWJ1dHNbal0pO1xuICAgICAgICAgICAgZGl2VGFibGUuYXBwZW5kQ2hpbGQoZGl2RmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXZUYWJsZSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9O1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMgbWV0aG9kcyB0byByZXF1ZXN0IGFuZCByZXN1bHRzICMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhpcy5vbkF1dG9Db21wbGV0ZVNlYXJjaCgpXG4gICAgICogYW5kIGV4ZWN1dGVzIGEgcmVxdWVzdCB0byB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzZXR0aW5ncyAtIHNlcnZpY2Ugc2V0dGluZ3NcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBzZXR0aW5ncy50ZXh0IC0gdGV4dFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRpbmdzLm9uU3VjY2VzcyAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGluZ3Mub25GYWlsdXJlIC0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX3JlcXVlc3RBdXRvQ29tcGxldGUgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHtcbiAgICAgICAgLy8gb24gbmUgZmFpdCBwYXMgZGUgcmVxdcOqdGUgc2kgb24gbidhIHBhcyByZW5zZWlnbsOpIGRlIHBhcmFtZXRyZXMgIVxuICAgICAgICBpZiAoIXNldHRpbmdzIHx8ICh0eXBlb2Ygc2V0dGluZ3MgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMoc2V0dGluZ3MpLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIG5lIGZhaXQgcGFzIGRlIHJlcXXDqnRlIHNpIGxhIHBhcmFtZXRyZSAndGV4dCcgZXN0IHZpZGUgIVxuICAgICAgICBpZiAoIXNldHRpbmdzLnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2coc2V0dGluZ3MpO1xuXG4gICAgICAgIHZhciBvcHRpb25zID0ge307XG4gICAgICAgIC8vIG9uIHJlY3VwZXJlIGxlcyBvcHRpb25zIGR1IHNlcnZpY2VcbiAgICAgICAgVXRpbHMuYXNzaWduKG9wdGlvbnMsIHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGVPcHRpb25zLnNlcnZpY2VPcHRpb25zKTtcbiAgICAgICAgLy8gYWluc2kgcXVlIGxhIHJlY2hlcmNoZSBldCBsZXMgY2FsbGJhY2tzXG4gICAgICAgIFV0aWxzLmFzc2lnbihvcHRpb25zLCBzZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gb24gYWpvdXRlIGxlIHBhcmFtw6h0cmUgZmlsdGVyT3B0aW9ucy50eXBlIHNww6ljaWZpYW50IGxlcyByZXNzb3VyY2VzLlxuICAgICAgICB2YXIgcmVzb3VyY2VzID0gdGhpcy5vcHRpb25zLnJlc291cmNlcy5hdXRvY29tcGxldGU7XG4gICAgICAgIGlmIChyZXNvdXJjZXMgJiYgQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKSB7XG4gICAgICAgICAgICAvLyBpbCBzZSBwZXV0IHF1ZSBsJ3V0aWxpc2F0ZXVyIGFpdCBzdXJjaGFyZ8OpIGNlIHBhcmFtw6h0cmUgZGFucyBnZW9jb2RlT3B0aW9ucyxcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gcmVzb3VyY2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FzIG/DuSBsYSBjbGVmIEFQSSBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUgZGFucyBsZXMgb3B0aW9ucyBkdSBzZXJ2aWNlLFxuICAgICAgICAvLyBvbiB1dGlsaXNlIGNlbGxlIHJlbnNlaWduw6llIGF1IG5pdmVhdSBkdSBjb250cm9sZSBvdSBsYSBjbMOpIFwiY2FsY3VsXCIgcGFyIGTDqWZhdXQuXG4gICAgICAgIG9wdGlvbnMuYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgfHwgdGhpcy5vcHRpb25zLmFwaUtleTtcblxuICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGEgc3DDqWNpZmnDqSBsZSBwYXJhbcOodHJlIHNzbCBhdSBuaXZlYXUgZHUgY29udHJvbCwgb24gcydlbiBzZXJ0XG4gICAgICAgIC8vIHRydWUgcGFyIGTDqWZhdXQgKGh0dHBzKVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc3NsICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc3NsID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc3NsID0gdGhpcy5vcHRpb25zLnNzbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zc2wgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5sb2cob3B0aW9ucyk7XG5cbiAgICAgICAgR3AuU2VydmljZXMuYXV0b0NvbXBsZXRlKG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhpcy5vbkF1dG9Db21wbGV0ZVNlYXJjaFRleHQoKSAoY2FzZSBvZiBzdWNjZXNzKVxuICAgICAqIGFuZCBmaWxscyB0aGUgY29udGFpbmVyIG9mIHRoZSBsb2NhdGlvbiBsaXN0LlxuICAgICAqIGl0IGNyZWF0ZXMgYSBIVE1MIEVsZW1lbnQgcGVyIGxvY2F0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBsb2NhdGlvbnMgLSBBcnJheSBvZiBHcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGUuU3VnZ2VzdGVkTG9jYXRpb24gY29ycmVzcG9uZGluZyB0byBhdXRvY29tcGxldGUgcmVzdWx0cyBsaXN0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9maWxsQXV0b0NvbXBsZXRlZExvY2F0aW9uTGlzdENvbnRhaW5lciA9IGZ1bmN0aW9uIChsb2NhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsb2NhdGlvbnMgfHwgbG9jYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gdmlkZSBsYSBsaXN0ZSBhdmFudCBkZSBsYSBjb25zdHJ1aXJlXG4gICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCkge1xuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTdWdnZXN0ZWRMb2NhdGlvbigpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gUHJvcG9zYWxzIGFyZSBkeW5hbWljYWxseSBmaWxsZWQgaW4gSmF2YXNjcmlwdCBieSBhdXRvY29tcGxldGUgc2VydmljZVxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlQXV0b0NvbXBsZXRlZExvY2F0aW9uRWxlbWVudChsb2NhdGlvbnNbaV0sIGkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoKClcbiAgICAgKiBhbmQgZXhlY3V0ZXMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzIC0gc2VydmljZSBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgIHNldHRpbmdzLmxvY2F0aW9uIC0gdGV4dFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRpbmdzLm9uU3VjY2VzcyAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGluZ3Mub25GYWlsdXJlIC0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX3JlcXVlc3RHZW9jb2RpbmcgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHtcbiAgICAgICAgLy8gb24gbmUgZmFpdCBwYXMgZGUgcmVxdcOqdGUgc2kgb24gbidhIHBhcyByZW5zZWlnbsOpIGRlIHBhcmFtZXRyZXMgIVxuICAgICAgICBpZiAoIXNldHRpbmdzIHx8ICh0eXBlb2Ygc2V0dGluZ3MgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMoc2V0dGluZ3MpLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIG5lIGZhaXQgcGFzIGRlIHJlcXXDqnRlIHNpIGxhIHBhcmFtZXRyZSAndGV4dCcgZXN0IHZpZGUgIVxuICAgICAgICBpZiAoc2V0dGluZ3MucXVlcnkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2coc2V0dGluZ3MpO1xuXG4gICAgICAgIHZhciBvcHRpb25zID0ge307XG4gICAgICAgIC8vIG9uIHJlY3VwZXJlIGxlcyBvcHRpb25zIGR1IHNlcnZpY2VcbiAgICAgICAgVXRpbHMuYXNzaWduKG9wdGlvbnMsIHRoaXMub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucyk7XG4gICAgICAgIC8vIGFpbnNpIHF1ZSBsYSByZWNoZXJjaGUgZXQgbGVzIGNhbGxiYWNrc1xuICAgICAgICBVdGlscy5hc3NpZ24ob3B0aW9ucywgc2V0dGluZ3MpO1xuICAgICAgICAvLyBvbiByZWRlZmluaWUgbGVzIGNhbGxiYWNrcyBzaSBsZXMgY2FsbGJhY2tzIGRlIHNlcnZpY2UgZXhpc3RlbnRcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgYk9uRmFpbHVyZSA9ICEhKHRoaXMub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucy5vbkZhaWx1cmUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucy5vbkZhaWx1cmUgPT09IFwiZnVuY3Rpb25cIik7IC8vIGNhc3QgdmFyaWFibGUgdG8gYm9vbGVhblxuICAgICAgICB2YXIgYk9uU3VjY2VzcyA9ICEhKHRoaXMub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucy5vblN1Y2Nlc3MgPT09IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIGlmIChiT25TdWNjZXNzKSB7XG4gICAgICAgICAgICB2YXIgY2JPblN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNldHRpbmdzLm9uU3VjY2Vzcy5jYWxsKHNlbGYsIGUpO1xuICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucy5vblN1Y2Nlc3MuY2FsbChzZWxmLCBlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcHRpb25zLm9uU3VjY2VzcyA9IGNiT25TdWNjZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiT25GYWlsdXJlKSB7XG4gICAgICAgICAgICB2YXIgY2JPbkZhaWx1cmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNldHRpbmdzLm9uRmFpbHVyZS5jYWxsKHNlbGYsIGUpO1xuICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5nZW9jb2RlT3B0aW9ucy5zZXJ2aWNlT3B0aW9ucy5vbkZhaWx1cmUuY2FsbChzZWxmLCBlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcHRpb25zLm9uRmFpbHVyZSA9IGNiT25GYWlsdXJlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gYWpvdXRlIGxlIHBhcmFtw6h0cmUgaW5kZXggc3DDqWNpZmlhbnQgbGVzIHJlc3NvdXJjZXMuXG4gICAgICAgIHZhciByZXNvdXJjZXMgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2VzLmdlb2NvZGU7XG4gICAgICAgIGlmIChyZXNvdXJjZXMpIHtcbiAgICAgICAgICAgIC8vIGlsIHNlIHBldXQgcXVlIGwndXRpbGlzYXRldXIgYWl0IHN1cmNoYXJnw6kgY2UgcGFyYW3DqHRyZSBkYW5zIGdlb2NvZGVPcHRpb25zLFxuICAgICAgICAgICAgLy8gb3UgcXUnaWwgYWl0IGTDqWrDoCDDqXTDqSByZW1wbGkgKGNhcyBkZSBsYSByZWNoZXJjaGUgYXZhbmPDqWUpXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmluZGV4ID0gcmVzb3VyY2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FzIG/DuSBsYSBjbGVmIEFQSSBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUgZGFucyBsZXMgb3B0aW9ucyBkdSBzZXJ2aWNlLFxuICAgICAgICAvLyBvbiB1dGlsaXNlIGNlbGxlIHJlbnNlaWduw6llIGF1IG5pdmVhdSBkdSBjb250cm9sZSBvdSBsYSBjbMOpIFwiY2FsY3VsXCIgcGFyIGTDqWZhdXRcbiAgICAgICAgb3B0aW9ucy5hcGlLZXkgPSBvcHRpb25zLmFwaUtleSB8fCB0aGlzLm9wdGlvbnMuYXBpS2V5O1xuXG4gICAgICAgIC8vIHNpIGwndXRpbGlzYXRldXIgYSBzcMOpY2lmacOpIGxlIHBhcmFtw6h0cmUgc3NsIGF1IG5pdmVhdSBkdSBjb250cm9sLCBvbiBzJ2VuIHNlcnRcbiAgICAgICAgLy8gdHJ1ZSBwYXIgZMOpZmF1dCAoaHR0cHMpXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zc2wgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5zc2wgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zc2wgPSB0aGlzLm9wdGlvbnMuc3NsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNzbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKG9wdGlvbnMpO1xuXG4gICAgICAgIEdwLlNlcnZpY2VzLmdlb2NvZGUob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uR2VvY29kaW5nU2VhcmNoKClcbiAgICAgKiBhbmQgZmlsbHMgdGhlIGNvbnRhaW5lciBvZiB0aGUgbG9jYXRpb24gcmVzdWx0cy5cbiAgICAgKiBpdCBjcmVhdGVzIGEgSFRNTCBFbGVtZW50IHBlciBsb2NhdGlvblxuICAgICAqIChjZi4gdGhpcy4gLi4uKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3RbXX0gbG9jYXRpb25zIC0gbG9jYXRpb25zXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2ZpbGxHZW9jb2RlZExvY2F0aW9uTGlzdENvbnRhaW5lciA9IGZ1bmN0aW9uIChsb2NhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsb2NhdGlvbnMgfHwgbG9jYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJHZW9jb2RlZExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbiB2aWRlIGxhIGxpc3RlIGF2YW50IGRlIGxhIGNvbnN0cnVpcmVcbiAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9nZW9jb2RlZENvbnRhaW5lcjtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhsb2NhdGlvbnNbaV0pO1xuICAgICAgICAgICAgLy8gUHJvcG9zYWxzIGFyZSBkeW5hbWljYWxseSBmaWxsZWQgaW4gSmF2YXNjcmlwdCBieSBhdXRvY29tcGxldGUgc2VydmljZVxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlR2VvY29kZWRMb2NhdGlvbkVsZW1lbnQobG9jYXRpb25zW2ldLCBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdXZlZ2FyZGUgZGUgbCdldGF0IGRlcyBsb2NhdGlvbnNcbiAgICAgICAgdGhpcy5fZ2VvY29kZWRMb2NhdGlvbnMgPSBsb2NhdGlvbnM7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIG90aGVyIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBzZW5kcyB0aGUgbGFiZWwgdG8gdGhlIHBhbmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIC0gbGFiZWwgc3VnZ2VzdGVkIGxvY2F0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9zZXRMYWJlbCA9IGZ1bmN0aW9uIChsYWJlbCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkdQc2VhcmNoSW5wdXRUZXh0LVwiICsgdGhpcy5fdWlkKS52YWx1ZSA9IGxhYmVsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhpcy5vbipSZXN1bHRzSXRlbUNsaWNrKClcbiAgICAgKiBhbmQgbW92ZS96b29tIG9uIGEgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiAtIG9sLkNvb3JkaW5hdGUgb2JqZWN0IFtsb24sIGxhdF0gKGVuIGxhdC9sb24gOiBcIkVQU0c6NDMyNlwiKVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB6b29tIC0gem9vbSBsZXZlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fc2V0UG9zaXRpb24gPSBmdW5jdGlvbiAocG9zaXRpb24sIHpvb20pIHtcbiAgICAgICAgdmFyIHZpZXcgPSB0aGlzLmdldE1hcCgpLmdldFZpZXcoKTtcbiAgICAgICAgdmlldy5zZXRDZW50ZXIocG9zaXRpb24pO1xuICAgICAgICB2aWV3LnNldFpvb20oem9vbSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uKlJlc3VsdHNJdGVtQ2xpY2soKVxuICAgICAqIGFuZCBkaXNwbGF5cyBhIG1hcmtlci5cbiAgICAgKiBGSVhNRVxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9zaXRpb24gLSBvbC5Db29yZGluYXRlIG9iamVjdCBbbG9uLCBsYXRdIG91IFt4LCB5XVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gbG9jYXRpb24gaW5mb3JtYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX3NldE1hcmtlciA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgaW5mbykge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5nZXRNYXAoKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuXG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91cyBtYXJrZXJzXG4gICAgICAgIGlmICh0aGlzLl9tYXJrZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwLnJlbW92ZU92ZXJsYXkodGhpcy5fbWFya2VyKTtcbiAgICAgICAgICAgIHRoaXMuX21hcmtlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIC8vIGNyw6lhdGlvbiBkZSBsJ8OpbMOpbWVudCBET01cbiAgICAgICAgICAgIHZhciBtYXJrZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgbWFya2VyRGl2LnNyYyA9IHRoaXMuX21hcmtlclVybDtcblxuICAgICAgICAgICAgLy8gYWpvdXQgZGUgbCfDqXbDqG5lbWVudCBvbmNsaWNrIChwb3VyIGFmZmljaGVyIHVuZSBwb3B1cClcbiAgICAgICAgICAgIGlmIChtYXJrZXJEaXYuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIG1hcmtlckRpdi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX29uUmVzdWx0TWFya2VyU2VsZWN0KGluZm8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya2VyRGl2LmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgICAgICAgICBtYXJrZXJEaXYuYXR0YWNoRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIFwib25jbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9vblJlc3VsdE1hcmtlclNlbGVjdChpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNyw6lhdGlvbiBkdSBtYXJrZXIgKG92ZXJsYXkpXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXIgPSBuZXcgT3ZlcmxheSh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gOiBwb3NpdGlvbixcbiAgICAgICAgICAgICAgICBvZmZzZXQgOiBbLTI1LjUsIC0zOF0sXG4gICAgICAgICAgICAgICAgZWxlbWVudCA6IG1hcmtlckRpdixcbiAgICAgICAgICAgICAgICBzdG9wRXZlbnQgOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtYXAuYWRkT3ZlcmxheSh0aGlzLl9tYXJrZXIpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uKlJlc3VsdHNJdGVtQ2xpY2soKVxuICAgICAqIGFuZCBnZXQgem9vbSB0byByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gLSBpbmZvXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SW50ZWdlcn0gem9vbVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fZ2V0Wm9vbSA9IGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgIHZhciBtYXAgPSB0aGlzLmdldE1hcCgpO1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5vcHRpb25zLnpvb21UbztcbiAgICAgICAgdmFyIHpvb20gPSBudWxsO1xuXG4gICAgICAgIC8vIGxlcyB2YWxldXJzIGR1IHpvb21zIHNvbnQgZGV0ZXJtaW7DqWVzXG4gICAgICAgIC8vIHNvaXQgcGFyIGxlcyBtb3RzIGNsZWZzIHN1aXZhbnRzIDogIG1heCwgbWluIG91IGF1dG9cbiAgICAgICAgLy8gc29pdCBwYXIgdW4gbml2ZWF1IGRlIHpvb21cbiAgICAgICAgLy8gc29pdCBkZWZpbmkgcGFyIGwndXRpbGlzYXRldXIgdmlhIHVuZSBmb25jdGlvblxuXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInpvb20gZnVuY3Rpb25cIik7XG4gICAgICAgICAgICB6b29tID0ga2V5LmNhbGwodGhpcywgaW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBsZXZlbFwiKTtcbiAgICAgICAgICAgIHpvb20gPSBrZXk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gaWYgKGtleSA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgLy8gICAgIHpvb20gPSBtYXAuZ2V0TWF4Wm9vbSgpO1xuICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChrZXkgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgIC8vICAgICB6b29tID0gbWFwLmdldE1pblpvb20oKTtcbiAgICAgICAgICAgIC8vIH0gZWxzZVxuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInpvb20gYXV0b1wiKTtcbiAgICAgICAgICAgICAgICB6b29tID0gU2VhcmNoRW5naW5lVXRpbHMuem9vbVRvUmVzdWx0c0J5RGVmYXVsdChpbmZvKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiem9vbSBsZXZlbCBwYXJzaW5nXCIpO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlSW50KGtleSwgMTApO1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInpvb20gcGFyc2luZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgem9vbSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvbHlmaWxsIElFXG4gICAgICAgIE51bWJlci5pc0ludGVnZXIgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgICAgIGlzRmluaXRlKHZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyB0ZXN0IGRlIHZhbGlkaXTDqSBkdSB6b29tLFxuICAgICAgICAvLyBvbiBwcmVuZCBsZSB6b29tIGNvdXJhbnQgcGFyIGRlZmF1dCAuLi5cbiAgICAgICAgaWYgKCF6b29tIHx8IHpvb20gPT09IFwiXCIgfHwgIU51bWJlci5pc0ludGVnZXIoem9vbSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInpvb20gbm90IGZvdW5kLCBjdXJyZW50IHpvb20uLi5cIik7XG4gICAgICAgICAgICB6b29tID0gbWFwLmdldFZpZXcoKS5nZXRab29tKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRSB0ZXN0IHNpIGxlIHpvb20gZXN0IGRhbnMgbCdlc3BhY2UgZGUgbGEgY2FydGVcbiAgICAgICAgdmFyIG1pbiA9IG1hcC5taW5ab29tOyAvLyAuZ2V0TWluWm9vbSgpO1xuICAgICAgICB2YXIgbWF4ID0gbWFwLm1heFpvb207IC8vIC5nZXRNYXhab29tKCk7XG4gICAgICAgIGlmICh6b29tIDwgbWluKSB7XG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJ6b29tIGxldmVsIG1pbi4uLlwiKTtcbiAgICAgICAgICAgIHpvb20gPSBtaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHpvb20gPiBtYXgpIHtcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInpvb20gbGV2ZWwgbWF4Li4uXCIpO1xuICAgICAgICAgICAgem9vbSA9IG1heDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci50cmFjZShcInpvb21cIiwgem9vbSk7XG4gICAgICAgIHJldHVybiB6b29tO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gJ2NsaWNrJyBvbiB0aGlzLl9tYXJrZXJcbiAgICAgKiAoY2YuIHRoaXMuX3NldE1hcmtlcigpIClcbiAgICAgKiBhbmQgc2V0cyBhIHBvcHVwIHdpdGggbWFya2VyIGluZm9ybWF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb3JtYXRpb24gLSBsb2NhdGlvbiBpbmZvcm1hdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5fb25SZXN1bHRNYXJrZXJTZWxlY3QgPSBmdW5jdGlvbiAoaW5mb3JtYXRpb24pIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG5cbiAgICAgICAgdmFyIHBvcHVwQ29udGVudCA9IFwiXCI7XG4gICAgICAgIGlmICh0eXBlb2YgaW5mb3JtYXRpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvbi5zZXJ2aWNlID09PSBcIkdlb2NvZGVkTG9jYXRpb25cIikge1xuICAgICAgICAgICAgICAgIHBvcHVwQ29udGVudCA9IFwiPHVsPlwiO1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gaW5mb3JtYXRpb24ubG9jYXRpb24ucGxhY2VBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT09IFwidHJ1ZUdlb21ldHJ5XCIgJiYgYXR0ciAhPT0gXCJleHRyYUZpZWxkc1wiICYmIGF0dHIgIT09IFwiaG91c2VOdW1iZXJJbmZvc1wiICYmIGF0dHIgIT09IFwiX2NvdW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENvbnRlbnQgKz0gXCI8bGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ICs9IFwiPHNwYW4gY2xhc3M9XFxcImdwLWF0dG5hbWUtb3RoZXJzLXNwYW5cXFwiPlwiICsgYXR0ci50b1VwcGVyQ2FzZSgpICsgXCIgOiA8L3NwYW4+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ICs9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ICs9IFwiIDwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ICs9IFwiIDwvdWw+XCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluZm9ybWF0aW9uLnNlcnZpY2UgPT09IFwiU3VnZ2VzdGVkTG9jYXRpb25cIikge1xuICAgICAgICAgICAgICAgIHBvcHVwQ29udGVudCA9IEdlb2NvZGVVdGlscy5nZXRTdWdnZXN0ZWRMb2NhdGlvbkZyZWVmb3JtKGluZm9ybWF0aW9uLmxvY2F0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9wdXBDb250ZW50ID0gXCJzYW5zIGluZm9ybWF0aW9ucy5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcHVwQ29udGVudCA9IGluZm9ybWF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9wdXBDb250ZW50LmlubmVySFRNTCA9IHBvcHVwQ29udGVudDtcbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cE92ZXJsYXkpIHtcbiAgICAgICAgICAgIC8vIGFqb3V0IGRlIGxhIHBvcHVwIGEgbGEgY2FydGUgY29tbWUgdW4gb3ZlcmxheVxuICAgICAgICAgICAgdGhpcy5fcG9wdXBPdmVybGF5ID0gbmV3IE92ZXJsYXkoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgOiB0aGlzLl9wb3B1cERpdixcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmluZyA6IFwiYm90dG9tLWNlbnRlclwiLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogdGhpcy5fbWFya2VyLmdldFBvc2l0aW9uKCksXG4gICAgICAgICAgICAgICAgb2Zmc2V0IDogWzAsIC00Ml1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWFwLmFkZE92ZXJsYXkodGhpcy5fcG9wdXBPdmVybGF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNpIGwnb3ZlcmxheSBlc3QgZMOpasOgIGNyw6nDqSwgb24gbW9kaWZpZSBqdXN0ZSBzYSBwb3NpdGlvblxuICAgICAgICAgICAgdGhpcy5fcG9wdXBPdmVybGF5LnNldFBvc2l0aW9uKHRoaXMuX21hcmtlci5nZXRQb3NpdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBvdGhlciBoYW5kbGVycyBldmVudHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2xpY2snIG9uICdHUHNob3dTZWFyY2hFbmdpbmVQaWN0bycgdGFnIGxhYmVsXG4gICAgICogKGNmLiB0aGlzLl9jcmVhdGVTaG93U2VhcmNoRW5naW5lUGljdG9FbGVtZW50KSwgYW5kIGl0IGNsZWFucyB0aGUgY29tcG9uZW50XG4gICAgICogd2hlbiBpdCdzIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5vblNob3dTZWFyY2hFbmdpbmVDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG4gICAgICAgIC8vIG9uIHN1cHByaW1lIHRvdXRlcyBsZXMgaW50ZXJhY3Rpb25zXG4gICAgICAgIEludGVyYWN0aW9ucy51bnNldChtYXApO1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IHRoaXMuX3Nob3dTZWFyY2hFbmdpbmVJbnB1dC5jaGVja2VkO1xuICAgICAgICAvLyBvbiBnw6luw6hyZSBub3VzIG3Dqm1lIGwnZXZlbmVtZW50IE9wZW5MYXllcnMgZGUgY2hhbmdlbWVudCBkZSBwcm9wcmnDqXTDqVxuICAgICAgICAvLyAodXRpbGlzZXIgb2wuY29udHJvbC5TZWFyY2hFbmdpbmUub24oXCJjaGFuZ2U6Y29sbGFwc2VkXCIsIGZ1bmN0aW9uICkgcG91ciBzJ2Fib25uZXIgw6AgY2V0IMOpdsOobmVtZW50KVxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXCJjaGFuZ2U6Y29sbGFwc2VkXCIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJ2NsaWNrJyBvbiAnR1BzZWFyY2hJbnB1dFJlc2V0JyB0YWcgZGl2XG4gICAgICogKGNmLiB0aGlzLl9jcmVhdGVTZWFyY2hJbnB1dEVsZW1lbnQpLCBhbmQgaXQgY2xlYW5zIHRoZSB2YWx1ZSBvZiBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5vblNlYXJjaFJlc2V0Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyUmVzdWx0cygpO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIGhhbmRsZXJzIGV2ZW50cyBBdXRvQ29tcGxldGUgIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2xpY2snIG9uICdHUGxvY2F0aW9uT3JpZ2luJyBpbnB1dFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uQXV0b0NvbXBsZXRlSW5wdXRDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlucHV0U2VhcmNoVGV4dENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiR1BzZWFyY2hJbnB1dFRleHQtXCIgKyB0aGlzLl91aWQpO1xuICAgICAgICBpZiAoaW5wdXRTZWFyY2hUZXh0Q29udGFpbmVyICYmICFpbnB1dFNlYXJjaFRleHRDb250YWluZXIuZGlzYWJsZWQgJiYgaW5wdXRTZWFyY2hUZXh0Q29udGFpbmVyLnZhbHVlLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlTdWdnZXN0ZWRMb2NhdGlvbigpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAna2V5dXAnIG9uICdHUHNlYXJjaElucHV0VGV4dCcgdGFnIGlucHV0XG4gICAgICogKGNmLiB0aGlzLl9jcmVhdGVTZWFyY2hJbnB1dEVsZW1lbnQpLCBhbmQgaXQgZ2V0cyB0aGUgdmFsdWUgb2YgaW5wdXQuXG4gICAgICogdGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBzZXJ2aWNlIGF1dG9jb21wbGV0ZSAodGV4dCkuXG4gICAgICogdGhlIHJlc3VsdHMgb2YgdGhlIHJlcXVlc3QgYXJlIGRpc3BsYXllZCBpbnRvIGEgZHJvcCBkb3duIG1lbnUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uQXV0b0NvbXBsZXRlU2VhcmNoVGV4dCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbiBzYXV2ZWdhcmRlIGxlIGxvY2FsaXNhbnRcbiAgICAgICAgdGhpcy5fY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uID0gdmFsdWU7XG5cbiAgICAgICAgLy8gb24gbGltaXRlIGxlcyByZXF1w6p0ZXMgw6AgcGFydGlyIGRlIDMgY2FyLiBzYWlzaWUgIVxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJTdWdnZXN0ZWRMb2NhdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF90cmlnZ2VyR2VvY29kZSA9IHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGVPcHRpb25zLnRyaWdnZXJHZW9jb2RlO1xuICAgICAgICB2YXIgX3RyaWdnZXJEZWxheSA9IHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGVPcHRpb25zLnRyaWdnZXJEZWxheTtcblxuICAgICAgICAvLyBJTkZPUk1BVElPTlxuICAgICAgICAvLyBvbiBlZmZlY3R1ZSBsYSByZXF1w6p0ZSBhdSBzZXJ2aWNlIGQnYXV0b2NvbXBsZXRpb24uXG4gICAgICAgIC8vIG9uIG1ldCBlbiBwbGFjZSBkZXMgY2FsbGJhY2tzIGFmaW4gZGUgcmVjdXBlcmVyIGxlcyByZXN1bHRhdHMgb3VcbiAgICAgICAgLy8gbGVzIG1lc3NhZ2VzIGQnZXJyZXVycyBkdSBzZXJ2aWNlLlxuICAgICAgICAvLyBsZXMgcmVzdWx0YXRzIHNvbnQgYWZmaWNow6lzIGRhbnMgdW5lIGxpc3RlIGRlcm91bGFudGUuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgdGhpcy5fcmVxdWVzdEF1dG9Db21wbGV0ZSh7XG4gICAgICAgICAgICB0ZXh0IDogdmFsdWUsXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvblN1Y2Nlc3NcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcInJlcXVlc3QgZnJvbSBBdXRvQ29tcGxldGVcIiwgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gc2F1dmVnYXJkZSBsJ2V0YXQgZGVzIHLDqXN1bHRhdHNcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zID0gcmVzdWx0cy5zdWdnZXN0ZWRMb2NhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gdsOpcmlmaWUgcXUnb24gbidhIHBhcyByw6ljdXDDqXLDqSBkZXMgY29vcmRvbm7DqWVzIG51bGxlcyAocGFyIGV4IHJlY2hlcmNoZSBwYXIgY29kZSBwb3N0YWwpXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWxvY2F0aW9uID0gY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlsb2NhdGlvbi5wb3NpdGlvbiAmJiBpbG9jYXRpb24ucG9zaXRpb24ueCA9PT0gMCAmJiBpbG9jYXRpb24ucG9zaXRpb24ueSA9PT0gMCAmJiBpbG9jYXRpb24uZnVsbFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBsZXMgY29vcmRvbm7DqWVzIHNvbnQgbnVsbGVzLCBpbCBmYXV0IHJlbGFuY2VyIHVuZSByZXF1w6p0ZSBkZSBnw6lvY29kYWdlIGF2ZWMgbCdhdHRyaWJ1dCBcImZ1bGxUZXh0XCIgcsOpY3Vww6lyw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9nZXRHZW9jb2RlQ29vcmRpbmF0ZXNGcm9tRnVsbFRleHQoaWxvY2F0aW9uLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lub24gb24gcGV1dCBhZmZpY2hlciBub3JtYWxlbWVudCBsZSByw6lzdWx0YXQgZGFucyBsYSBsaXN0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWQucHVzaChpbG9jYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBhZmZpY2hlIGxlcyByw6lzdWx0YXRzIHF1aSBuJ29udCBwYXMgZGVzIGNvb3Jkb25uw6llcyBudWxsZXNcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fZmlsbEF1dG9Db21wbGV0ZWRMb2NhdGlvbkxpc3RDb250YWluZXIoY29udGV4dC5fbG9jYXRpb25zVG9CZURpc3BsYXllZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGFubnVsZSBldmVudHVlbGxlbWVudCB1bmUgcmVxdWV0ZSBkZSBnZW9jb2RhZ2UgZW4gY291cnMgY2FyIG9uIG9idGllbnQgZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlIG5vdXZlYXUgZGVzIHJlc3VsdGF0cyBkJ2F1dG9jb21wbGV0aW9uLi4uXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Ll90cmlnZ2VySGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RyaWdnZXJIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3RyaWdnZXJIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ2FuY2VsIGEgZ2VvY29kZSByZXF1ZXN0ICFcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgb25GYWlsdXJlXG4gICAgICAgICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRVxuICAgICAgICAgICAgICAgIC8vIG/DuSBhZmZpY2hlIHQgb24gbGVzIG1lc3NhZ2VzIDogZXguICdObyBzdWdnZXN0aW9uIG1hdGNoaW5nIHRoZSBzZWFyY2gnID9cbiAgICAgICAgICAgICAgICBjb250ZXh0Ll9jbGVhclN1Z2dlc3RlZExvY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAvLyBvbiBlbnZvaWUgdW5lIHJlcXVldGUgZGUgZ2VvY29kYWdlIHNpIGF1Y3VuIHJlc3VsdGF0IGQnYXV0b2NvbXBsZXRpb25cbiAgICAgICAgICAgICAgICAvLyBuJ2Egw6l0w6kgdHJvdXbDqSAhIEV0IG9uIG4nb3VibGllIHBhcyBkJ2FubnVsZXIgY2VsbGUgcXVpIGVzdCBlbiBjb3VycyAhXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgPT09IFwiTm8gc3VnZ2VzdGlvbiBtYXRjaGluZyB0aGUgc2VhcmNoXCIgJiYgX3RyaWdnZXJHZW9jb2RlIC8qICYmIHZhbHVlLmxlbmd0aCA9PT0gNSAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5fdHJpZ2dlckhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90cmlnZ2VySGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIkNhbmNlbCB0aGUgbGFzdCBnZW9jb2RlIHJlcXVlc3QgIVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll90cmlnZ2VySGFuZGxlciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJMYXVuY2ggYSBnZW9jb2RlIHJlcXVlc3QgKGNvZGUgcG9zdGFsKSAhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3JlcXVlc3RHZW9jb2Rpbmcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBvblN1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJyZXF1ZXN0IGZyb20gR2VvY29kaW5nXCIsIHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9sb2NhdGlvbnNUb0JlRGlzcGxheWVkID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gbW9kaWZpZSBsYSBzdHJ1Y3R1cmUgZGVzIHJlcG9uc2VzIHBvdXIgw6p0cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmxlIGF2ZWMgbCdhdXRvY29tcGxldGlvbiAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9ucyA9IHJlc3VsdHMubG9jYXRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9IGxvY2F0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uZnVsbFRleHQgPSBHZW9jb2RlVXRpbHMuZ2V0R2VvY29kZWRMb2NhdGlvbkZyZWVmb3JtKGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IDogbG9jYXRpb24ucG9zaXRpb24ubG9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA6IGxvY2F0aW9uLnBvc2l0aW9uLmxhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9sb2NhdGlvbnNUb0JlRGlzcGxheWVkLnB1c2gobG9jYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9maWxsQXV0b0NvbXBsZXRlZExvY2F0aW9uTGlzdENvbnRhaW5lcihsb2NhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBvbkZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfdHJpZ2dlckRlbGF5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgbWFwID0gdGhpcy5nZXRNYXAoKTtcbiAgICAgICAgbWFwLm9uKFxuICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgdGhpcy5faGlkZVN1Z2dlc3RlZExvY2F0aW9uLFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgICBtYXAub24oXG4gICAgICAgICAgICBcInBvaW50ZXJkcmFnXCIsXG4gICAgICAgICAgICB0aGlzLl9oaWRlU3VnZ2VzdGVkTG9jYXRpb24sXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBHcC5TZXJ2aWNlcy5hdXRvQ29tcGxldGUgY2FsbGJhY2sgaW4gY2FzZSBvZiBzdWNjZXNzXG4gICAgICogKGNmLiB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoVGV4dCksIGZvciBzdWdnZXN0ZWQgbG9jYXRpb25zIHdpdGggbnVsbCBjb29yZGluYXRlc1xuICAgICAqIChjYXNlIG9mIHBvc3RhbENvZGUgcmVzZWFyY2ggZm9yIGluc3RhbmNlKS5cbiAgICAgKiBTZW5kIGEgZ2VvY29kZSByZXF1ZXN0IHdpdGggc3VnZ2VzdGVkIGxvY2F0aW9uICdmdWxsVGV4dCcgYXR0cmlidXRlLCB0byBnZXQgaXRzIGNvb3JkaW5hdGVzIGFuZCBkaXNwbGF5IGl0IGluIGF1dG9jb21wbGV0ZSByZXN1bHRzIGxpc3QgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtHcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGVSZXNwb25zZS5TdWdnZXN0ZWRMb2NhdGlvbn0gc3VnZ2VzdGVkTG9jYXRpb24gLSBhdXRvY29tcGxldGlvbiByZXN1bHQgKHdpdGggbnVsbCBjb29yZGluYXRlcykgdG8gYmUgZ2VvY29kZWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaSAtIHN1Z2dlc3RlZExvY2F0aW9uIHBvc2l0aW9uIGluIEdwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZVJlc3BvbnNlLnN1Z2dlc3RlZExvY2F0aW9ucyBhdXRvY29tcGxldGUgcmVzdWx0cyBsaXN0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLl9nZXRHZW9jb2RlQ29vcmRpbmF0ZXNGcm9tRnVsbFRleHQgPSBmdW5jdGlvbiAoc3VnZ2VzdGVkTG9jYXRpb24sIGkpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBHcC5TZXJ2aWNlcy5nZW9jb2RlKHtcbiAgICAgICAgICAgIGFwaUtleSA6IHRoaXMub3B0aW9ucy5hcGlLZXksXG4gICAgICAgICAgICBzc2wgOiB0aGlzLm9wdGlvbnMuc3NsLFxuICAgICAgICAgICAgcSA6IEdlb2NvZGVVdGlscy5nZXRTdWdnZXN0ZWRMb2NhdGlvbkZyZWVmb3JtKHN1Z2dlc3RlZExvY2F0aW9uKSxcbiAgICAgICAgICAgIGluZGV4IDogc3VnZ2VzdGVkTG9jYXRpb24udHlwZSxcbiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9uU3VjY2Vzc1xuICAgICAgICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcInJlcXVlc3QgZnJvbSBHZW9jb2RpbmcgKGNvb3JkaW5hdGVzIG51bGwpXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubG9jYXRpb25zICYmIHJlc3BvbnNlLmxvY2F0aW9ucy5sZW5ndGggIT09IDAgJiYgcmVzcG9uc2UubG9jYXRpb25zWzBdLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIG1vZGlmaWUgbGVzIGNvb3Jkb25uw6llcyBkdSByw6lzdWx0YXQgZW4gRVBTRzo0MzI2IGRvbmMgbGF0LGxvblxuICAgICAgICAgICAgICAgICAgICAvLy8gXFxUT0RPIHZlcmlmaWVyIHNpIGwnaW52ZXJzaW9uIGRlcyBjb29yZG9ubmVlcyBlc3QgbmVjZXNzYWlyZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zICYmIGNvbnRleHQuX3N1Z2dlc3RlZExvY2F0aW9uc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fc3VnZ2VzdGVkTG9jYXRpb25zW2ldLnBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiA6IHJlc3BvbnNlLmxvY2F0aW9uc1swXS5wb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCA6IHJlc3BvbnNlLmxvY2F0aW9uc1swXS5wb3NpdGlvbi54XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXQgb24gbCdhZmZpY2hlIGRhbnMgbGEgbGlzdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWQudW5zaGlmdChjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fZmlsbEF1dG9Db21wbGV0ZWRMb2NhdGlvbkxpc3RDb250YWluZXIoY29udGV4dC5fbG9jYXRpb25zVG9CZURpc3BsYXllZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgb25GYWlsdXJlXG4gICAgICAgICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gc2kgb24gbidhIHBhcyByw6l1c3NpIMOgIHLDqWN1cMOpcmVyIGxlcyBjb29yZG9ubsOpZXMsIG9uIGFmZmljaGUgcXVhbmQgbcOqbWUgbGUgcsOpc3VsdGF0XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuX3N1Z2dlc3RlZExvY2F0aW9ucyAmJiBjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fY3JlYXRlQXV0b0NvbXBsZXRlZExvY2F0aW9uRWxlbWVudChjb250ZXh0Ll9zdWdnZXN0ZWRMb2NhdGlvbnNbaV0sIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2xpY2snIG9uICdHUGF1dG9Db21wbGV0ZVJlc3VsdHNMaXN0JyB0YWcgZGl2XG4gICAgICogKGNmLiB0aGlzLl9jcmVhdGVBdXRvQ29tcGxldGVMaXN0RWxlbWVudCksIGFuZCBpdCBzZWxlY3RzIHRoZSBsb2NhdGlvbi5cbiAgICAgKiB0aGlzIGxvY2F0aW9uIGRpc3BsYXlzIGEgbWFya2VyIG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uQXV0b0NvbXBsZXRlZFJlc3VsdHNJdGVtQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBUT0RPIG9uIHNvdWhhaXRlIHVuIGNvbXBvcnRlbWVudCBkaWZmZXJlbnQgcG91ciBsYSBzZWxlY3Rpb24gZGVzIHJlcG9uc2VzXG4gICAgICAgIC8vIGRlIGwnYXV0b2NvbXBsZXRpb24gOlxuICAgICAgICAvLyAtIGxpc3RlIGRlcm91bGFudGUgZGVzIHJlcG9uc2VzLFxuICAgICAgICAvLyAtIHB1aXMgcG9zc2liaWxpdMOpIGRlIGNsaXF1ZXIgc3VyIHVuZSBzdWdnZXN0aW9uXG4gICAgICAgIC8vIC0gbWFpcyBhdXNzaSBkZSBsYSBjaG9pc2lyIGF2ZWMgbGUgY2xhdmllciAoYXJyb3cgdXAvZG93biksIHB1aXMgdmFsaWRlclxuICAgICAgICAvLyBwYXIgdW4gcmV0dXJuXG4gICAgICAgIC8vIGNldHRlIHNlbGVjdGlvbiBhdmVjIGxlcyBmbGVjaGVzIGRvaXQgbWV0dHJlIMOgIGpvdXIgbGUgaW5wdXQgIVxuICAgICAgICAvLyAoY29tbWUgdW4gbW90ZXVyIGRlIHJlY2hlcmNoZSBkZSBuYXZpZ2F0ZXVyKVxuXG4gICAgICAgIHZhciBpZHggPSBTZWxlY3RvcklELmluZGV4KGUudGFyZ2V0LmlkKTtcbiAgICAgICAgbG9nZ2VyLmxvZyhpZHgpO1xuICAgICAgICBsb2dnZXIubG9nKHRoaXMuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWRbaWR4XSk7XG5cbiAgICAgICAgaWYgKCFpZHgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFtcbiAgICAgICAgICAgIHRoaXMuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWRbaWR4XS5wb3NpdGlvbi54LFxuICAgICAgICAgICAgdGhpcy5fbG9jYXRpb25zVG9CZURpc3BsYXllZFtpZHhdLnBvc2l0aW9uLnlcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICBzZXJ2aWNlIDogXCJTdWdnZXN0ZWRMb2NhdGlvblwiLFxuICAgICAgICAgICAgbG9jYXRpb24gOiB0aGlzLl9sb2NhdGlvbnNUb0JlRGlzcGxheWVkW2lkeF1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBvbiBham91dGUgbGUgdGV4dGUgZGUgbCdhdXRvY29tcGzDqXRpb24gZGFucyBsJ2lucHV0XG4gICAgICAgIHZhciBsYWJlbCA9IEdlb2NvZGVVdGlscy5nZXRTdWdnZXN0ZWRMb2NhdGlvbkZyZWVmb3JtKHRoaXMuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWRbaWR4XSk7XG4gICAgICAgIHRoaXMuX3NldExhYmVsKGxhYmVsKTtcblxuICAgICAgICAvLyBvbiBzYXV2ZWdhcmRlIGxlIGxvY2FsaXNhbnRcbiAgICAgICAgdGhpcy5fY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uID0gbGFiZWw7XG5cbiAgICAgICAgLy8gSW5mbyA6IGxhIHBvc2l0aW9uIGVzdCBlbiBFUFNHOjQzMjYsIMOgIHRyYW5zZm9ybWVyIGRhbnMgbGEgcHJvamVjdGlvbiBkZSBsYSBjYXJ0ZVxuICAgICAgICB2YXIgdmlldyA9IHRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpO1xuICAgICAgICB2YXIgbWFwUHJvaiA9IHZpZXcuZ2V0UHJvamVjdGlvbigpLmdldENvZGUoKTtcbiAgICAgICAgaWYgKG1hcFByb2ogIT09IFwiRVBTRzo0MzI2XCIpIHtcbiAgICAgICAgICAgIC8vIG9uIHJldHJhbnNmb3JtZSBsZXMgY29vcmRvbm7DqWVzIGRlIGxhIHBvc2l0aW9uIGRhbnMgbGEgcHJvamVjdGlvbiBkZSBsYSBjYXJ0ZVxuICAgICAgICAgICAgcG9zaXRpb24gPSBvbFByb2pUcmFuc2Zvcm0ocG9zaXRpb24sIFwiRVBTRzo0MzI2XCIsIG1hcFByb2opO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9uIGNlbnRyZSBsYSB2dWUgZXQgcG9zaXRpb25uZSBsZSBtYXJrZXIsIMOgIGxhIHBvc2l0aW9uIHJlcHJvamV0w6llIGRhbnMgbGEgcHJvamVjdGlvbiBkZSBsYSBjYXJ0ZVxuICAgICAgICB2YXIgem9vbSA9IHRoaXMuX2dldFpvb20oaW5mbyk7XG4gICAgICAgIHRoaXMuX3NldFBvc2l0aW9uKHBvc2l0aW9uLCB6b29tKTtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlNYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldE1hcmtlcihwb3NpdGlvbiwgaW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGV2ZW50IHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgb2YgdGhlIHJlc3VsdHMgaXMgY2xpY2tlZCBmb3IgYXV0b2NvbXBsZXRpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IHNlYXJjaGVuZ2luZTphdXRvY29tcGxldGU6Y2xpY2tcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHR5cGUgLSBldmVudFxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gbG9jYXRpb24gLSBsb2NhdGlvblxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGFyZ2V0IC0gaW5zdGFuY2UgU2VhcmNoRW5naW5lXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFNlYXJjaEVuZ2luZS5vbihcInNlYXJjaGVuZ2luZTphdXRvY29tcGxldGU6Y2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhlLmxvY2F0aW9uKTtcbiAgICAgICAgICogfSlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICB0eXBlIDogXCJzZWFyY2hlbmdpbmU6YXV0b2NvbXBsZXRlOmNsaWNrXCIsXG4gICAgICAgICAgICBsb2NhdGlvbiA6IHRoaXMuX2xvY2F0aW9uc1RvQmVEaXNwbGF5ZWRbaWR4XVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIEdlb2NvZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJ3N1Ym1pdCcgb24gJ0dQc2VhcmNoSW5wdXQnIHRhZyBmb3JtXG4gICAgICogKGNmLiB0aGlzLl9jcmVhdGVTZWFyY2hJbnB1dEVsZW1lbnQpLCBhbmQgaXQgZ2V0cyB0aGUgdmFsdWUgb2YgaW5wdXQuXG4gICAgICogdGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBzZXJ2aWNlIGdlb2NvZGluZy5cbiAgICAgKiB0aGUgcmVzdWx0cyBvZiB0aGUgcmVxdWVzdCBhcmUgZGlzcGxheWVkIGludG8gYSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTZWFyY2hFbmdpbmUucHJvdG90eXBlLm9uR2VvY29kaW5nU2VhcmNoU3VibWl0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZS50YXJnZXRbMF0udmFsdWU7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIHNhdXZlZ2FyZGUgbGUgbG9jYWxpc2FudFxuICAgICAgICB0aGlzLl9jdXJyZW50R2VvY29kaW5nTG9jYXRpb24gPSB2YWx1ZTtcblxuICAgICAgICAvLyBvbiBtZXQgZW4gcGxhY2UgbCdhZmZpY2hhZ2UgZGVzIHJlc3VsdGF0cyBkYW5zIHVuZSBmZW5ldHJlIGRlIHJlY2hlcmNoZS5cbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0R2VvY29kaW5nKHtcbiAgICAgICAgICAgIHF1ZXJ5IDogdmFsdWUsXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvblN1Y2Nlc3NcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcInJlcXVlc3QgZnJvbSBHZW9jb2RpbmdcIiwgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9ucyA9IHJlc3VsdHMubG9jYXRpb25zO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9maWxsR2VvY29kZWRMb2NhdGlvbkxpc3RDb250YWluZXIobG9jYXRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgb25GYWlsdXJlXG4gICAgICAgICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBjZi4gdGhpcy5vbkF1dG9Db21wbGV0ZVNlYXJjaCgpXG4gICAgICAgICAgICAgICAgY29udGV4dC5fY2xlYXJHZW9jb2RlZExvY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnc3VibWl0JyBvbiAnR1BnZW9jb2RlUmVzdWx0c0xpc3QnIHRhZyBkaXZcbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZUdlb2NvZGVSZXN1bHRzTGlzdEVsZW1lbnQpLCBhbmQgaXQgc2VsZWN0cyB0aGUgbG9jYXRpb24uXG4gICAgICogdGhpcyBsb2NhdGlvbiBkaXNwbGF5cyBhIG1hcmtlciBvbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGUgLSBIVE1MRWxlbWVudFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5vbkdlb2NvZGVkUmVzdWx0c0l0ZW1DbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBpZHggPSBTZWxlY3RvcklELmluZGV4KGUudGFyZ2V0LmlkKTtcblxuICAgICAgICBpZiAoIWlkeCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgdGhpcy5fZ2VvY29kZWRMb2NhdGlvbnNbaWR4XS5wb3NpdGlvbi5sb24sXG4gICAgICAgICAgICB0aGlzLl9nZW9jb2RlZExvY2F0aW9uc1tpZHhdLnBvc2l0aW9uLmxhdFxuICAgICAgICBdO1xuICAgICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgICAgIHNlcnZpY2UgOiBcIkdlb2NvZGVkTG9jYXRpb25cIixcbiAgICAgICAgICAgIGxvY2F0aW9uIDogdGhpcy5fZ2VvY29kZWRMb2NhdGlvbnNbaWR4XVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG9uIGFqb3V0ZSBsZSB0ZXh0ZSBkdSBnw6lvY29kYWdlIGRhbnMgbCdpbnB1dFxuICAgICAgICB2YXIgbGFiZWwgPSBHZW9jb2RlVXRpbHMuZ2V0R2VvY29kZWRMb2NhdGlvbkZyZWVmb3JtKHRoaXMuX2dlb2NvZGVkTG9jYXRpb25zW2lkeF0pO1xuICAgICAgICB0aGlzLl9zZXRMYWJlbChsYWJlbCk7XG5cbiAgICAgICAgLy8gSW5mbyA6IGxhIHBvc2l0aW9uIGVzdCBlbiBFUFNHOjQzMjYsIMOgIHRyYW5zZm9ybWVyIGRhbnMgbGEgcHJvamVjdGlvbiBkZSBsYSBjYXJ0ZVxuICAgICAgICB2YXIgdmlldyA9IHRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpO1xuICAgICAgICB2YXIgbWFwUHJvaiA9IHZpZXcuZ2V0UHJvamVjdGlvbigpLmdldENvZGUoKTtcbiAgICAgICAgaWYgKG1hcFByb2ogIT09IFwiRVBTRzo0MzI2XCIpIHtcbiAgICAgICAgICAgIC8vIG9uIHJldHJhbnNmb3JtZSBsZXMgY29vcmRvbm7DqWVzIGRlIGxhIHBvc2l0aW9uIGRhbnMgbGEgcHJvamVjdGlvbiBkZSBsYSBjYXJ0ZVxuICAgICAgICAgICAgcG9zaXRpb24gPSBvbFByb2pUcmFuc2Zvcm0ocG9zaXRpb24sIFwiRVBTRzo0MzI2XCIsIG1hcFByb2opO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9uIGNlbnRyZSBsYSB2dWUgZXQgcG9zaXRpb25uZSBsZSBtYXJrZXIsIMOgIGxhIHBvc2l0aW9uIHJlcHJvamV0w6llIGRhbnMgbGEgcHJvamVjdGlvbiBkZSBsYSBjYXJ0ZVxuICAgICAgICB2YXIgem9vbSA9IHRoaXMuX2dldFpvb20oaW5mbyk7XG4gICAgICAgIHRoaXMuX3NldFBvc2l0aW9uKHBvc2l0aW9uLCB6b29tKTtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlNYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldE1hcmtlcihwb3NpdGlvbiwgaW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGV2ZW50IHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgb2YgdGhlIHJlc3VsdHMgaXMgY2xpY2tlZCBmb3IgZ2VvY29kaW5nXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBzZWFyY2hlbmdpbmU6Z2VvY29kZTpjbGlja1xuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdHlwZSAtIGV2ZW50XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2NhdGlvbiAtIGxvY2F0aW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0YXJnZXQgLSBpbnN0YW5jZSBTZWFyY2hFbmdpbmVcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogU2VhcmNoRW5naW5lLm9uKFwic2VhcmNoZW5naW5lOmdlb2NvZGU6Y2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhlLmxvY2F0aW9uKTtcbiAgICAgICAgICogfSlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICB0eXBlIDogXCJzZWFyY2hlbmdpbmU6Z2VvY29kZTpjbGlja1wiLFxuICAgICAgICAgICAgbG9jYXRpb24gOiB0aGlzLl9nZW9jb2RlZExvY2F0aW9uc1tpZHhdXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMgaGFuZGxlcnMgZXZlbnRzIEdlb2NvZGUgQWR2YW5jZWQgIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2hhbmdlJyBvbiAnR1BhZHZhbmNlZFNlYXJjaENvZGUnIHRhZyBzZWxlY3RcbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoRm9ybUNvZGVFbGVtZW50KSwgYW5kIGl0IGdldHMgdGhlIHZhbHVlIG9mXG4gICAgICogb3B0aW9uIHNlbGVjdGVkLlxuICAgICAqIHRoaXMgdmFsdWUgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRzIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gSFRNTEVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUub25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaENvZGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBsb2dnZXIubG9nKGUpO1xuICAgICAgICB2YXIgaWR4ID0gZS50YXJnZXQuc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgdmFyIHZhbHVlID0gZS50YXJnZXQub3B0aW9uc1tpZHhdLnZhbHVlO1xuXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElORk9STUFUSU9OXG4gICAgICAgIC8vIGxlIGRlY2xlbmNoZW1lbnQgZGUgbCdldmVuZW1lbnQgdmEgY3JlZXIgdW4gY29udGFpbmVyIGRlIGZpbHRyZSDDoCBsYSB2b2zDqWUuLi5cbiAgICAgICAgLy8gbCdpbnNlcnRpb24gZGVzIGNvbnRhaW5lcnMgZCdhdHRyaWJ1dHMgZGFucyBsZSBET00gc29udCA6XG4gICAgICAgIC8vIC0gc29pdCBHUGFkdmFuY2VkU2VhcmNoRmlsdGVycyA+IFBvc2l0aW9uT2ZJbnRlcmVzdFxuICAgICAgICAvLyAtIHNvaXQgR1BhZHZhbmNlZFNlYXJjaEZpbHRlcnMgPiBTdHJlZXRBZGRyZXNzXG4gICAgICAgIC8vIC0gc29pdCBHUGFkdmFuY2VkU2VhcmNoRmlsdGVycyA+IENhZGFzdHJhbFBhcmNlbFxuICAgICAgICAvLyBjZi4gX3NldEZpbHRlcigpIHBvdXIgbGEgY3JlYXRpb24gZHUgY29udGFpbmVyXG5cbiAgICAgICAgdGhpcy5fc2V0RmlsdGVyKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50ICdzdWJtaXQnIG9uICdHUGFkdmFuY2VkU2VhcmNoRm9ybScgdGFnIGZvcm1cbiAgICAgKiAoY2YuIHRoaXMuX2NyZWF0ZUFkdmFuY2VkU2VhcmNoUGFuZWxGb3JtRWxlbWVudCksIGFuZCBpdCBnZXRzIHRoZSB2YWx1ZSBvZiBhbGwgaW5wdXQuXG4gICAgICogdGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBzZXJ2aWNlIGdlb2NvZGluZy5cbiAgICAgKiB0aGUgcmVzdWx0cyBvZiB0aGUgcmVxdWVzdCBhcmUgZGlzcGxheWVkIGludG8gYSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEhUTUxFbGVtZW50XG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSAtIFt7a2V5OiAuLi4sIHZhbHVlOiAuLi59XVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2VhcmNoRW5naW5lLnByb3RvdHlwZS5vbkdlb2NvZGluZ0FkdmFuY2VkU2VhcmNoU3VibWl0ID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgbG9nZ2VyLmxvZyhkYXRhKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2xvY2F0aW9uO1xuICAgICAgICB2YXIgX2ZpbHRlck9wdGlvbnMgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBkYXRhW2ldO1xuICAgICAgICAgICAgaWYgKGZpbHRlci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIua2V5ID09PSBcInNlY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2ZpbHRlck9wdGlvbnNbZmlsdGVyLmtleV0gPSBmaWx0ZXIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5wdXRTZWFyY2hUZXh0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJHUHNlYXJjaElucHV0VGV4dC1cIiArIHRoaXMuX3VpZCk7XG4gICAgICAgIF9sb2NhdGlvbiA9IGlucHV0U2VhcmNoVGV4dENvbnRhaW5lci52YWx1ZTtcblxuICAgICAgICAvLyBPbiBuZSBwcmVuZCBwYXMgZW4gY29tcHRlIGNlIHF1J2lsIHkgYSBkYW5zIGwnaW5wdXQgZGUgcmVjaGVyY2hlIHNpbXBsZSBwb3VyIGxhIHJlY2hlcmNoZSBhdmFuY2UgZGUgUENcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRHZW9jb2RpbmdDb2RlID09PSBcIkNhZGFzdHJhbFBhcmNlbFwiKSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gPSBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gbWV0IGVuIHBsYWNlIGwnYWZmaWNoYWdlIGRlcyByZXN1bHRhdHMgZGFucyB1bmUgZmVuZXRyZSBkZSByZWNoZXJjaGUuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgdGhpcy5fcmVxdWVzdEdlb2NvZGluZyh7XG4gICAgICAgICAgICBxdWVyeSA6IF9sb2NhdGlvbixcbiAgICAgICAgICAgIGluZGV4IDogdGhpcy5fY3VycmVudEdlb2NvZGluZ0NvZGUsXG4gICAgICAgICAgICBmaWx0ZXJzIDogX2ZpbHRlck9wdGlvbnMsXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvblN1Y2Nlc3NcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25zID0gcmVzdWx0cy5sb2NhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX2ZpbGxHZW9jb2RlZExvY2F0aW9uTGlzdENvbnRhaW5lcihsb2NhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBvbkZhaWx1cmVcbiAgICAgICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNmLiB0aGlzLm9uQXV0b0NvbXBsZXRlU2VhcmNoKClcbiAgICAgICAgICAgICAgICBjb250ZXh0Ll9jbGVhckdlb2NvZGVkTG9jYXRpb24oKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5ICdvbkdlb2NvZGluZ0FkdmFuY2VkU2VhcmNoU3VibWl0JyBtZXRob2QsXG4gICAgICogaW4gY2FzZSBnZW9jb2RpbmcgdHlwZSBpcyAnQ2FkYXN0cmFsUGFyY2VsJyxcbiAgICAgKiBhbmQgZ2V0cyByZXF1ZXN0IHBhcmFtZXRlcnMgZnJvbSBpbnB1dHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWx0ZXJPcHRpb25zIC0gb2JqZWN0IHdpdGggaW5wdXRzIHZhbHVlIChkZXBhcnRtZW50LCBpbnNlZSwgLi4uKVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGxvY2F0aW9uIC0gY2FkYXN0cmFsIHBhcmNlbCBudW1iZXIgOiBjb25jYXRlbmF0aW9uIG9mIGlucHV0cyB2YWx1ZXMgKGUuZy4gOiA5NDA2NzAwMDBEMDA0MSBvciA5NDA2N19fX19fMDA0MSlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2dldENhZGFzdHJhbFBhcmNlbFJlcXVlc3RQYXJhbXMgPSBmdW5jdGlvbiAoZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAvKiBpbmZvOlxuICAgICAgICAgICAgbGEgcGFyY2VsbGUgY2FkYXN0cmFsZSBzZSBjb21wb3NlIGRlIDE0IGNoaWZmcmVzIG91IGxldHRyZXMsIGluZGlxdWFudCwgZGUgZ2F1Y2hlIMOgIGRyb2l0ZSA6XG4gICAgICAgICAgICAtIGxlIGNvZGUgZHUgZMOpcGFydGVtZW50ICgyIGNhcmFjdMOocmVzKVxuICAgICAgICAgICAgLSBsZSBjb2RlIGNvbW11bmUgKDMgY2FyYWN0w6hyZXMpLiAoUmVtYXJxdWUgOiBjb2RlIGTDqXBhcnRlbWVudCArIGNvZGUgY29tbXVuZSA9IGNvZGUgSU5TRUUpXG4gICAgICAgICAgICAtIE9VIGxlIGNvZGUgSU5TRUUgZGUgbGEgY29tbXVuZSAoNSBjaGlmZnJlcykgKHJlbXBsYWNlIGxlcyAyIHByw6ljw6lkZW50cylcbiAgICAgICAgICAgIC0gbGUgY29kZSBjb21tdW5lIGFic29yYsOpZSBJTlNFRSwgb3UgJzAwMCcgKDMgY2FyYWN0w6hyZXMpLFxuICAgICAgICAgICAgLSBsYSBzZWN0aW9uICgyIGNhcmFjdMOocmVzKSxcbiAgICAgICAgICAgIC0gbGUgbnVtw6lybyBkZSBwYXJjZWxsZSAoNCBjYXJhY3TDqHJlcykuXG4gICAgICAgICAgICBFeGVtcGxlIGRlIHBhcmNlbGxlIDogJzk0MDY3MDAwMEQwMDQxJy4gU2kgbCdpZGVudGlmaWFudCBlc3QgaW5jb21wbGV0IChwYXIgZXhlbXBsZSAnOTQwNjcwMDAwRCcpLCBsZSBzZXJ2aWNlIHJlbnZlcnJhIHVuaXF1ZW1lbnQgbGVzIDI1IHByZW1pZXJzIHLDqXN1bHRhdHMgcG91dmFudCBjb3JyZXNwb25kcmUuXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIF9sb2NhdGlvbiA9IFwiXCI7XG5cbiAgICAgICAgdmFyIGw7XG4gICAgICAgIC8vIGNvZGUgZMOpcGFydGVtZW50ICgyIGNhcmFjdMOocmVzKVxuICAgICAgICB2YXIgZGVwID0gZmlsdGVyT3B0aW9ucy5kZXBhcnRtZW50O1xuICAgICAgICBpZiAoZGVwKSB7XG4gICAgICAgICAgICBsID0gZGVwLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uID0gZGVwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gc2kgdW4gc2V1bCBudW3DqXJvIGEgw6l0w6kgc2Fpc2ksIG9uIHByw6lzdW1lIHF1ZSBjJ2VzdCB1biBudW3DqXJvIDwgMTBcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gPSBcIjBcIiArIGRlcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uID0gZGVwLnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9sb2NhdGlvbiA9IFwiX19cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvZGUgY29tbXVuZSBpbnNlZSAoMyBjYXJhY3TDqHJlcylcbiAgICAgICAgdmFyIGNvbW11bmUgPSBmaWx0ZXJPcHRpb25zLmNvbW11bmU7XG4gICAgICAgIGlmIChjb21tdW5lKSB7XG4gICAgICAgICAgICBsID0gY29tbXVuZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobCA9PT0gMykge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBjb21tdW5lO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IFwiX1wiICsgY29tbXVuZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9fXCIgKyBjb21tdW5lO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gbCA+IDNcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gY29tbXVuZS5zdWJzdHJpbmcoMCwgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX19cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvZGUgaW5zZWUgKDUgY2FyYWN0w6hyZXMpIDogc3VyY2hhcmdlIGxlcyAyIGF1dHJlcyBzaSByZW5zZWlnbsOpXG4gICAgICAgIHZhciBpbnNlZSA9IGZpbHRlck9wdGlvbnMuaW5zZWU7XG4gICAgICAgIGlmIChpbnNlZSkge1xuICAgICAgICAgICAgaWYgKGluc2VlLmxlbmd0aCA9PT0gNSkge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiA9IGluc2VlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29kZSBjb21tdW5lIGFic29yYmVlIElOU0VFICgzIGNhcmFjdMOocmVzKVxuICAgICAgICB2YXIgYWJzb3JiZWRDaXR5ID0gZmlsdGVyT3B0aW9ucy5hYnNvcmJlZENpdHk7XG4gICAgICAgIGlmIChhYnNvcmJlZENpdHkpIHtcbiAgICAgICAgICAgIGwgPSBhYnNvcmJlZENpdHkubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGwgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gYWJzb3JiZWRDaXR5O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsIDwgMykge1xuICAgICAgICAgICAgICAgIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9cIiArIGFic29yYmVkQ2l0eTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IFwiX19cIiArIGFic29yYmVkQ2l0eTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBsID4gM1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBhYnNvcmJlZENpdHkuc3Vic3RyaW5nKDAsIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2xvY2F0aW9uICs9IFwiX19fXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWN0aW9uICgyIGNhcmFjdMOocmVzKVxuICAgICAgICB2YXIgc2VjdGlvbiA9IGZpbHRlck9wdGlvbnMuc2VjdGlvbjtcbiAgICAgICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgICAgICAgIGwgPSBzZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IHNlY3Rpb247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfXCIgKyBzZWN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gc2VjdGlvbi5zdWJzdHJpbmcoMCwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbnVtw6lybyBkZSBwYXJjZWxsZSAoNCBjYXJhY3TDqHJlcylcbiAgICAgICAgdmFyIG51bWJlciA9IGZpbHRlck9wdGlvbnMubnVtYmVyO1xuICAgICAgICBpZiAobnVtYmVyKSB7XG4gICAgICAgICAgICBsID0gbnVtYmVyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID09PSA0KSB7XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IG51bWJlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMykge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9cIiArIG51bWJlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMikge1xuICAgICAgICAgICAgICAgIF9sb2NhdGlvbiArPSBcIl9fXCIgKyBudW1iZXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX19cIiArIG51bWJlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGwgPiA0XG4gICAgICAgICAgICAgICAgX2xvY2F0aW9uICs9IG51bWJlci5zdWJzdHJpbmcoMCwgNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbG9jYXRpb24gKz0gXCJfX19cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2coXCJsb2NhdGlvbiA6IFwiICsgX2xvY2F0aW9uKTtcblxuICAgICAgICByZXR1cm4gX2xvY2F0aW9uO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC8vXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGNsZWFuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAvL1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLy9cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGlzLm9uU2VhcmNoUmVzZXQoKVxuICAgICAqIGFuZCBpdCBjbGVhcnMgYWxsIHJlc3VsdHMgYW5kIHRoZSBtYXJrZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NsZWFyUmVzdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0TWFwKCk7XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEdlb2NvZGluZ0xvY2F0aW9uID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jbGVhclN1Z2dlc3RlZExvY2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX2NsZWFyR2VvY29kZWRMb2NhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuX3NldE1hcmtlcigpO1xuICAgICAgICAvLyBvbiByZXRpcmUgbCdvdmVybGF5IGRlIGxhIHBvcHVwIGRlIGxhIGNhcnRlXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cE92ZXJsYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwLnJlbW92ZU92ZXJsYXkodGhpcy5fcG9wdXBPdmVybGF5KTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwT3ZlcmxheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub25BdXRvQ29tcGxldGVTZWFyY2hUZXh0KClcbiAgICAgKiBhbmQgaXQgY2xlYXJzIGFsbCBzdWdnZXN0ZWQgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NsZWFyU3VnZ2VzdGVkTG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3RlZExvY2F0aW9ucyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWdnZXN0ZWRDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fc3VnZ2VzdGVkQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudCAnY2xpY2snIG9uIG1hcFxuICAgICAqIGFuZCBpdCBoaWRlcyBzdWdnZXN0ZWQgbG9jYXRpb25zXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2hpZGVTdWdnZXN0ZWRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnQgJ2NsaWNrJyBvbiBsYWJlbCBpbnB1dFxuICAgICAqIGFuZCBpdCBkaXNwbGF5cyBzdWdnZXN0ZWQgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2Rpc3BsYXlTdWdnZXN0ZWRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoaXMub25HZW9jb2RpbmdBZHZhbmNlZFNlYXJjaFN1Ym1pdCgpXG4gICAgICogYW5kIGl0IGNsZWFycyBhbGwgZ2VvY29kZWQgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNlYXJjaEVuZ2luZS5wcm90b3R5cGUuX2NsZWFyR2VvY29kZWRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZ2VvY29kZWRMb2NhdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5fZ2VvY29kZWRDb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX2dlb2NvZGVkQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBTZWFyY2hFbmdpbmU7XG59KENvbnRyb2wpKTtcblxuZXhwb3J0IGRlZmF1bHQgU2VhcmNoRW5naW5lO1xuXG4vLyBFeHBvc2UgU2VhcmNoRW5naW5lIGFzIG9sLmNvbnRyb2wuU2VhcmNoRW5naW5lIChmb3IgYSBidWlsZCBidW5kbGUpXG5pZiAod2luZG93Lm9sICYmIHdpbmRvdy5vbC5jb250cm9sKSB7XG4gICAgd2luZG93Lm9sLmNvbnRyb2wuU2VhcmNoRW5naW5lID0gU2VhcmNoRW5naW5lO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/OpenLayers/Controls/SearchEngine.js\n"); /***/ }), @@ -2801,7 +2801,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var geop /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! geoportal-access-lib */ \"./node_modules/geoportal-access-lib/src/Gp.js\");\n/* harmony import */ var ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ol/tilegrid/WMTS */ \"ol/tilegrid/WMTS\");\n/* harmony import */ var ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Sources_WMTS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Sources/WMTS */ \"./src/OpenLayers/Sources/WMTS.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Common/Utils/LayerUtils */ \"./src/Common/Utils/LayerUtils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Common/Utils/Config */ \"./src/Common/Utils/Config.js\");\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../package.json */ \"./package.json\");\nvar _package_json__WEBPACK_IMPORTED_MODULE_7___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../../../package.json */ \"./package.json\", 1);\n\n// import OpenLayers\n\n// import local with ol dependencies\n\n// import local\n\n\n\n\n// package.json (extract version)\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getLogger(\"sourcewmts\");\n\n/**\n * @classdesc\n * Geoportal WMTS source creation (inherit from ol.source.WMTS)\n *\n * @constructor\n * @alias ol.source.GeoportalWMTS\n * @type {ol.source.GeoportalWMTS}\n * @extends {WMTSExtended}\n * @param {Object} options - options for function call.\n * @param {String} options.layer - Layer name (e.g. \"ORTHOIMAGERY.ORTHOPHOTOS\")\n * @param {Boolean} [options.ssl] - if set true, enforce protocol https (only for nodejs)\n * @param {String} [options.apiKey] - Access key to Geoportal platform\n * @param {Array} [options.legends] - Legends objects associated to the layer\n * @param {Array} [options.metadata] - Metadata objects associated to the layer\n * @param {String} [options.title] - title of the layer\n * @param {String} [options.description] - description of the layer\n * @param {String} [options.quicklookUrl] - quicklookUrl of the layer\n * @param {Object} [options.olParams] - other options for ol.source.WMTS function (see {@link http://openlayers.org/en/latest/apidoc/ol.source.WMTS.html ol.source.WMTS})\n * @example\n * var sourceWMTS = new ol.source.GeoportalWMTS({\n * layer : \"ORTHOIMAGERY.ORTHOPHOTOS\"\n * });\n */\nvar SourceWMTS = function (WMTSExtended) {\n function SourceWMTS(options) {\n if (!(this instanceof SourceWMTS)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n\n // check layer params\n if (!options.layer) {\n throw new Error(\"ERROR PARAM_MISSING : layer\");\n }\n if (typeof options.layer !== \"string\") {\n throw new Error(\"ERROR WRONG TYPE : layer\");\n }\n\n // par defaut\n if (typeof options.ssl === \"undefined\") {\n options.ssl = true;\n }\n\n // Check if configuration is loaded\n if (!_Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].isConfigLoaded()) {\n throw new Error(\"ERROR : contract key configuration has to be loaded to load Geoportal layers.\");\n }\n var layerId = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerId(options.layer, \"WMTS\");\n if (layerId && _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerConf(layerId)) {\n var wmtsParams = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerParams(options.layer, \"WMTS\");\n\n // si ssl = false on fait du http\n // par défaut, ssl = true, on fait du https\n var protocol = options.ssl === false ? \"http://\" : \"https://\";\n\n // save originators (to be updated by Originators control)\n this._originators = wmtsParams.originators;\n var urlParams = {\n \"gp-ol-ext\": _package_json__WEBPACK_IMPORTED_MODULE_7__.olExtVersion || _package_json__WEBPACK_IMPORTED_MODULE_7__.version\n };\n if (wmtsParams.url.includes(\"/private/\")) {\n // si l'url est privée\n // Ajout de la clef d'API fournie par l'utilisateur en prioritée\n // ou récupérée depuis la configuration\n urlParams[\"apikey\"] = options.apiKey || _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerKey(layerId)[0];\n }\n var wmtsSourceOptions = {\n // tracker extension openlayers\n // FIXME : gp-ext version en mode AMD\n url: geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Helper.normalyzeUrl(wmtsParams.url.replace(/(http|https):\\/\\//, protocol), urlParams, false),\n version: wmtsParams.version,\n style: wmtsParams.styles,\n format: wmtsParams.format,\n projection: wmtsParams.projection,\n maxZoom: _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getZoomLevelFromScaleDenominator(wmtsParams.minScale),\n layer: options.layer,\n matrixSet: wmtsParams.TMSLink,\n tileGrid: new ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1___default.a({\n resolutions: wmtsParams.nativeResolutions,\n matrixIds: wmtsParams.matrixIds,\n origin: [wmtsParams.tileMatrices[0].topLeftCorner.x, wmtsParams.tileMatrices[0].topLeftCorner.y]\n })\n };\n\n // récupération des autres paramètres passés par l'utilisateur\n _Common_Utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].mergeParams(wmtsSourceOptions, options.olParams);\n\n // returns a WMTS object, that inherits from WMTSExtended.\n WMTSExtended.call(this, wmtsSourceOptions);\n\n // on surcharge les originators (non récupérés depuis configuration de la couche)\n if (options.olParams && !wmtsParams.originators) {\n wmtsParams.originators = options.olParams.attributions;\n }\n // add originators to layer source (to be updated by Originators control)\n this._originators = wmtsParams.originators;\n\n // add legends and metadata (to be added to LayerSwitcher control)\n this._legends = options.legends || wmtsParams.legends;\n this._metadata = options.metadata || wmtsParams.metadata;\n this._description = options.description || wmtsParams.description;\n this._title = options.title || wmtsParams.title;\n this._quicklookUrl = options.quicklookUrl || wmtsParams.quicklookUrl;\n } else {\n // If layer is not in Gp.Config\n logger.log(\"[source WMTS] ERROR : \" + options.layer + \" cannot be found in Geoportal Configuration. Make sure that this resource is included in your contract key.\");\n return new WMTSExtended({});\n }\n }\n\n // Inherits from ol.source.WMTS\n if (WMTSExtended) SourceWMTS.__proto__ = WMTSExtended;\n\n /*\n * @lends module:SourceWMTS\n */\n SourceWMTS.prototype = Object.create(WMTSExtended.prototype, {});\n\n /*\n * Constructor (alias)\n */\n SourceWMTS.prototype.constructor = SourceWMTS;\n return SourceWMTS;\n}(_Sources_WMTS__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (SourceWMTS);\n\n// Expose SourceWMTS as ol.source.GeoportalWMTS. (for a build bundle)\nif (window.ol && window.ol.source) {\n window.ol.source.GeoportalWMTS = SourceWMTS;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0xheWVycy9Tb3VyY2VXTVRTLmpzPzYyNzQiXSwibmFtZXMiOlsibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiU291cmNlV01UUyIsIldNVFNFeHRlbmRlZCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJsYXllciIsIkVycm9yIiwic3NsIiwiQ29uZmlnIiwiaXNDb25maWdMb2FkZWQiLCJsYXllcklkIiwiY29uZmlndXJhdGlvbiIsImdldExheWVySWQiLCJnZXRMYXllckNvbmYiLCJ3bXRzUGFyYW1zIiwiZ2V0TGF5ZXJQYXJhbXMiLCJwcm90b2NvbCIsIl9vcmlnaW5hdG9ycyIsIm9yaWdpbmF0b3JzIiwidXJsUGFyYW1zIiwiUGtnIiwib2xFeHRWZXJzaW9uIiwidmVyc2lvbiIsInVybCIsImluY2x1ZGVzIiwiYXBpS2V5IiwiZ2V0TGF5ZXJLZXkiLCJ3bXRzU291cmNlT3B0aW9ucyIsIkdwIiwiSGVscGVyIiwibm9ybWFseXplVXJsIiwicmVwbGFjZSIsInN0eWxlIiwic3R5bGVzIiwiZm9ybWF0IiwicHJvamVjdGlvbiIsIm1heFpvb20iLCJMYXllclV0aWxzIiwiZ2V0Wm9vbUxldmVsRnJvbVNjYWxlRGVub21pbmF0b3IiLCJtaW5TY2FsZSIsIm1hdHJpeFNldCIsIlRNU0xpbmsiLCJ0aWxlR3JpZCIsIldNVFNUaWxlR3JpZCIsInJlc29sdXRpb25zIiwibmF0aXZlUmVzb2x1dGlvbnMiLCJtYXRyaXhJZHMiLCJvcmlnaW4iLCJ0aWxlTWF0cmljZXMiLCJ0b3BMZWZ0Q29ybmVyIiwieCIsInkiLCJVdGlscyIsIm1lcmdlUGFyYW1zIiwib2xQYXJhbXMiLCJjYWxsIiwiYXR0cmlidXRpb25zIiwiX2xlZ2VuZHMiLCJsZWdlbmRzIiwiX21ldGFkYXRhIiwibWV0YWRhdGEiLCJfZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsIl90aXRsZSIsInRpdGxlIiwiX3F1aWNrbG9va1VybCIsInF1aWNrbG9va1VybCIsImxvZyIsIl9fcHJvdG9fXyIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid2luZG93Iiwib2wiLCJzb3VyY2UiLCJHZW9wb3J0YWxXTVRTIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXNDO0FBQ3RDO0FBQzRDO0FBQzVDO0FBQzJDO0FBQzNDO0FBQ3VDO0FBQ2dCO0FBQ0M7QUFDVDtBQUMvQztBQUN3QztBQUV4QyxJQUFJQSxNQUFNLEdBQUdDLHFFQUFNLENBQUNDLFNBQVMsQ0FBQyxZQUFZLENBQUM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQyxVQUFVLEdBQUksVUFBVUMsWUFBWSxFQUFFO0VBQ3RDLFNBQVNELFVBQVVBLENBQUVFLE9BQU8sRUFBRTtJQUMxQixJQUFJLEVBQUUsSUFBSSxZQUFZRixVQUFVLENBQUMsRUFBRTtNQUMvQixNQUFNLElBQUlHLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQztJQUNsRDs7SUFFQTtJQUNBLElBQUksQ0FBQ0QsT0FBTyxDQUFDRSxLQUFLLEVBQUU7TUFDaEIsTUFBTSxJQUFJQyxLQUFLLENBQUMsNkJBQTZCLENBQUM7SUFDbEQ7SUFDQSxJQUFJLE9BQU9ILE9BQU8sQ0FBQ0UsS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUNuQyxNQUFNLElBQUlDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztJQUMvQzs7SUFFQTtJQUNBLElBQUksT0FBT0gsT0FBTyxDQUFDSSxHQUFHLEtBQUssV0FBVyxFQUFFO01BQ3BDSixPQUFPLENBQUNJLEdBQUcsR0FBRyxJQUFJO0lBQ3RCOztJQUVBO0lBQ0EsSUFBSSxDQUFDQyw0REFBTSxDQUFDQyxjQUFjLENBQUMsQ0FBQyxFQUFFO01BQzFCLE1BQU0sSUFBSUgsS0FBSyxDQUFDLCtFQUErRSxDQUFDO0lBQ3BHO0lBRUEsSUFBSUksT0FBTyxHQUFHRiw0REFBTSxDQUFDRyxhQUFhLENBQUNDLFVBQVUsQ0FBQ1QsT0FBTyxDQUFDRSxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBRXBFLElBQUlLLE9BQU8sSUFBSUYsNERBQU0sQ0FBQ0csYUFBYSxDQUFDRSxZQUFZLENBQUNILE9BQU8sQ0FBQyxFQUFFO01BQ3ZELElBQUlJLFVBQVUsR0FBR04sNERBQU0sQ0FBQ0csYUFBYSxDQUFDSSxjQUFjLENBQUNaLE9BQU8sQ0FBQ0UsS0FBSyxFQUFFLE1BQU0sQ0FBQzs7TUFFM0U7TUFDQTtNQUNBLElBQUlXLFFBQVEsR0FBR2IsT0FBTyxDQUFDSSxHQUFHLEtBQUssS0FBSyxHQUFHLFNBQVMsR0FBRyxVQUFVOztNQUU3RDtNQUNBLElBQUksQ0FBQ1UsWUFBWSxHQUFHSCxVQUFVLENBQUNJLFdBQVc7TUFFMUMsSUFBSUMsU0FBUyxHQUFHO1FBQ1osV0FBVyxFQUFHQywwQ0FBRyxDQUFDQyxZQUFZLElBQUlELDBDQUFHLENBQUNFO01BQzFDLENBQUM7TUFDRCxJQUFJUixVQUFVLENBQUNTLEdBQUcsQ0FBQ0MsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ3RDO1FBQ0E7UUFDQTtRQUNBTCxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUdoQixPQUFPLENBQUNzQixNQUFNLElBQUlqQiw0REFBTSxDQUFDRyxhQUFhLENBQUNlLFdBQVcsQ0FBQ2hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN4RjtNQUNBLElBQUlpQixpQkFBaUIsR0FBRztRQUNwQjtRQUNBO1FBQ0FKLEdBQUcsRUFBR0ssNERBQUUsQ0FBQ0MsTUFBTSxDQUFDQyxZQUFZLENBQUNoQixVQUFVLENBQUNTLEdBQUcsQ0FBQ1EsT0FBTyxDQUFDLG1CQUFtQixFQUFFZixRQUFRLENBQUMsRUFBRUcsU0FBUyxFQUFFLEtBQUssQ0FBQztRQUNyR0csT0FBTyxFQUFHUixVQUFVLENBQUNRLE9BQU87UUFDNUJVLEtBQUssRUFBR2xCLFVBQVUsQ0FBQ21CLE1BQU07UUFDekJDLE1BQU0sRUFBR3BCLFVBQVUsQ0FBQ29CLE1BQU07UUFDMUJDLFVBQVUsRUFBR3JCLFVBQVUsQ0FBQ3FCLFVBQVU7UUFDbENDLE9BQU8sRUFBR0MsZ0VBQVUsQ0FBQ0MsZ0NBQWdDLENBQUN4QixVQUFVLENBQUN5QixRQUFRLENBQUM7UUFDMUVsQyxLQUFLLEVBQUdGLE9BQU8sQ0FBQ0UsS0FBSztRQUNyQm1DLFNBQVMsRUFBRzFCLFVBQVUsQ0FBQzJCLE9BQU87UUFDOUJDLFFBQVEsRUFBRyxJQUFJQyx1REFBWSxDQUFDO1VBQ3hCQyxXQUFXLEVBQUc5QixVQUFVLENBQUMrQixpQkFBaUI7VUFDMUNDLFNBQVMsRUFBR2hDLFVBQVUsQ0FBQ2dDLFNBQVM7VUFDaENDLE1BQU0sRUFBRyxDQUFDakMsVUFBVSxDQUFDa0MsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxhQUFhLENBQUNDLENBQUMsRUFBRXBDLFVBQVUsQ0FBQ2tDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsYUFBYSxDQUFDRSxDQUFDO1FBQ3BHLENBQUM7TUFDTCxDQUFDOztNQUVEO01BQ0FDLHFEQUFLLENBQUNDLFdBQVcsQ0FBQzFCLGlCQUFpQixFQUFFeEIsT0FBTyxDQUFDbUQsUUFBUSxDQUFDOztNQUV0RDtNQUNBcEQsWUFBWSxDQUFDcUQsSUFBSSxDQUFDLElBQUksRUFBRTVCLGlCQUFpQixDQUFDOztNQUUxQztNQUNBLElBQUl4QixPQUFPLENBQUNtRCxRQUFRLElBQUksQ0FBQ3hDLFVBQVUsQ0FBQ0ksV0FBVyxFQUFFO1FBQzdDSixVQUFVLENBQUNJLFdBQVcsR0FBR2YsT0FBTyxDQUFDbUQsUUFBUSxDQUFDRSxZQUFZO01BQzFEO01BQ0E7TUFDQSxJQUFJLENBQUN2QyxZQUFZLEdBQUdILFVBQVUsQ0FBQ0ksV0FBVzs7TUFFMUM7TUFDQSxJQUFJLENBQUN1QyxRQUFRLEdBQUd0RCxPQUFPLENBQUN1RCxPQUFPLElBQUk1QyxVQUFVLENBQUM0QyxPQUFPO01BQ3JELElBQUksQ0FBQ0MsU0FBUyxHQUFHeEQsT0FBTyxDQUFDeUQsUUFBUSxJQUFJOUMsVUFBVSxDQUFDOEMsUUFBUTtNQUN4RCxJQUFJLENBQUNDLFlBQVksR0FBRzFELE9BQU8sQ0FBQzJELFdBQVcsSUFBSWhELFVBQVUsQ0FBQ2dELFdBQVc7TUFDakUsSUFBSSxDQUFDQyxNQUFNLEdBQUc1RCxPQUFPLENBQUM2RCxLQUFLLElBQUlsRCxVQUFVLENBQUNrRCxLQUFLO01BQy9DLElBQUksQ0FBQ0MsYUFBYSxHQUFHOUQsT0FBTyxDQUFDK0QsWUFBWSxJQUFJcEQsVUFBVSxDQUFDb0QsWUFBWTtJQUN4RSxDQUFDLE1BQU07TUFDSDtNQUNBcEUsTUFBTSxDQUFDcUUsR0FBRyxDQUFDLHdCQUF3QixHQUFHaEUsT0FBTyxDQUFDRSxLQUFLLEdBQUcsNkdBQTZHLENBQUM7TUFDcEssT0FBTyxJQUFJSCxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0I7RUFDSjs7RUFFQTtFQUNBLElBQUlBLFlBQVksRUFBRUQsVUFBVSxDQUFDbUUsU0FBUyxHQUFHbEUsWUFBWTs7RUFFckQ7QUFDSjtBQUNBO0VBQ0lELFVBQVUsQ0FBQ29FLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUNyRSxZQUFZLENBQUNtRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0VBRWhFO0FBQ0o7QUFDQTtFQUNJcEUsVUFBVSxDQUFDb0UsU0FBUyxDQUFDRyxXQUFXLEdBQUd2RSxVQUFVO0VBRTdDLE9BQU9BLFVBQVU7QUFDckIsQ0FBQyxDQUFDQyxxREFBWSxDQUFFO0FBRURELHlFQUFVLEVBQUM7O0FBRTFCO0FBQ0EsSUFBSXdFLE1BQU0sQ0FBQ0MsRUFBRSxJQUFJRCxNQUFNLENBQUNDLEVBQUUsQ0FBQ0MsTUFBTSxFQUFFO0VBQy9CRixNQUFNLENBQUNDLEVBQUUsQ0FBQ0MsTUFBTSxDQUFDQyxhQUFhLEdBQUczRSxVQUFVO0FBQy9DIiwiZmlsZSI6Ii4vc3JjL09wZW5MYXllcnMvTGF5ZXJzL1NvdXJjZVdNVFMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR3AgZnJvbSBcImdlb3BvcnRhbC1hY2Nlc3MtbGliXCI7XG4vLyBpbXBvcnQgT3BlbkxheWVyc1xuaW1wb3J0IFdNVFNUaWxlR3JpZCBmcm9tIFwib2wvdGlsZWdyaWQvV01UU1wiO1xuLy8gaW1wb3J0IGxvY2FsIHdpdGggb2wgZGVwZW5kZW5jaWVzXG5pbXBvcnQgV01UU0V4dGVuZGVkIGZyb20gXCIuLi9Tb3VyY2VzL1dNVFNcIjtcbi8vIGltcG9ydCBsb2NhbFxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHNcIjtcbmltcG9ydCBMYXllclV0aWxzIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvTGF5ZXJVdGlsc1wiO1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi4vLi4vQ29tbW9uL1V0aWxzL0NvbmZpZ1wiO1xuLy8gcGFja2FnZS5qc29uIChleHRyYWN0IHZlcnNpb24pXG5pbXBvcnQgUGtnIGZyb20gXCIuLi8uLi8uLi9wYWNrYWdlLmpzb25cIjtcblxudmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJzb3VyY2V3bXRzXCIpO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEdlb3BvcnRhbCBXTVRTIHNvdXJjZSBjcmVhdGlvbiAoaW5oZXJpdCBmcm9tIG9sLnNvdXJjZS5XTVRTKVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIG9sLnNvdXJjZS5HZW9wb3J0YWxXTVRTXG4gKiBAdHlwZSB7b2wuc291cmNlLkdlb3BvcnRhbFdNVFN9XG4gKiBAZXh0ZW5kcyB7V01UU0V4dGVuZGVkfVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAgICAgICAgICAtIG9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5sYXllciAgICAgIC0gTGF5ZXIgbmFtZSAoZS5nLiBcIk9SVEhPSU1BR0VSWS5PUlRIT1BIT1RPU1wiKVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zc2xdICAgICAtIGlmIHNldCB0cnVlLCBlbmZvcmNlIHByb3RvY29sIGh0dHBzIChvbmx5IGZvciBub2RlanMpXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYXBpS2V5XSAgIC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm1cbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLmxlZ2VuZHNdICAgLSBMZWdlbmRzIG9iamVjdHMgYXNzb2NpYXRlZCB0byB0aGUgbGF5ZXJcbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLm1ldGFkYXRhXSAgIC0gTWV0YWRhdGEgb2JqZWN0cyBhc3NvY2lhdGVkIHRvIHRoZSBsYXllclxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXSAgIC0gdGl0bGUgb2YgdGhlIGxheWVyXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZGVzY3JpcHRpb25dICAgLSBkZXNjcmlwdGlvbiBvZiB0aGUgbGF5ZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5xdWlja2xvb2tVcmxdICAgLSBxdWlja2xvb2tVcmwgb2YgdGhlIGxheWVyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMub2xQYXJhbXNdIC0gb3RoZXIgb3B0aW9ucyBmb3Igb2wuc291cmNlLldNVFMgZnVuY3Rpb24gKHNlZSB7QGxpbmsgaHR0cDovL29wZW5sYXllcnMub3JnL2VuL2xhdGVzdC9hcGlkb2Mvb2wuc291cmNlLldNVFMuaHRtbCBvbC5zb3VyY2UuV01UU30pXG4gKiBAZXhhbXBsZVxuICogdmFyIHNvdXJjZVdNVFMgPSBuZXcgb2wuc291cmNlLkdlb3BvcnRhbFdNVFMoe1xuICogICAgICBsYXllciAgOiBcIk9SVEhPSU1BR0VSWS5PUlRIT1BIT1RPU1wiXG4gKiB9KTtcbiAqL1xudmFyIFNvdXJjZVdNVFMgPSAoZnVuY3Rpb24gKFdNVFNFeHRlbmRlZCkge1xuICAgIGZ1bmN0aW9uIFNvdXJjZVdNVFMgKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNvdXJjZVdNVFMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVJST1IgQ0xBU1NfQ09OU1RSVUNUT1JcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBsYXllciBwYXJhbXNcbiAgICAgICAgaWYgKCFvcHRpb25zLmxheWVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFUlJPUiBQQVJBTV9NSVNTSU5HIDogbGF5ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmxheWVyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFUlJPUiBXUk9ORyBUWVBFIDogbGF5ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXIgZGVmYXV0XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zc2wgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuc3NsID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkXG4gICAgICAgIGlmICghQ29uZmlnLmlzQ29uZmlnTG9hZGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVSUk9SIDogY29udHJhY3Qga2V5IGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGxvYWRlZCB0byBsb2FkIEdlb3BvcnRhbCBsYXllcnMuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxheWVySWQgPSBDb25maWcuY29uZmlndXJhdGlvbi5nZXRMYXllcklkKG9wdGlvbnMubGF5ZXIsIFwiV01UU1wiKTtcblxuICAgICAgICBpZiAobGF5ZXJJZCAmJiBDb25maWcuY29uZmlndXJhdGlvbi5nZXRMYXllckNvbmYobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIHZhciB3bXRzUGFyYW1zID0gQ29uZmlnLmNvbmZpZ3VyYXRpb24uZ2V0TGF5ZXJQYXJhbXMob3B0aW9ucy5sYXllciwgXCJXTVRTXCIpO1xuXG4gICAgICAgICAgICAvLyBzaSBzc2wgPSBmYWxzZSBvbiBmYWl0IGR1IGh0dHBcbiAgICAgICAgICAgIC8vIHBhciBkw6lmYXV0LCBzc2wgPSB0cnVlLCBvbiBmYWl0IGR1IGh0dHBzXG4gICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSBvcHRpb25zLnNzbCA9PT0gZmFsc2UgPyBcImh0dHA6Ly9cIiA6IFwiaHR0cHM6Ly9cIjtcblxuICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hdG9ycyAodG8gYmUgdXBkYXRlZCBieSBPcmlnaW5hdG9ycyBjb250cm9sKVxuICAgICAgICAgICAgdGhpcy5fb3JpZ2luYXRvcnMgPSB3bXRzUGFyYW1zLm9yaWdpbmF0b3JzO1xuXG4gICAgICAgICAgICB2YXIgdXJsUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIFwiZ3Atb2wtZXh0XCIgOiBQa2cub2xFeHRWZXJzaW9uIHx8IFBrZy52ZXJzaW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHdtdHNQYXJhbXMudXJsLmluY2x1ZGVzKFwiL3ByaXZhdGUvXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2kgbCd1cmwgZXN0IHByaXbDqWVcbiAgICAgICAgICAgICAgICAvLyBBam91dCBkZSBsYSBjbGVmIGQnQVBJIGZvdXJuaWUgcGFyIGwndXRpbGlzYXRldXIgZW4gcHJpb3JpdMOpZVxuICAgICAgICAgICAgICAgIC8vIG91IHLDqWN1cMOpcsOpZSBkZXB1aXMgbGEgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgIHVybFBhcmFtc1tcImFwaWtleVwiXSA9IG9wdGlvbnMuYXBpS2V5IHx8IENvbmZpZy5jb25maWd1cmF0aW9uLmdldExheWVyS2V5KGxheWVySWQpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdtdHNTb3VyY2VPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHRyYWNrZXIgZXh0ZW5zaW9uIG9wZW5sYXllcnNcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSA6IGdwLWV4dCB2ZXJzaW9uIGVuIG1vZGUgQU1EXG4gICAgICAgICAgICAgICAgdXJsIDogR3AuSGVscGVyLm5vcm1hbHl6ZVVybCh3bXRzUGFyYW1zLnVybC5yZXBsYWNlKC8oaHR0cHxodHRwcyk6XFwvXFwvLywgcHJvdG9jb2wpLCB1cmxQYXJhbXMsIGZhbHNlKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uIDogd210c1BhcmFtcy52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHN0eWxlIDogd210c1BhcmFtcy5zdHlsZXMsXG4gICAgICAgICAgICAgICAgZm9ybWF0IDogd210c1BhcmFtcy5mb3JtYXQsXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbiA6IHdtdHNQYXJhbXMucHJvamVjdGlvbixcbiAgICAgICAgICAgICAgICBtYXhab29tIDogTGF5ZXJVdGlscy5nZXRab29tTGV2ZWxGcm9tU2NhbGVEZW5vbWluYXRvcih3bXRzUGFyYW1zLm1pblNjYWxlKSxcbiAgICAgICAgICAgICAgICBsYXllciA6IG9wdGlvbnMubGF5ZXIsXG4gICAgICAgICAgICAgICAgbWF0cml4U2V0IDogd210c1BhcmFtcy5UTVNMaW5rLFxuICAgICAgICAgICAgICAgIHRpbGVHcmlkIDogbmV3IFdNVFNUaWxlR3JpZCh7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb25zIDogd210c1BhcmFtcy5uYXRpdmVSZXNvbHV0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4SWRzIDogd210c1BhcmFtcy5tYXRyaXhJZHMsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbiA6IFt3bXRzUGFyYW1zLnRpbGVNYXRyaWNlc1swXS50b3BMZWZ0Q29ybmVyLngsIHdtdHNQYXJhbXMudGlsZU1hdHJpY2VzWzBdLnRvcExlZnRDb3JuZXIueV1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gcsOpY3Vww6lyYXRpb24gZGVzIGF1dHJlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3V0aWxpc2F0ZXVyXG4gICAgICAgICAgICBVdGlscy5tZXJnZVBhcmFtcyh3bXRzU291cmNlT3B0aW9ucywgb3B0aW9ucy5vbFBhcmFtcyk7XG5cbiAgICAgICAgICAgIC8vIHJldHVybnMgYSBXTVRTIG9iamVjdCwgdGhhdCBpbmhlcml0cyBmcm9tIFdNVFNFeHRlbmRlZC5cbiAgICAgICAgICAgIFdNVFNFeHRlbmRlZC5jYWxsKHRoaXMsIHdtdHNTb3VyY2VPcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gb24gc3VyY2hhcmdlIGxlcyBvcmlnaW5hdG9ycyAobm9uIHLDqWN1cMOpcsOpcyBkZXB1aXMgY29uZmlndXJhdGlvbiBkZSBsYSBjb3VjaGUpXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vbFBhcmFtcyAmJiAhd210c1BhcmFtcy5vcmlnaW5hdG9ycykge1xuICAgICAgICAgICAgICAgIHdtdHNQYXJhbXMub3JpZ2luYXRvcnMgPSBvcHRpb25zLm9sUGFyYW1zLmF0dHJpYnV0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBvcmlnaW5hdG9ycyB0byBsYXllciBzb3VyY2UgKHRvIGJlIHVwZGF0ZWQgYnkgT3JpZ2luYXRvcnMgY29udHJvbClcbiAgICAgICAgICAgIHRoaXMuX29yaWdpbmF0b3JzID0gd210c1BhcmFtcy5vcmlnaW5hdG9ycztcblxuICAgICAgICAgICAgLy8gYWRkIGxlZ2VuZHMgYW5kIG1ldGFkYXRhICh0byBiZSBhZGRlZCB0byBMYXllclN3aXRjaGVyIGNvbnRyb2wpXG4gICAgICAgICAgICB0aGlzLl9sZWdlbmRzID0gb3B0aW9ucy5sZWdlbmRzIHx8IHdtdHNQYXJhbXMubGVnZW5kcztcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YSB8fCB3bXRzUGFyYW1zLm1ldGFkYXRhO1xuICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uIHx8IHdtdHNQYXJhbXMuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB0aGlzLl90aXRsZSA9IG9wdGlvbnMudGl0bGUgfHwgd210c1BhcmFtcy50aXRsZTtcbiAgICAgICAgICAgIHRoaXMuX3F1aWNrbG9va1VybCA9IG9wdGlvbnMucXVpY2tsb29rVXJsIHx8IHdtdHNQYXJhbXMucXVpY2tsb29rVXJsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgbGF5ZXIgaXMgbm90IGluIEdwLkNvbmZpZ1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIltzb3VyY2UgV01UU10gRVJST1IgOiBcIiArIG9wdGlvbnMubGF5ZXIgKyBcIiBjYW5ub3QgYmUgZm91bmQgaW4gR2VvcG9ydGFsIENvbmZpZ3VyYXRpb24uIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcmVzb3VyY2UgaXMgaW5jbHVkZWQgaW4geW91ciBjb250cmFjdCBrZXkuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBXTVRTRXh0ZW5kZWQoe30pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5oZXJpdHMgZnJvbSBvbC5zb3VyY2UuV01UU1xuICAgIGlmIChXTVRTRXh0ZW5kZWQpIFNvdXJjZVdNVFMuX19wcm90b19fID0gV01UU0V4dGVuZGVkO1xuXG4gICAgLypcbiAgICAgKiBAbGVuZHMgbW9kdWxlOlNvdXJjZVdNVFNcbiAgICAgKi9cbiAgICBTb3VyY2VXTVRTLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoV01UU0V4dGVuZGVkLnByb3RvdHlwZSwge30pO1xuXG4gICAgLypcbiAgICAgKiBDb25zdHJ1Y3RvciAoYWxpYXMpXG4gICAgICovXG4gICAgU291cmNlV01UUy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VXTVRTO1xuXG4gICAgcmV0dXJuIFNvdXJjZVdNVFM7XG59KFdNVFNFeHRlbmRlZCkpO1xuXG5leHBvcnQgZGVmYXVsdCBTb3VyY2VXTVRTO1xuXG4vLyBFeHBvc2UgU291cmNlV01UUyBhcyBvbC5zb3VyY2UuR2VvcG9ydGFsV01UUy4gKGZvciBhIGJ1aWxkIGJ1bmRsZSlcbmlmICh3aW5kb3cub2wgJiYgd2luZG93Lm9sLnNvdXJjZSkge1xuICAgIHdpbmRvdy5vbC5zb3VyY2UuR2VvcG9ydGFsV01UUyA9IFNvdXJjZVdNVFM7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/OpenLayers/Layers/SourceWMTS.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! geoportal-access-lib */ \"./node_modules/geoportal-access-lib/src/Gp.js\");\n/* harmony import */ var ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ol/tilegrid/WMTS */ \"ol/tilegrid/WMTS\");\n/* harmony import */ var ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Sources_WMTS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Sources/WMTS */ \"./src/OpenLayers/Sources/WMTS.js\");\n/* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Common/Utils */ \"./src/Common/Utils.js\");\n/* harmony import */ var _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Common/Utils/LayerUtils */ \"./src/Common/Utils/LayerUtils.js\");\n/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Common/Utils/LoggerByDefault */ \"./src/Common/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Common/Utils/Config */ \"./src/Common/Utils/Config.js\");\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../package.json */ \"./package.json\");\nvar _package_json__WEBPACK_IMPORTED_MODULE_7___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../../../package.json */ \"./package.json\", 1);\n\n// import OpenLayers\n\n// import local with ol dependencies\n\n// import local\n\n\n\n\n// package.json (extract version)\n\nvar logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getLogger(\"sourcewmts\");\n\n/**\n * @classdesc\n * Geoportal WMTS source creation (inherit from ol.source.WMTS)\n *\n * @constructor\n * @alias ol.source.GeoportalWMTS\n * @type {ol.source.GeoportalWMTS}\n * @extends {WMTSExtended}\n * @param {Object} options - options for function call.\n * @param {String} options.layer - Layer name (e.g. \"ORTHOIMAGERY.ORTHOPHOTOS\")\n * @param {Boolean} [options.ssl] - if set true, enforce protocol https (only for nodejs)\n * @param {String} [options.apiKey] - Access key to Geoportal platform\n * @param {Array} [options.legends] - Legends objects associated to the layer\n * @param {Array} [options.metadata] - Metadata objects associated to the layer\n * @param {String} [options.title] - title of the layer\n * @param {String} [options.description] - description of the layer\n * @param {String} [options.quicklookUrl] - quicklookUrl of the layer\n * @param {Object} [options.olParams] - other options for ol.source.WMTS function (see {@link http://openlayers.org/en/latest/apidoc/ol.source.WMTS.html ol.source.WMTS})\n * @example\n * var sourceWMTS = new ol.source.GeoportalWMTS({\n * layer : \"ORTHOIMAGERY.ORTHOPHOTOS\"\n * });\n */\nvar SourceWMTS = function (WMTSExtended) {\n function SourceWMTS(options) {\n if (!(this instanceof SourceWMTS)) {\n throw new TypeError(\"ERROR CLASS_CONSTRUCTOR\");\n }\n\n // check layer params\n if (!options.layer) {\n throw new Error(\"ERROR PARAM_MISSING : layer\");\n }\n if (typeof options.layer !== \"string\") {\n throw new Error(\"ERROR WRONG TYPE : layer\");\n }\n\n // par defaut\n if (typeof options.ssl === \"undefined\") {\n options.ssl = true;\n }\n\n // Check if configuration is loaded\n if (!_Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].isConfigLoaded()) {\n throw new Error(\"ERROR : contract key configuration has to be loaded to load Geoportal layers.\");\n }\n var layerId = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerId(options.layer, \"WMTS\");\n if (layerId && _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerConf(layerId)) {\n var wmtsParams = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerParams(options.layer, \"WMTS\");\n\n // si ssl = false on fait du http\n // par défaut, ssl = true, on fait du https\n var protocol = options.ssl === false ? \"http://\" : \"https://\";\n\n // save originators (to be updated by Originators control)\n this._originators = wmtsParams.originators;\n var urlParams = {\n \"gp-ol-ext\": _package_json__WEBPACK_IMPORTED_MODULE_7__.olExtVersion || _package_json__WEBPACK_IMPORTED_MODULE_7__.version\n };\n if (wmtsParams.url.includes(\"/private/\")) {\n // si l'url est privée\n // Ajout de la clef d'API fournie par l'utilisateur en prioritée\n // ou récupérée depuis la configuration\n urlParams[\"apikey\"] = options.apiKey || _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_6__[\"default\"].configuration.getLayerKey(layerId)[0];\n }\n var wmtsSourceOptions = {\n // tracker extension openlayers\n // FIXME : gp-ext version en mode AMD\n url: geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Helper.normalyzeUrl(wmtsParams.url.replace(/(http|https):\\/\\//, protocol), urlParams, false),\n version: wmtsParams.version,\n style: wmtsParams.styles,\n format: wmtsParams.format,\n projection: wmtsParams.projection,\n maxZoom: _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getZoomLevelFromScaleDenominator(wmtsParams.minScale),\n layer: options.layer,\n matrixSet: wmtsParams.TMSLink,\n tileGrid: new ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1___default.a({\n resolutions: wmtsParams.nativeResolutions,\n matrixIds: wmtsParams.matrixIds,\n origin: [Object.values(wmtsParams.tileMatrices)[0].topLeftCorner.x, Object.values(wmtsParams.tileMatrices)[0].topLeftCorner.y]\n })\n };\n\n // récupération des autres paramètres passés par l'utilisateur\n _Common_Utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].mergeParams(wmtsSourceOptions, options.olParams);\n\n // returns a WMTS object, that inherits from WMTSExtended.\n WMTSExtended.call(this, wmtsSourceOptions);\n\n // on surcharge les originators (non récupérés depuis configuration de la couche)\n if (options.olParams && !wmtsParams.originators) {\n wmtsParams.originators = options.olParams.attributions;\n }\n // add originators to layer source (to be updated by Originators control)\n this._originators = wmtsParams.originators;\n\n // add legends and metadata (to be added to LayerSwitcher control)\n this._legends = options.legends || wmtsParams.legends;\n this._metadata = options.metadata || wmtsParams.metadata;\n this._description = options.description || wmtsParams.description;\n this._title = options.title || wmtsParams.title;\n this._quicklookUrl = options.quicklookUrl || wmtsParams.quicklookUrl;\n } else {\n // If layer is not in Gp.Config\n logger.log(\"[source WMTS] ERROR : \" + options.layer + \" cannot be found in Geoportal Configuration. Make sure that this resource is included in your contract key.\");\n return new WMTSExtended({});\n }\n }\n\n // Inherits from ol.source.WMTS\n if (WMTSExtended) SourceWMTS.__proto__ = WMTSExtended;\n\n /*\n * @lends module:SourceWMTS\n */\n SourceWMTS.prototype = Object.create(WMTSExtended.prototype, {});\n\n /*\n * Constructor (alias)\n */\n SourceWMTS.prototype.constructor = SourceWMTS;\n return SourceWMTS;\n}(_Sources_WMTS__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (SourceWMTS);\n\n// Expose SourceWMTS as ol.source.GeoportalWMTS. (for a build bundle)\nif (window.ol && window.ol.source) {\n window.ol.source.GeoportalWMTS = SourceWMTS;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9PcGVuTGF5ZXJzL0xheWVycy9Tb3VyY2VXTVRTLmpzPzYyNzQiXSwibmFtZXMiOlsibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiU291cmNlV01UUyIsIldNVFNFeHRlbmRlZCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJsYXllciIsIkVycm9yIiwic3NsIiwiQ29uZmlnIiwiaXNDb25maWdMb2FkZWQiLCJsYXllcklkIiwiY29uZmlndXJhdGlvbiIsImdldExheWVySWQiLCJnZXRMYXllckNvbmYiLCJ3bXRzUGFyYW1zIiwiZ2V0TGF5ZXJQYXJhbXMiLCJwcm90b2NvbCIsIl9vcmlnaW5hdG9ycyIsIm9yaWdpbmF0b3JzIiwidXJsUGFyYW1zIiwiUGtnIiwib2xFeHRWZXJzaW9uIiwidmVyc2lvbiIsInVybCIsImluY2x1ZGVzIiwiYXBpS2V5IiwiZ2V0TGF5ZXJLZXkiLCJ3bXRzU291cmNlT3B0aW9ucyIsIkdwIiwiSGVscGVyIiwibm9ybWFseXplVXJsIiwicmVwbGFjZSIsInN0eWxlIiwic3R5bGVzIiwiZm9ybWF0IiwicHJvamVjdGlvbiIsIm1heFpvb20iLCJMYXllclV0aWxzIiwiZ2V0Wm9vbUxldmVsRnJvbVNjYWxlRGVub21pbmF0b3IiLCJtaW5TY2FsZSIsIm1hdHJpeFNldCIsIlRNU0xpbmsiLCJ0aWxlR3JpZCIsIldNVFNUaWxlR3JpZCIsInJlc29sdXRpb25zIiwibmF0aXZlUmVzb2x1dGlvbnMiLCJtYXRyaXhJZHMiLCJvcmlnaW4iLCJPYmplY3QiLCJ2YWx1ZXMiLCJ0aWxlTWF0cmljZXMiLCJ0b3BMZWZ0Q29ybmVyIiwieCIsInkiLCJVdGlscyIsIm1lcmdlUGFyYW1zIiwib2xQYXJhbXMiLCJjYWxsIiwiYXR0cmlidXRpb25zIiwiX2xlZ2VuZHMiLCJsZWdlbmRzIiwiX21ldGFkYXRhIiwibWV0YWRhdGEiLCJfZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsIl90aXRsZSIsInRpdGxlIiwiX3F1aWNrbG9va1VybCIsInF1aWNrbG9va1VybCIsImxvZyIsIl9fcHJvdG9fXyIsInByb3RvdHlwZSIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid2luZG93Iiwib2wiLCJzb3VyY2UiLCJHZW9wb3J0YWxXTVRTIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXNDO0FBQ3RDO0FBQzRDO0FBQzVDO0FBQzJDO0FBQzNDO0FBQ3VDO0FBQ2dCO0FBQ0M7QUFDVDtBQUMvQztBQUN3QztBQUV4QyxJQUFJQSxNQUFNLEdBQUdDLHFFQUFNLENBQUNDLFNBQVMsQ0FBQyxZQUFZLENBQUM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQyxVQUFVLEdBQUksVUFBVUMsWUFBWSxFQUFFO0VBQ3RDLFNBQVNELFVBQVVBLENBQUVFLE9BQU8sRUFBRTtJQUMxQixJQUFJLEVBQUUsSUFBSSxZQUFZRixVQUFVLENBQUMsRUFBRTtNQUMvQixNQUFNLElBQUlHLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQztJQUNsRDs7SUFFQTtJQUNBLElBQUksQ0FBQ0QsT0FBTyxDQUFDRSxLQUFLLEVBQUU7TUFDaEIsTUFBTSxJQUFJQyxLQUFLLENBQUMsNkJBQTZCLENBQUM7SUFDbEQ7SUFDQSxJQUFJLE9BQU9ILE9BQU8sQ0FBQ0UsS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUNuQyxNQUFNLElBQUlDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztJQUMvQzs7SUFFQTtJQUNBLElBQUksT0FBT0gsT0FBTyxDQUFDSSxHQUFHLEtBQUssV0FBVyxFQUFFO01BQ3BDSixPQUFPLENBQUNJLEdBQUcsR0FBRyxJQUFJO0lBQ3RCOztJQUVBO0lBQ0EsSUFBSSxDQUFDQyw0REFBTSxDQUFDQyxjQUFj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QyxNQUFNLENBQUNDLGFBQWEsR0FBRzVFLFVBQVU7QUFDL0MiLCJmaWxlIjoiLi9zcmMvT3BlbkxheWVycy9MYXllcnMvU291cmNlV01UUy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHcCBmcm9tIFwiZ2VvcG9ydGFsLWFjY2Vzcy1saWJcIjtcbi8vIGltcG9ydCBPcGVuTGF5ZXJzXG5pbXBvcnQgV01UU1RpbGVHcmlkIGZyb20gXCJvbC90aWxlZ3JpZC9XTVRTXCI7XG4vLyBpbXBvcnQgbG9jYWwgd2l0aCBvbCBkZXBlbmRlbmNpZXNcbmltcG9ydCBXTVRTRXh0ZW5kZWQgZnJvbSBcIi4uL1NvdXJjZXMvV01UU1wiO1xuLy8gaW1wb3J0IGxvY2FsXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlsc1wiO1xuaW1wb3J0IExheWVyVXRpbHMgZnJvbSBcIi4uLy4uL0NvbW1vbi9VdGlscy9MYXllclV0aWxzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuLi8uLi9Db21tb24vVXRpbHMvQ29uZmlnXCI7XG4vLyBwYWNrYWdlLmpzb24gKGV4dHJhY3QgdmVyc2lvbilcbmltcG9ydCBQa2cgZnJvbSBcIi4uLy4uLy4uL3BhY2thZ2UuanNvblwiO1xuXG52YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcInNvdXJjZXdtdHNcIik7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogR2VvcG9ydGFsIFdNVFMgc291cmNlIGNyZWF0aW9uIChpbmhlcml0IGZyb20gb2wuc291cmNlLldNVFMpXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgb2wuc291cmNlLkdlb3BvcnRhbFdNVFNcbiAqIEB0eXBlIHtvbC5zb3VyY2UuR2VvcG9ydGFsV01UU31cbiAqIEBleHRlbmRzIHtXTVRTRXh0ZW5kZWR9XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAgICAgICAgICAgIC0gb3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmxheWVyICAgICAgLSBMYXllciBuYW1lIChlLmcuIFwiT1JUSE9JTUFHRVJZLk9SVEhPUEhPVE9TXCIpXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbF0gICAgIC0gaWYgc2V0IHRydWUsIGVuZm9yY2UgcHJvdG9jb2wgaHR0cHMgKG9ubHkgZm9yIG5vZGVqcylcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hcGlLZXldICAgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybVxuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMubGVnZW5kc10gICAtIExlZ2VuZHMgb2JqZWN0cyBhc3NvY2lhdGVkIHRvIHRoZSBsYXllclxuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMubWV0YWRhdGFdICAgLSBNZXRhZGF0YSBvYmplY3RzIGFzc29jaWF0ZWQgdG8gdGhlIGxheWVyXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGl0bGVdICAgLSB0aXRsZSBvZiB0aGUgbGF5ZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kZXNjcmlwdGlvbl0gICAtIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXllclxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnF1aWNrbG9va1VybF0gICAtIHF1aWNrbG9va1VybCBvZiB0aGUgbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5vbFBhcmFtc10gLSBvdGhlciBvcHRpb25zIGZvciBvbC5zb3VyY2UuV01UUyBmdW5jdGlvbiAoc2VlIHtAbGluayBodHRwOi8vb3BlbmxheWVycy5vcmcvZW4vbGF0ZXN0L2FwaWRvYy9vbC5zb3VyY2UuV01UUy5odG1sIG9sLnNvdXJjZS5XTVRTfSlcbiAqIEBleGFtcGxlXG4gKiB2YXIgc291cmNlV01UUyA9IG5ldyBvbC5zb3VyY2UuR2VvcG9ydGFsV01UUyh7XG4gKiAgICAgIGxheWVyICA6IFwiT1JUSE9JTUFHRVJZLk9SVEhPUEhPVE9TXCJcbiAqIH0pO1xuICovXG52YXIgU291cmNlV01UUyA9IChmdW5jdGlvbiAoV01UU0V4dGVuZGVkKSB7XG4gICAgZnVuY3Rpb24gU291cmNlV01UUyAob3B0aW9ucykge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU291cmNlV01UUykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUlJPUiBDTEFTU19DT05TVFJVQ1RPUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGxheWVyIHBhcmFtc1xuICAgICAgICBpZiAoIW9wdGlvbnMubGF5ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVSUk9SIFBBUkFNX01JU1NJTkcgOiBsYXllclwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubGF5ZXIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVSUk9SIFdST05HIFRZUEUgOiBsYXllclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhciBkZWZhdXRcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNzbCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5zc2wgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY29uZmlndXJhdGlvbiBpcyBsb2FkZWRcbiAgICAgICAgaWYgKCFDb25maWcuaXNDb25maWdMb2FkZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRVJST1IgOiBjb250cmFjdCBrZXkgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgbG9hZGVkIHRvIGxvYWQgR2VvcG9ydGFsIGxheWVycy5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGF5ZXJJZCA9IENvbmZpZy5jb25maWd1cmF0aW9uLmdldExheWVySWQob3B0aW9ucy5sYXllciwgXCJXTVRTXCIpO1xuXG4gICAgICAgIGlmIChsYXllcklkICYmIENvbmZpZy5jb25maWd1cmF0aW9uLmdldExheWVyQ29uZihsYXllcklkKSkge1xuICAgICAgICAgICAgdmFyIHdtdHNQYXJhbXMgPSBDb25maWcuY29uZmlndXJhdGlvbi5nZXRMYXllclBhcmFtcyhvcHRpb25zLmxheWVyLCBcIldNVFNcIik7XG5cbiAgICAgICAgICAgIC8vIHNpIHNzbCA9IGZhbHNlIG9uIGZhaXQgZHUgaHR0cFxuICAgICAgICAgICAgLy8gcGFyIGTDqWZhdXQsIHNzbCA9IHRydWUsIG9uIGZhaXQgZHUgaHR0cHNcbiAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IG9wdGlvbnMuc3NsID09PSBmYWxzZSA/IFwiaHR0cDovL1wiIDogXCJodHRwczovL1wiO1xuXG4gICAgICAgICAgICAvLyBzYXZlIG9yaWdpbmF0b3JzICh0byBiZSB1cGRhdGVkIGJ5IE9yaWdpbmF0b3JzIGNvbnRyb2wpXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hdG9ycyA9IHdtdHNQYXJhbXMub3JpZ2luYXRvcnM7XG5cbiAgICAgICAgICAgIHZhciB1cmxQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgXCJncC1vbC1leHRcIiA6IFBrZy5vbEV4dFZlcnNpb24gfHwgUGtnLnZlcnNpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAod210c1BhcmFtcy51cmwuaW5jbHVkZXMoXCIvcHJpdmF0ZS9cIikpIHtcbiAgICAgICAgICAgICAgICAvLyBzaSBsJ3VybCBlc3QgcHJpdsOpZVxuICAgICAgICAgICAgICAgIC8vIEFqb3V0IGRlIGxhIGNsZWYgZCdBUEkgZm91cm5pZSBwYXIgbCd1dGlsaXNhdGV1ciBlbiBwcmlvcml0w6llXG4gICAgICAgICAgICAgICAgLy8gb3UgcsOpY3Vww6lyw6llIGRlcHVpcyBsYSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zW1wiYXBpa2V5XCJdID0gb3B0aW9ucy5hcGlLZXkgfHwgQ29uZmlnLmNvbmZpZ3VyYXRpb24uZ2V0TGF5ZXJLZXkobGF5ZXJJZClbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgd210c1NvdXJjZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8gdHJhY2tlciBleHRlbnNpb24gb3BlbmxheWVyc1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIDogZ3AtZXh0IHZlcnNpb24gZW4gbW9kZSBBTURcbiAgICAgICAgICAgICAgICB1cmwgOiBHcC5IZWxwZXIubm9ybWFseXplVXJsKHdtdHNQYXJhbXMudXJsLnJlcGxhY2UoLyhodHRwfGh0dHBzKTpcXC9cXC8vLCBwcm90b2NvbCksIHVybFBhcmFtcywgZmFsc2UpLFxuICAgICAgICAgICAgICAgIHZlcnNpb24gOiB3bXRzUGFyYW1zLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgc3R5bGUgOiB3bXRzUGFyYW1zLnN0eWxlcyxcbiAgICAgICAgICAgICAgICBmb3JtYXQgOiB3bXRzUGFyYW1zLmZvcm1hdCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uIDogd210c1BhcmFtcy5wcm9qZWN0aW9uLFxuICAgICAgICAgICAgICAgIG1heFpvb20gOiBMYXllclV0aWxzLmdldFpvb21MZXZlbEZyb21TY2FsZURlbm9taW5hdG9yKHdtdHNQYXJhbXMubWluU2NhbGUpLFxuICAgICAgICAgICAgICAgIGxheWVyIDogb3B0aW9ucy5sYXllcixcbiAgICAgICAgICAgICAgICBtYXRyaXhTZXQgOiB3bXRzUGFyYW1zLlRNU0xpbmssXG4gICAgICAgICAgICAgICAgdGlsZUdyaWQgOiBuZXcgV01UU1RpbGVHcmlkKHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMgOiB3bXRzUGFyYW1zLm5hdGl2ZVJlc29sdXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXhJZHMgOiB3bXRzUGFyYW1zLm1hdHJpeElkcyxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luIDogW09iamVjdC52YWx1ZXMod210c1BhcmFtcy50aWxlTWF0cmljZXMpWzBdLnRvcExlZnRDb3JuZXIueCwgT2JqZWN0LnZhbHVlcyh3bXRzUGFyYW1zLnRpbGVNYXRyaWNlcylbMF0udG9wTGVmdENvcm5lci55XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyByw6ljdXDDqXJhdGlvbiBkZXMgYXV0cmVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXRpbGlzYXRldXJcbiAgICAgICAgICAgIFV0aWxzLm1lcmdlUGFyYW1zKHdtdHNTb3VyY2VPcHRpb25zLCBvcHRpb25zLm9sUGFyYW1zKTtcblxuICAgICAgICAgICAgLy8gcmV0dXJucyBhIFdNVFMgb2JqZWN0LCB0aGF0IGluaGVyaXRzIGZyb20gV01UU0V4dGVuZGVkLlxuICAgICAgICAgICAgV01UU0V4dGVuZGVkLmNhbGwodGhpcywgd210c1NvdXJjZU9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBvbiBzdXJjaGFyZ2UgbGVzIG9yaWdpbmF0b3JzIChub24gcsOpY3Vww6lyw6lzIGRlcHVpcyBjb25maWd1cmF0aW9uIGRlIGxhIGNvdWNoZSlcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm9sUGFyYW1zICYmICF3bXRzUGFyYW1zLm9yaWdpbmF0b3JzKSB7XG4gICAgICAgICAgICAgICAgd210c1BhcmFtcy5vcmlnaW5hdG9ycyA9IG9wdGlvbnMub2xQYXJhbXMuYXR0cmlidXRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIG9yaWdpbmF0b3JzIHRvIGxheWVyIHNvdXJjZSAodG8gYmUgdXBkYXRlZCBieSBPcmlnaW5hdG9ycyBjb250cm9sKVxuICAgICAgICAgICAgdGhpcy5fb3JpZ2luYXRvcnMgPSB3bXRzUGFyYW1zLm9yaWdpbmF0b3JzO1xuXG4gICAgICAgICAgICAvLyBhZGQgbGVnZW5kcyBhbmQgbWV0YWRhdGEgKHRvIGJlIGFkZGVkIHRvIExheWVyU3dpdGNoZXIgY29udHJvbClcbiAgICAgICAgICAgIHRoaXMuX2xlZ2VuZHMgPSBvcHRpb25zLmxlZ2VuZHMgfHwgd210c1BhcmFtcy5sZWdlbmRzO1xuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhIHx8IHdtdHNQYXJhbXMubWV0YWRhdGE7XG4gICAgICAgICAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24gfHwgd210c1BhcmFtcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRoaXMuX3RpdGxlID0gb3B0aW9ucy50aXRsZSB8fCB3bXRzUGFyYW1zLnRpdGxlO1xuICAgICAgICAgICAgdGhpcy5fcXVpY2tsb29rVXJsID0gb3B0aW9ucy5xdWlja2xvb2tVcmwgfHwgd210c1BhcmFtcy5xdWlja2xvb2tVcmw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBsYXllciBpcyBub3QgaW4gR3AuQ29uZmlnXG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiW3NvdXJjZSBXTVRTXSBFUlJPUiA6IFwiICsgb3B0aW9ucy5sYXllciArIFwiIGNhbm5vdCBiZSBmb3VuZCBpbiBHZW9wb3J0YWwgQ29uZmlndXJhdGlvbi4gTWFrZSBzdXJlIHRoYXQgdGhpcyByZXNvdXJjZSBpcyBpbmNsdWRlZCBpbiB5b3VyIGNvbnRyYWN0IGtleS5cIik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFdNVFNFeHRlbmRlZCh7fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmhlcml0cyBmcm9tIG9sLnNvdXJjZS5XTVRTXG4gICAgaWYgKFdNVFNFeHRlbmRlZCkgU291cmNlV01UUy5fX3Byb3RvX18gPSBXTVRTRXh0ZW5kZWQ7XG5cbiAgICAvKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6U291cmNlV01UU1xuICAgICAqL1xuICAgIFNvdXJjZVdNVFMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShXTVRTRXh0ZW5kZWQucHJvdG90eXBlLCB7fSk7XG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yIChhbGlhcylcbiAgICAgKi9cbiAgICBTb3VyY2VXTVRTLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZVdNVFM7XG5cbiAgICByZXR1cm4gU291cmNlV01UUztcbn0oV01UU0V4dGVuZGVkKSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZVdNVFM7XG5cbi8vIEV4cG9zZSBTb3VyY2VXTVRTIGFzIG9sLnNvdXJjZS5HZW9wb3J0YWxXTVRTLiAoZm9yIGEgYnVpbGQgYnVuZGxlKVxuaWYgKHdpbmRvdy5vbCAmJiB3aW5kb3cub2wuc291cmNlKSB7XG4gICAgd2luZG93Lm9sLnNvdXJjZS5HZW9wb3J0YWxXTVRTID0gU291cmNlV01UUztcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/OpenLayers/Layers/SourceWMTS.js\n"); /***/ }), diff --git a/current/dist/openlayers/GpPluginOpenLayers-src.css b/current/dist/openlayers/GpPluginOpenLayers-src.css index 08fec4192..7005c39cc 100644 --- a/current/dist/openlayers/GpPluginOpenLayers-src.css +++ b/current/dist/openlayers/GpPluginOpenLayers-src.css @@ -9,8 +9,8 @@ * @copyright copyright (c) IGN * @license CeCILL-B * @author IGN - * @version 3.4.3 - * @date 14/05/2024 + * @version 3.4.4 + * @date 05/06/2024 * */ diff --git a/current/dist/openlayers/GpPluginOpenLayers-src.js b/current/dist/openlayers/GpPluginOpenLayers-src.js index 1484bbc41..6fe9a65ae 100644 --- a/current/dist/openlayers/GpPluginOpenLayers-src.js +++ b/current/dist/openlayers/GpPluginOpenLayers-src.js @@ -9,8 +9,8 @@ * @copyright copyright (c) IGN * @license CeCILL-B * @author IGN - * @version 3.4.3 - * @date 14/05/2024 + * @version 3.4.4 + * @date 05/06/2024 * */ @@ -1033,7 +1033,7 @@ if (window.ol) { /* 3 */ /***/ (function(module) { -module.exports = JSON.parse("{\"name\":\"geoportal-extensions\",\"description\":\"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries\",\"version\":\"3.0.3\",\"date\":\"14/05/2024\",\"leafletExtName\":\"French Geoportal Extension for Leaflet\",\"leafletExtVersion\":\"2.4.0\",\"olExtName\":\"French Geoportal Extension for OpenLayers\",\"olExtVersion\":\"3.4.3\",\"itownsExtName\":\"French Geoportal Extension for Itowns\",\"itownsExtVersion\":\"2.5.0\",\"main\":\"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js\",\"types\":\"dist/leaflet/index.d.ts, dist/openlayers/index.d.ts, dist/itowns/index.d.ts\",\"module\":\"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js\",\"directories\":{},\"scripts\":{\"setup\":\"npm install\",\"clean\":\"echo \\\"Warning: target not yet implemented!\\\" && exit 0\",\"eslint\":\"eslint src/\",\"test\":\"npm run test:serve\",\"test:serve\":\"cd test && webpack-dev-server --hot --config webpack.test.serve.js\",\"sample\":\"npm run sample:serve\",\"sample:serve\":\"npm run sample:ol:serve\",\"sample:itowns:serve\":\"webpack-dev-server --config build/webpack/webpack.config.itowns --mode=development --https --open-page samples/index-itowns-map.html --content-base . --output-public-path '/dist/itowns/' --port 9001 --open\",\"sample:leaflet:serve\":\"webpack-dev-server --config build/webpack/webpack.config.leaflet --mode=development --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path '/dist/leaflet/' --port 9001 --open\",\"sample:ol:serve\":\"webpack-dev-server --config build/webpack/webpack.config.openlayers --mode=development --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path '/dist/openlayers/' --port 9001 --open\",\"generate-types:ol\":\"npx tsc -p build/types/tsconfig-openlayers.json\",\"generate-types:leaflet\":\"npx tsc -p build/types/tsconfig-leaflet.json\",\"generate-types:itowns\":\"npx tsc -p build/types/tsconfig-itowns.json\",\"generate-jsdoc:ol\":\"jsdoc -c build/jsdoc/jsdoc-openlayers.json\",\"generate-jsdoc:leaflet\":\"jsdoc -c build/jsdoc/jsdoc-leaflet.json\",\"generate-jsdoc:itowns\":\"jsdoc -c build/jsdoc/jsdoc-itowns.json\",\"doc\":\"npm run doc:serve\",\"doc:serve\":\"npm run doc:ol:serve\",\"doc:itowns:serve\":\"webpack-dev-server --hot --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open\",\"doc:leaflet:serve\":\"webpack-dev-server --hot --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open\",\"doc:ol:serve\":\"webpack-dev-server --hot --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open\",\"build:dev\":\"npm-run-all --print-label --print-name build:*:dev\",\"build:prod\":\"npm-run-all --print-label --print-name build:*:prod\",\"build:src\":\"npm-run-all --print-label --print-name build:*:src\",\"build\":\"npm-run-all --print-label --print-name build:*:*\",\"build:itowns\":\"npm-run-all --print-label --print-name build:itowns:*\",\"build:itowns:dev\":\"webpack --config build/webpack/webpack.config.itowns --mode=development\",\"build:itowns:prod\":\"webpack --config build/webpack/webpack.config.itowns --mode=production\",\"build:itowns:src\":\"webpack --config build/webpack/webpack.config.itowns --mode=none\",\"build:ol\":\"npm-run-all --print-label --print-name build:ol:*\",\"build:ol:dev\":\"webpack --config build/webpack/webpack.config.openlayers --mode=development\",\"build:ol:prod\":\"webpack --config build/webpack/webpack.config.openlayers --mode=production\",\"build:ol:src\":\"webpack --config build/webpack/webpack.config.openlayers --mode=none\",\"build:leaflet\":\"npm-run-all --print-label --print-name build:leaflet:*\",\"build:leaflet:dev\":\"webpack --config build/webpack/webpack.config.leaflet --mode=development\",\"build:leaflet:prod\":\"webpack --config build/webpack/webpack.config.leaflet --mode=production\",\"build:leaflet:src\":\"webpack --config build/webpack/webpack.config.leaflet --mode=none\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/IGNF/geoportal-extensions.git\"},\"author\":\"IGNF\",\"keywords\":[\"geoportail\",\"geoplateforme\",\"javascript\",\"OpenLayers\",\"Leaflet\",\"Itowns\",\"3D\"],\"license\":\"CECILL-B\",\"bugs\":{\"url\":\"https://github.com/IGNF/geoportal-extensions/issues\"},\"homepage\":\"https://github.com/IGNF/geoportal-extensions#readme\",\"dependencies\":{\"@mapbox/mapbox-gl-style-spec\":\"13.20.1\",\"eventbusjs\":\"0.2.0\",\"geoportal-access-lib\":\"3.4.2\",\"itowns\":\"2.38.2\",\"leaflet\":\"1.7.1\",\"leaflet-draw\":\"1.0.4\",\"loglevel\":\"^1.6.7\",\"markdown-toc\":\"^1.2.0\",\"ol\":\"6.9.0\",\"ol-mapbox-style\":\"6.7.0\",\"proj4\":\"2.7.5\",\"proj4leaflet\":\"1.0.2\",\"sortablejs\":\"1.14.0\",\"three\":\"0.137.5\",\"typescript\":\"^4.5.5\",\"whatwg-fetch\":\"3.0.0\"},\"devDependencies\":{\"@babel/core\":\"^7.4.4\",\"@babel/plugin-transform-template-literals\":\"^7.7.4\",\"@babel/preset-env\":\"^7.4.4\",\"babel-loader\":\"^8.0.5\",\"chai\":\"^4.2.0\",\"chalk\":\"^4.0.0\",\"clean-webpack-plugin\":\"^3.0.0\",\"copy-webpack-plugin\":\"^5.0.3\",\"core-js\":\"^3.6.4\",\"css-loader\":\"^3.4.2\",\"eslint\":\"^6.8.0\",\"eslint-config-standard\":\"^14.1.1\",\"eslint-loader\":\"^4.0.0\",\"eslint-plugin-import\":\"^2.17.2\",\"eslint-plugin-node\":\"^11.1.0\",\"eslint-plugin-promise\":\"^4.1.1\",\"eslint-plugin-standard\":\"^4.0.0\",\"exports-loader\":\"^0.7.0\",\"expose-loader\":\"^0.7.5\",\"fs-extra\":\"^9.0.0\",\"handlebars\":\"^4.7.5\",\"handlebars-layouts\":\"^3.1.4\",\"html-webpack-plugin\":\"^4.0.4\",\"jsdoc-webpack-plugin\":\"^0.3.0\",\"mini-css-extract-plugin\":\"^0.9.0\",\"mocha\":\"^7.1.1\",\"mocha-loader\":\"^5.0.0\",\"npm-run-all\":\"^4.1.5\",\"optimize-css-assets-webpack-plugin\":\"^5.0.1\",\"path\":\"^0.12.7\",\"replace-bundle-webpack-plugin\":\"^1.0.0\",\"requirejs\":\"^2.3.6\",\"responsive-loader\":\"^1.2.0\",\"speed-measure-webpack-plugin\":\"^1.3.0\",\"string-template\":\"^1.0.0\",\"style-loader\":\"^1.1.3\",\"terser-webpack-plugin\":\"^2.0.0\",\"url-loader\":\"^4.0.0\",\"webpack\":\"^4.30.0\",\"webpack-cli\":\"^3.3.1\",\"webpack-dev-server\":\"^3.3.1\",\"webpack-node-externals\":\"^1.7.2\"}}"); +module.exports = JSON.parse("{\"name\":\"geoportal-extensions\",\"description\":\"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries\",\"version\":\"3.0.4\",\"date\":\"05/06/2024\",\"leafletExtName\":\"French Geoportal Extension for Leaflet\",\"leafletExtVersion\":\"2.4.0\",\"olExtName\":\"French Geoportal Extension for OpenLayers\",\"olExtVersion\":\"3.4.4\",\"itownsExtName\":\"French Geoportal Extension for Itowns\",\"itownsExtVersion\":\"2.5.1\",\"main\":\"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js\",\"types\":\"dist/leaflet/index.d.ts, dist/openlayers/index.d.ts, dist/itowns/index.d.ts\",\"module\":\"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js\",\"directories\":{},\"scripts\":{\"setup\":\"npm install\",\"clean\":\"echo \\\"Warning: target not yet implemented!\\\" && exit 0\",\"eslint\":\"eslint src/\",\"test\":\"npm run test:serve\",\"test:serve\":\"cd test && webpack-dev-server --hot --config webpack.test.serve.js\",\"sample\":\"npm run sample:serve\",\"sample:serve\":\"npm run sample:ol:serve\",\"sample:itowns:serve\":\"webpack-dev-server --config build/webpack/webpack.config.itowns --mode=development --https --open-page samples/index-itowns-map.html --content-base . --output-public-path '/dist/itowns/' --port 9001 --open\",\"sample:leaflet:serve\":\"webpack-dev-server --config build/webpack/webpack.config.leaflet --mode=development --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path '/dist/leaflet/' --port 9001 --open\",\"sample:ol:serve\":\"webpack-dev-server --config build/webpack/webpack.config.openlayers --mode=development --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path '/dist/openlayers/' --port 9001 --open\",\"generate-types:ol\":\"npx tsc -p build/types/tsconfig-openlayers.json\",\"generate-types:leaflet\":\"npx tsc -p build/types/tsconfig-leaflet.json\",\"generate-types:itowns\":\"npx tsc -p build/types/tsconfig-itowns.json\",\"generate-jsdoc:ol\":\"jsdoc -c build/jsdoc/jsdoc-openlayers.json\",\"generate-jsdoc:leaflet\":\"jsdoc -c build/jsdoc/jsdoc-leaflet.json\",\"generate-jsdoc:itowns\":\"jsdoc -c build/jsdoc/jsdoc-itowns.json\",\"doc\":\"npm run doc:serve\",\"doc:serve\":\"npm run doc:ol:serve\",\"doc:itowns:serve\":\"webpack-dev-server --hot --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open\",\"doc:leaflet:serve\":\"webpack-dev-server --hot --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open\",\"doc:ol:serve\":\"webpack-dev-server --hot --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open\",\"build:dev\":\"npm-run-all --print-label --print-name build:*:dev\",\"build:prod\":\"npm-run-all --print-label --print-name build:*:prod\",\"build:src\":\"npm-run-all --print-label --print-name build:*:src\",\"build\":\"npm-run-all --print-label --print-name build:*:*\",\"build:itowns\":\"npm-run-all --print-label --print-name build:itowns:*\",\"build:itowns:dev\":\"webpack --config build/webpack/webpack.config.itowns --mode=development\",\"build:itowns:prod\":\"webpack --config build/webpack/webpack.config.itowns --mode=production\",\"build:itowns:src\":\"webpack --config build/webpack/webpack.config.itowns --mode=none\",\"build:ol\":\"npm-run-all --print-label --print-name build:ol:*\",\"build:ol:dev\":\"webpack --config build/webpack/webpack.config.openlayers --mode=development\",\"build:ol:prod\":\"webpack --config build/webpack/webpack.config.openlayers --mode=production\",\"build:ol:src\":\"webpack --config build/webpack/webpack.config.openlayers --mode=none\",\"build:leaflet\":\"npm-run-all --print-label --print-name build:leaflet:*\",\"build:leaflet:dev\":\"webpack --config build/webpack/webpack.config.leaflet --mode=development\",\"build:leaflet:prod\":\"webpack --config build/webpack/webpack.config.leaflet --mode=production\",\"build:leaflet:src\":\"webpack --config build/webpack/webpack.config.leaflet --mode=none\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/IGNF/geoportal-extensions.git\"},\"author\":\"IGNF\",\"keywords\":[\"geoportail\",\"geoplateforme\",\"javascript\",\"OpenLayers\",\"Leaflet\",\"Itowns\",\"3D\"],\"license\":\"CECILL-B\",\"bugs\":{\"url\":\"https://github.com/IGNF/geoportal-extensions/issues\"},\"homepage\":\"https://github.com/IGNF/geoportal-extensions#readme\",\"dependencies\":{\"@mapbox/mapbox-gl-style-spec\":\"13.20.1\",\"eventbusjs\":\"0.2.0\",\"geoportal-access-lib\":\"3.4.2\",\"itowns\":\"2.38.2\",\"leaflet\":\"1.7.1\",\"leaflet-draw\":\"1.0.4\",\"loglevel\":\"^1.6.7\",\"markdown-toc\":\"^1.2.0\",\"ol\":\"6.9.0\",\"ol-mapbox-style\":\"6.7.0\",\"proj4\":\"2.7.5\",\"proj4leaflet\":\"1.0.2\",\"sortablejs\":\"1.14.0\",\"three\":\"0.137.5\",\"typescript\":\"^4.5.5\",\"whatwg-fetch\":\"3.0.0\"},\"devDependencies\":{\"@babel/core\":\"^7.4.4\",\"@babel/plugin-transform-template-literals\":\"^7.7.4\",\"@babel/preset-env\":\"^7.4.4\",\"babel-loader\":\"^8.0.5\",\"chai\":\"^4.2.0\",\"chalk\":\"^4.0.0\",\"clean-webpack-plugin\":\"^3.0.0\",\"copy-webpack-plugin\":\"^5.0.3\",\"core-js\":\"^3.6.4\",\"css-loader\":\"^3.4.2\",\"eslint\":\"^6.8.0\",\"eslint-config-standard\":\"^14.1.1\",\"eslint-loader\":\"^4.0.0\",\"eslint-plugin-import\":\"^2.17.2\",\"eslint-plugin-node\":\"^11.1.0\",\"eslint-plugin-promise\":\"^4.1.1\",\"eslint-plugin-standard\":\"^4.0.0\",\"exports-loader\":\"^0.7.0\",\"expose-loader\":\"^0.7.5\",\"fs-extra\":\"^9.0.0\",\"handlebars\":\"^4.7.5\",\"handlebars-layouts\":\"^3.1.4\",\"html-webpack-plugin\":\"^4.0.4\",\"jsdoc-webpack-plugin\":\"^0.3.0\",\"mini-css-extract-plugin\":\"^0.9.0\",\"mocha\":\"^7.1.1\",\"mocha-loader\":\"^5.0.0\",\"npm-run-all\":\"^4.1.5\",\"optimize-css-assets-webpack-plugin\":\"^5.0.1\",\"path\":\"^0.12.7\",\"replace-bundle-webpack-plugin\":\"^1.0.0\",\"requirejs\":\"^2.3.6\",\"responsive-loader\":\"^1.2.0\",\"speed-measure-webpack-plugin\":\"^1.3.0\",\"string-template\":\"^1.0.0\",\"style-loader\":\"^1.1.3\",\"terser-webpack-plugin\":\"^2.0.0\",\"url-loader\":\"^4.0.0\",\"webpack\":\"^4.30.0\",\"webpack-cli\":\"^3.3.1\",\"webpack-dev-server\":\"^3.3.1\",\"webpack-node-externals\":\"^1.7.2\"}}"); /***/ }), /* 4 */ @@ -21290,7 +21290,7 @@ var Utils = { * @param {Boolean} replace - replace destination value by source if exists or not (true by default) */ mergeParams: function mergeParams(dest, source, replace) { - if (!dest || !source) { + if (typeof dest === "undefined" || typeof source === "undefined") { return; } if (typeof replace === "undefined") { @@ -22299,7 +22299,7 @@ var SourceWMTS = function (WMTSExtended) { tileGrid: new ol_tilegrid_WMTS__WEBPACK_IMPORTED_MODULE_1___default.a({ resolutions: wmtsParams.nativeResolutions, matrixIds: wmtsParams.matrixIds, - origin: [wmtsParams.tileMatrices[0].topLeftCorner.x, wmtsParams.tileMatrices[0].topLeftCorner.y] + origin: [Object.values(wmtsParams.tileMatrices)[0].topLeftCorner.x, Object.values(wmtsParams.tileMatrices)[0].topLeftCorner.y] }) }; @@ -30223,33 +30223,33 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validate", function() { return validateStyle; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateMapboxApiSupported", function() { return validateMapboxApiSupported; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "visit", function() { return visit; }); -function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _toArray(r) { return _arrayWithHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableRest(); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _wrapNativeSuper(t) { var r = "function" == typeof Map ? new Map() : void 0; return _wrapNativeSuper = function _wrapNativeSuper(t) { if (null === t || !_isNativeFunction(t)) return t; if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function"); if (void 0 !== r) { if (r.has(t)) return r.get(t); r.set(t, Wrapper); } function Wrapper() { return _construct(t, arguments, _getPrototypeOf(this).constructor); } return Wrapper.prototype = Object.create(t.prototype, { constructor: { value: Wrapper, enumerable: !1, writable: !0, configurable: !0 } }), _setPrototypeOf(Wrapper, t); }, _wrapNativeSuper(t); } function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _isNativeFunction(fn) { try { return Function.toString.call(fn).indexOf("[native code]") !== -1; } catch (e) { return typeof fn === "function"; } } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _isNativeFunction(t) { try { return -1 !== Function.toString.call(t).indexOf("[native code]"); } catch (n) { return "function" == typeof t; } } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +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 _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var $version = 8; var $root = { @@ -53713,7 +53713,7 @@ var SearchEngine = function (Control) { collapsed: true, zoomTo: "", resources: { - geocode: "", + geocode: [], autocomplete: [] }, displayAdvancedSearch: true, @@ -53734,7 +53734,7 @@ var SearchEngine = function (Control) { // merge with user options _Common_Utils__WEBPACK_IMPORTED_MODULE_6__["default"].mergeParams(this.options, options); if (this.options.resources.geocode === "") { - this.options.resources.geocode = "address,poi"; + this.options.resources.geocode = ["PositionOfInterest", "StreetAddress"]; } if (this.options.resources.autocomplete.length === 0) { this.options.resources.autocomplete = ["PositionOfInterest", "StreetAddress"]; @@ -54908,6 +54908,9 @@ var SearchEngine = function (Control) { for (var i = 0; i < data.length; i++) { var filter = data[i]; if (filter.value) { + if (filter.key === "section") { + filter.value = filter.value.toUpperCase(); + } _filterOptions[filter.key] = filter.value; } } @@ -55319,10 +55322,6 @@ var SearchEngineUtils = { name: "municipalitycode", title: "Code commune (INSEE)", description: "Code INSEE de la commune : 3 chiffres (ex: 067)" - }, { - name: "city", - title: "Nom commune", - description: "Nom de la commune" }, { name: "oldmunicipalitycode", title: "Commune absorbée", @@ -73404,18 +73403,18 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Formats_GPX__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(134); /* harmony import */ var _Common_Controls_ExportDOM__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(238); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } // import CSS @@ -82735,9 +82734,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Editor_Search__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(257); /* harmony import */ var _Common_Controls_Editor_EditorDOM__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(258); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // import CSS @@ -83760,9 +83759,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(133); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(114); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -84315,9 +84314,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(204); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(114); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -84708,9 +84707,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(133); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(114); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -84970,9 +84969,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(114); /* harmony import */ var _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(121); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -85968,9 +85967,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(133); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(114); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -86642,9 +86641,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(251); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(114); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -86836,9 +86835,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Common_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(133); /* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(114); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } diff --git a/current/dist/openlayers/GpPluginOpenLayers.css b/current/dist/openlayers/GpPluginOpenLayers.css index 836426eb6..be0862a14 100644 --- a/current/dist/openlayers/GpPluginOpenLayers.css +++ b/current/dist/openlayers/GpPluginOpenLayers.css @@ -9,8 +9,8 @@ * @copyright copyright (c) IGN * @license CeCILL-B * @author IGN - * @version 3.4.3 - * @date 14/05/2024 + * @version 3.4.4 + * @date 05/06/2024 * */ diff --git a/current/dist/openlayers/GpPluginOpenLayers.js b/current/dist/openlayers/GpPluginOpenLayers.js index d949233d0..3899eee50 100644 --- a/current/dist/openlayers/GpPluginOpenLayers.js +++ b/current/dist/openlayers/GpPluginOpenLayers.js @@ -9,8 +9,8 @@ * @copyright copyright (c) IGN * @license CeCILL-B * @author IGN - * @version 3.4.3 - * @date 14/05/2024 + * @version 3.4.4 + * @date 05/06/2024 * */ /*! @@ -88,8 +88,8 @@ * See https://raw.githubusercontent.com/proj4js/proj4js/master/LICENSE.md * @version 2.7.5 */ -var Gp=function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=80)}([function(e,t){e.exports=ol.style},function(e,t){e.exports=ol.proj},function(e,t){e.exports=ol.Observable},function(e,t){e.exports=ol.interaction},function(e,t){e.exports=ol.control.Control},function(e,t){e.exports=ol.layer.Vector},function(e,t,n){(function(t){e.exports=t.eventbus=n(111)}).call(this,n(28))},function(e,t,n){"use strict";(function(e){var n={configuration:{},isConfigLoaded:function(){if(this.configuration&&0!==Object.keys(this.configuration).length)return!0;var t="undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0!==e?e:{};return!!(t.Gp&&t.Gp.Config&&t.Gp.Config.layers&&0!==Object.keys(t.Gp.Config.layers).length)&&(this.configuration=t.Gp.Config,!0)}};t.a=n}).call(this,n(28))},function(e,t){e.exports=ol.geom},function(e,t){e.exports=ol.source.Vector},function(e,t){e.exports=ol.Overlay},function(e,t){e.exports=ol.sphere},function(e,t){e.exports=ol.Feature},function(e,t){e.exports=ol.style.Style},function(e,t){e.exports=ol.source.VectorTile},function(e,t){e.exports=ol.style.Fill},function(e,t){e.exports=ol.style.Stroke},function(e,t,n){"use strict";(function(e,o){function i(e){return function(e){if(Array.isArray(e))return I(e)}(e)||r(e)||C(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function a(e,t){return l(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o,i,r,a,s=[],l=!0,c=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(o=r.call(n)).done)&&(s.push(o.value),s.length!==t);l=!0);}catch(e){c=!0,i=e}finally{try{if(!l&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw i}}return s}}(e,t)||C(e,t)||s()}function s(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(e){if(Array.isArray(e))return e}function c(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:i}}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 r,a=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,r=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw r}}}}function C(e,t){if(e){if("string"==typeof e)return I(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?I(e,t):void 0}}function I(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129],doc:"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL."},scheme:{type:"enum",values:{xyz:{doc:"Slippy map tilenames scheme."},tms:{doc:"OSGeo spec scheme."}},default:"xyz",doc:"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed."},minzoom:{type:"number",default:0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number",default:22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},promoteId:{type:"promoteId",doc:"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`. If specified as a string for a vector tile source, the same property is used across all its source layers."},volatile:{type:"boolean",default:!1,doc:"A setting to determine whether a source's tiles are cached locally.","sdk-support":{"basic functionality":{android:"9.3.0",ios:"5.10.0"}}},"*":{type:"*",doc:"Other keys to configure the data source."}},source_raster:{type:{required:!0,type:"enum",values:{raster:{doc:"A raster tile source."}},doc:"The type of the source."},url:{type:"string",doc:"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129],doc:"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL."},minzoom:{type:"number",default:0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number",default:22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},tileSize:{type:"number",default:512,units:"pixels",doc:"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},scheme:{type:"enum",values:{xyz:{doc:"Slippy map tilenames scheme."},tms:{doc:"OSGeo spec scheme."}},default:"xyz",doc:"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},volatile:{type:"boolean",default:!1,doc:"A setting to determine whether a source's tiles are cached locally.","sdk-support":{"basic functionality":{android:"9.3.0",ios:"5.10.0"}}},"*":{type:"*",doc:"Other keys to configure the data source."}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{doc:"A RGB-encoded raster DEM source"}},doc:"The type of the source."},url:{type:"string",doc:"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129],doc:"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL."},minzoom:{type:"number",default:0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number",default:22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},tileSize:{type:"number",default:512,units:"pixels",doc:"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},encoding:{type:"enum",values:{terrarium:{doc:"Terrarium format PNG tiles. See https://aws.amazon.com/es/public-datasets/terrain/ for more info."},mapbox:{doc:"Mapbox Terrain RGB tiles. See https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb for more info."}},default:"mapbox",doc:"The encoding used by this source. Mapbox Terrain RGB is used by default"},volatile:{type:"boolean",default:!1,doc:"A setting to determine whether a source's tiles are cached locally.","sdk-support":{"basic functionality":{android:"9.3.0",ios:"5.10.0"}}},"*":{type:"*",doc:"Other keys to configure the data source."}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{doc:"A GeoJSON data source."}},doc:"The data type of the GeoJSON source."},data:{type:"*",doc:"A URL to a GeoJSON file, or inline GeoJSON."},maxzoom:{type:"number",default:18,doc:"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels)."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},buffer:{type:"number",default:128,maximum:512,minimum:0,doc:"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance."},filter:{type:"*",doc:"An expression for filtering features prior to processing them for rendering."},tolerance:{type:"number",default:.375,doc:"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance)."},cluster:{type:"boolean",default:!1,doc:"If the data is a collection of point features, setting this to true clusters the points by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n * `cluster` Is `true` if the point is a cluster \n * `cluster_id` A unqiue id for the cluster to be used in conjunction with the [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\n * `point_count` Number of original points grouped into this cluster\n * `point_count_abbreviated` An abbreviated point count"},clusterRadius:{type:"number",default:50,minimum:0,doc:"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile."},clusterMaxZoom:{type:"number",doc:"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15."},clusterMinPoints:{type:"number",doc:"Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`."},clusterProperties:{type:"*",doc:'An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from clustered points. Has the form `{"property_name": [operator, map_expression]}`. `operator` is any expression function that accepts at least 2 operands (e.g. `"+"` or `"max"`) — it accumulates the property value from clusters/points the cluster contains; `map_expression` produces the value of a single point.\n\nExample: `{"sum": ["+", ["get", "scalerank"]]}`.\n\nFor more advanced use cases, in place of `operator`, you can use a custom reduce expression that references a special `["accumulated"]` value, e.g.:\n`{"sum": [["+", ["accumulated"], ["get", "sum"]], ["get", "scalerank"]]}`'},lineMetrics:{type:"boolean",default:!1,doc:"Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values."},generateId:{type:"boolean",default:!1,doc:"Whether to generate ids for the geojson features. When enabled, the `feature.id` property will be auto assigned based on its index in the `features` array, over-writing any previous values."},promoteId:{type:"promoteId",doc:"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`."}},source_video:{type:{required:!0,type:"enum",values:{video:{doc:"A video data source."}},doc:"The data type of the video source."},urls:{required:!0,type:"array",value:"string",doc:"URLs to video content in order of preferred format."},coordinates:{required:!0,doc:"Corners of video specified in longitude, latitude pairs.",type:"array",length:4,value:{type:"array",length:2,value:"number",doc:"A single longitude, latitude pair."}}},source_image:{type:{required:!0,type:"enum",values:{image:{doc:"An image data source."}},doc:"The data type of the image source."},url:{required:!0,type:"string",doc:"URL that points to an image."},coordinates:{required:!0,doc:"Corners of image specified in longitude, latitude pairs.",type:"array",length:4,value:{type:"array",length:2,value:"number",doc:"A single longitude, latitude pair."}}},layer:{id:{type:"string",doc:"Unique layer name.",required:!0},type:{type:"enum",values:{fill:{doc:"A filled polygon with an optional stroked border.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},line:{doc:"A stroked line.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},symbol:{doc:"An icon or a text label.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},circle:{doc:"A filled circle.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},heatmap:{doc:"A heatmap.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"fill-extrusion":{doc:"An extruded (3D) polygon.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},raster:{doc:"Raster map textures such as satellite imagery.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},hillshade:{doc:"Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.","sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},background:{doc:"The background color or pattern of the map.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},sky:{doc:"A spherical dome around the map that is always rendered behind all other layers.","sdk-support":{"basic functionality":{js:"2.0.0"}}}},doc:"Rendering type of this layer.",required:!0},metadata:{type:"*",doc:"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},source:{type:"string",doc:"Name of a source description to be used for this layer. Required for all layer types except `background`."},"source-layer":{type:"string",doc:"Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources."},minzoom:{type:"number",minimum:0,maximum:24,doc:"The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden."},maxzoom:{type:"number",minimum:0,maximum:24,doc:"The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden."},filter:{type:"filter",doc:"A expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression is not supported in filter expressions."},layout:{type:"layout",doc:"Layout properties for the layer."},paint:{type:"paint",doc:"Default paint properties for this layer."}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background","layout_sky"],layout_background:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_sky:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"constant"}},layout_fill:{"fill-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.","sdk-support":{"basic functionality":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"},"data-driven styling":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_circle:{"circle-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.","sdk-support":{"basic functionality":{js:"1.2.0",android:"9.2.0",ios:"5.9.0",macos:"0.16.0"},"data-driven styling":{js:"1.2.0",android:"9.2.0",ios:"5.9.0",macos:"0.16.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},"property-type":"constant"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},"property-type":"constant"}},layout_line:{"line-cap":{type:"enum",values:{butt:{doc:"A cap with a squared-off end which is drawn to the exact endpoint of the line."},round:{doc:"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line."},square:{doc:"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width."}},default:"butt",doc:"The display of line endings.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"2.3.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-join":{type:"enum",values:{bevel:{doc:"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width."},round:{doc:"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line."},miter:{doc:"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet."}},default:"miter",doc:"The display of lines when joining.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{type:"number",default:2,doc:"Used to automatically convert miter joins to bevel joins for sharp angles.",requires:[{"line-join":"miter"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-round-limit":{type:"number",default:1.05,doc:"Used to automatically convert round joins to miter joins for shallow angles.",requires:[{"line-join":"round"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.","sdk-support":{"basic functionality":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"},"data-driven styling":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_symbol:{"symbol-placement":{type:"enum",values:{point:{doc:"The label is placed at the point where the geometry is located."},line:{doc:"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries."},"line-center":{doc:"The label is placed at the center of the line of the geometry. Can only be used on `LineString` and `Polygon` geometries. Note that a single feature in a vector tile may contain multiple line geometries."}},default:"point",doc:"Label placement relative to its geometry.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"`line-center` value":{js:"0.47.0",android:"6.4.0",ios:"4.3.0",macos:"0.10.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-spacing":{type:"number",default:250,minimum:1,units:"pixels",doc:"Distance between two symbol anchors.",requires:[{"symbol-placement":"line"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{type:"boolean",default:!1,doc:"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.","sdk-support":{"basic functionality":{js:"0.53.0",android:"7.4.0",ios:"4.11.0",macos:"0.14.0"},"data-driven styling":{js:"0.53.0",android:"7.4.0",ios:"4.11.0",macos:"0.14.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{type:"enum",values:{auto:{doc:"Sorts symbols by `symbol-sort-key` if set. Otherwise, sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`."},"viewport-y":{doc:"Sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`."},source:{doc:"Sorts symbols by `symbol-sort-key` if set. Otherwise, no sorting is applied; symbols are rendered in the same order as the source data."}},default:"auto",doc:"Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`.","sdk-support":{"basic functionality":{js:"0.49.0",android:"6.6.0",ios:"4.5.0",macos:"0.12.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{type:"boolean",default:!1,doc:"If true, the icon will be visible even if it collides with other previously drawn symbols.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{type:"boolean",default:!1,doc:"If true, other symbols can be visible even if they collide with the icon.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-optional":{type:"boolean",default:!1,doc:"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.",requires:["icon-image","text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{type:"enum",values:{map:{doc:"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line` or `line-center`, aligns icon x-axes with the line."},viewport:{doc:"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`."},auto:{doc:"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`."}},default:"auto",doc:"In combination with `symbol-placement`, determines the rotation behavior of icons.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"`auto` value":{js:"0.25.0",android:"4.2.0",ios:"3.4.0",macos:"0.3.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-size":{type:"number",default:1,minimum:0,units:"factor of the original icon size",doc:"Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{type:"enum",values:{none:{doc:"The icon is displayed at its intrinsic aspect ratio."},width:{doc:"The icon is scaled in the x-dimension to fit the width of the text."},height:{doc:"The icon is scaled in the y-dimension to fit the height of the text."},both:{doc:"The icon is scaled in both x- and y-dimensions."}},default:"none",doc:"Scales the icon to fit around the associated text.",requires:["icon-image","text-field"],"sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"},"stretchable icons":{js:"1.6.0",android:"9.2.0",ios:"5.8.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",doc:"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.",requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],"sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-image":{type:"resolvedImage",doc:"Name of image in sprite to use for drawing an image background.",tokens:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{type:"number",default:0,period:360,units:"degrees",doc:"Rotates the icon clockwise.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.21.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{type:"number",default:2,minimum:0,units:"pixels",doc:"Size of the additional area around the icon bounding box used for detecting symbol collisions.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{type:"boolean",default:!1,doc:"If true, the icon may be flipped to prevent it from being rendered upside-down.",requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],doc:"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{type:"enum",values:{center:{doc:"The center of the icon is placed closest to the anchor."},left:{doc:"The left side of the icon is placed closest to the anchor."},right:{doc:"The right side of the icon is placed closest to the anchor."},top:{doc:"The top of the icon is placed closest to the anchor."},bottom:{doc:"The bottom of the icon is placed closest to the anchor."},"top-left":{doc:"The top left corner of the icon is placed closest to the anchor."},"top-right":{doc:"The top right corner of the icon is placed closest to the anchor."},"bottom-left":{doc:"The bottom left corner of the icon is placed closest to the anchor."},"bottom-right":{doc:"The bottom right corner of the icon is placed closest to the anchor."}},default:"center",doc:"Part of the icon placed closest to the anchor.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{type:"enum",values:{map:{doc:"The icon is aligned to the plane of the map."},viewport:{doc:"The icon is aligned to the plane of the viewport."},auto:{doc:"Automatically matches the value of `icon-rotation-alignment`."}},default:"auto",doc:"Orientation of icon when map is pitched.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{type:"enum",values:{map:{doc:"The text is aligned to the plane of the map."},viewport:{doc:"The text is aligned to the plane of the viewport."},auto:{doc:"Automatically matches the value of `text-rotation-alignment`."}},default:"auto",doc:"Orientation of text when map is pitched.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"},"`auto` value":{js:"0.25.0",android:"4.2.0",ios:"3.4.0",macos:"0.3.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{type:"enum",values:{map:{doc:"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line` or `line-center`, aligns text x-axes with the line."},viewport:{doc:"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`."},auto:{doc:"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`."}},default:"auto",doc:"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"`auto` value":{js:"0.25.0",android:"4.2.0",ios:"3.4.0",macos:"0.3.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-field":{type:"formatted",default:"",tokens:!0,doc:"Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-font":{type:"array",value:"string",default:["Open Sans Regular","Arial Unicode MS Regular"],doc:"Font stack to use for displaying text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-size":{type:"number",default:16,minimum:0,units:"pixels",doc:"Font size.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",doc:"The maximum line width for text wrapping.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{type:"number",default:1.2,units:"ems",doc:"Text leading value for multi-line text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"2.3.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-letter-spacing":{type:"number",default:0,units:"ems",doc:"Text tracking amount.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-justify":{type:"enum",values:{auto:{doc:"The text is aligned towards the anchor position."},left:{doc:"The text is aligned to the left."},center:{doc:"The text is centered."},right:{doc:"The text is aligned to the right."}},default:"center",doc:"Text justification options.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"},auto:{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{type:"number",units:"ems",default:0,doc:"Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present.","sdk-support":{"basic functionality":{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"},"data-driven styling":{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"}},requires:["text-field"],"property-type":"data-driven",expression:{interpolated:!0,parameters:["zoom","feature"]}},"text-variable-anchor":{type:"array",value:"enum",values:{center:{doc:"The center of the text is placed closest to the anchor."},left:{doc:"The left side of the text is placed closest to the anchor."},right:{doc:"The right side of the text is placed closest to the anchor."},top:{doc:"The top of the text is placed closest to the anchor."},bottom:{doc:"The bottom of the text is placed closest to the anchor."},"top-left":{doc:"The top left corner of the text is placed closest to the anchor."},"top-right":{doc:"The top right corner of the text is placed closest to the anchor."},"bottom-left":{doc:"The bottom left corner of the text is placed closest to the anchor."},"bottom-right":{doc:"The bottom right corner of the text is placed closest to the anchor."}},requires:["text-field",{"symbol-placement":["point"]}],doc:"To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.","sdk-support":{"basic functionality":{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-anchor":{type:"enum",values:{center:{doc:"The center of the text is placed closest to the anchor."},left:{doc:"The left side of the text is placed closest to the anchor."},right:{doc:"The right side of the text is placed closest to the anchor."},top:{doc:"The top of the text is placed closest to the anchor."},bottom:{doc:"The bottom of the text is placed closest to the anchor."},"top-left":{doc:"The top left corner of the text is placed closest to the anchor."},"top-right":{doc:"The top right corner of the text is placed closest to the anchor."},"bottom-left":{doc:"The bottom left corner of the text is placed closest to the anchor."},"bottom-right":{doc:"The bottom right corner of the text is placed closest to the anchor."}},default:"center",doc:"Part of the text placed closest to the anchor.",requires:["text-field",{"!":"text-variable-anchor"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{type:"number",default:45,units:"degrees",doc:"Maximum angle change between adjacent characters.",requires:["text-field",{"symbol-placement":["line","line-center"]}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-writing-mode":{type:"array",value:"enum",values:{horizontal:{doc:"If a text's language supports horizontal writing mode, symbols with point placement would be laid out horizontally."},vertical:{doc:"If a text's language supports vertical writing mode, symbols with point placement would be laid out vertically."}},doc:"The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant.",requires:["text-field",{"symbol-placement":["point"]}],"sdk-support":{"basic functionality":{js:"1.3.0",android:"8.3.0",ios:"5.3.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotate":{type:"number",default:0,period:360,units:"degrees",doc:"Rotates the text clockwise.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",doc:"Size of the additional area around the text bounding box used for detecting symbol collisions.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-keep-upright":{type:"boolean",default:!0,doc:"If true, the text may be flipped vertically to prevent it from being rendered upside-down.",requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-transform":{type:"enum",values:{none:{doc:"The text is not altered."},uppercase:{doc:"Forces all letters to be displayed in uppercase."},lowercase:{doc:"Forces all letters to be displayed in lowercase."}},default:"none",doc:"Specifies how to capitalize text, similar to the CSS `text-transform` property.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-offset":{type:"array",doc:"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position.",value:"number",units:"ems",length:2,default:[0,0],requires:["text-field",{"!":"text-radial-offset"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{type:"boolean",default:!1,doc:"If true, the text will be visible even if it collides with other previously drawn symbols.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{type:"boolean",default:!1,doc:"If true, other symbols can be visible even if they collide with the text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-optional":{type:"boolean",default:!1,doc:"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.",requires:["text-field","icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_raster:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},"property-type":"constant"}},filter:{type:"array",value:"*",doc:"A filter selects specific features from a layer."},filter_operator:{type:"enum",values:{"==":{doc:'`["==", key, value]` equality: `feature[key] = value`'},"!=":{doc:'`["!=", key, value]` inequality: `feature[key] ≠ value`'},">":{doc:'`[">", key, value]` greater than: `feature[key] > value`'},">=":{doc:'`[">=", key, value]` greater than or equal: `feature[key] ≥ value`'},"<":{doc:'`["<", key, value]` less than: `feature[key] < value`'},"<=":{doc:'`["<=", key, value]` less than or equal: `feature[key] ≤ value`'},in:{doc:'`["in", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`'},"!in":{doc:'`["!in", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`'},all:{doc:'`["all", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`'},any:{doc:'`["any", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`'},none:{doc:'`["none", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`'},has:{doc:'`["has", key]` `feature[key]` exists'},"!has":{doc:'`["!has", key]` `feature[key]` does not exist'},within:{doc:'`["within", object]` feature geometry is within object geometry'}},doc:"The filter operator."},geometry_type:{type:"enum",values:{Point:{doc:"Filter to point geometries."},LineString:{doc:"Filter to line geometries."},Polygon:{doc:"Filter to polygon geometries."}},doc:"The geometry type for the filter to select."},function:{expression:{type:"expression",doc:"An expression."},stops:{type:"array",doc:"An array of stops.",value:"function_stop"},base:{type:"number",default:1,minimum:0,doc:"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly."},property:{type:"string",doc:"The name of a feature property to use as the function input.",default:"$zoom"},type:{type:"enum",values:{identity:{doc:"Return the input value as the output value."},exponential:{doc:"Generate an output by interpolating between stops just less than and just greater than the function input."},interval:{doc:"Return the output value of the stop just less than the function input."},categorical:{doc:"Return the output value of the stop equal to the function input."}},doc:"The interpolation strategy to use in function evaluation.",default:"exponential"},colorSpace:{type:"enum",values:{rgb:{doc:"Use the RGB color space to interpolate color values"},lab:{doc:"Use the LAB color space to interpolate color values."},hcl:{doc:"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually."}},doc:"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.",default:"rgb"},default:{type:"*",required:!1,doc:"A value to serve as a fallback function result when a value isn't otherwise available. It is used in the following circumstances:\n* In categorical functions, when the feature value does not match any of the stop domain values.\n* In property and zoom-and-property functions, when a feature does not contain a value for the specified property.\n* In identity functions, when the feature value is not valid for the style property (for example, if the function is being used for a `circle-color` property but the feature property value is not a string or not a valid color).\n* In interval or exponential property and zoom-and-property functions, when the feature value is not numeric.\nIf no default is provided, the style property's default is used in these circumstances."}},function_stop:{type:"array",minimum:0,maximum:24,value:["number","color"],length:2,doc:"Zoom level and value pair."},expression:{type:"array",value:"*",minimum:1,doc:"An expression defines a function that can be used for data-driven style properties or feature filters."},expression_name:{doc:"",type:"enum",values:{let:{doc:'Binds expressions to named variables, which can then be referenced in the result expression using ["var", "variable_name"].',group:"Variable binding","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},var:{doc:'References variable bound using "let".',group:"Variable binding","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},literal:{doc:"Provides a literal array or object value.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},array:{doc:"Asserts that the input is an array (optionally with a specific item type and length). If, when the input expression is evaluated, it is not of the asserted type, then this assertion will cause the whole expression to be aborted.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},at:{doc:"Retrieves an item from an array.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},in:{doc:"Determines whether an item exists in an array or a substring exists in a string.",group:"Lookup","sdk-support":{"basic functionality":{js:"1.6.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}}},"index-of":{doc:"Returns the first position at which an item can be found in an array or a substring can be found in a string, or `-1` if the input cannot be found. Accepts an optional index from where to begin the search.",group:"Lookup","sdk-support":{"basic functionality":{js:"1.10.0"}}},slice:{doc:"Returns an item from an array or a substring from a string from a specified start index, or between a start index and an end index if set. The return value is inclusive of the start index but not of the end index.",group:"Lookup","sdk-support":{"basic functionality":{js:"1.10.0"}}},case:{doc:"Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},match:{doc:'Selects the output for which the label value matches the input value, or the fallback value if no match is found. The input can be any expression (for example, `["get", "building_type"]`). Each label must be unique, and must be either:\n - a single literal value; or\n - an array of literal values, the values of which must be all strings or all numbers (for example `[100, 101]` or `["c", "b"]`).\n\nThe input matches if any of the values in the array matches using strict equality, similar to the `"in"` operator.\nIf the input type does not match the type of the labels, the result will be the fallback value.',group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},coalesce:{doc:"Evaluates each expression in turn until the first non-null value is obtained, and returns that value.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},step:{doc:'Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output values ("stops"). The `input` may be any numeric expression (e.g., `["get", "population"]`). Stop inputs must be numeric literals in strictly ascending order. Returns the output value of the stop just less than the input, or the first output if the input is less than the first stop.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.42.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},interpolate:{doc:'Produces continuous, smooth results by interpolating between pairs of input and output values ("stops"). The `input` may be any numeric expression (e.g., `["get", "population"]`). Stop inputs must be numeric literals in strictly ascending order. The output type must be `number`, `array`, or `color`.\n\nInterpolation types:\n- `["linear"]`: Interpolates linearly between the pair of stops just less than and just greater than the input.\n- `["exponential", base]`: Interpolates exponentially between the stops just less than and just greater than the input. `base` controls the rate at which the output increases: higher values make the output increase more towards the high end of the range. With values close to 1 the output increases linearly.\n- `["cubic-bezier", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given control points.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.42.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"interpolate-hcl":{doc:'Produces continuous, smooth results by interpolating between pairs of input and output values ("stops"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the Hue-Chroma-Luminance color space.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.49.0"}}},"interpolate-lab":{doc:'Produces continuous, smooth results by interpolating between pairs of input and output values ("stops"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the CIELAB color space.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.49.0"}}},ln2:{doc:"Returns mathematical constant ln(2).",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},pi:{doc:"Returns the mathematical constant pi.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},e:{doc:"Returns the mathematical constant e.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},typeof:{doc:"Returns a string describing the type of the given value.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},string:{doc:"Asserts that the input value is a string. If multiple values are provided, each one is evaluated in order until a string is obtained. If none of the inputs are strings, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},number:{doc:"Asserts that the input value is a number. If multiple values are provided, each one is evaluated in order until a number is obtained. If none of the inputs are numbers, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},boolean:{doc:"Asserts that the input value is a boolean. If multiple values are provided, each one is evaluated in order until a boolean is obtained. If none of the inputs are booleans, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},object:{doc:"Asserts that the input value is an object. If multiple values are provided, each one is evaluated in order until an object is obtained. If none of the inputs are objects, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},collator:{doc:"Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none is provided, the default locale is used. If the requested locale is not available, the `collator` will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.",group:"Types","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},format:{doc:'Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain a string literal or expression, including an [`\'image\'`](#types-image) expression. Strings may be followed by a style override object that supports the following properties:\n- `"text-font"`: Overrides the font stack specified by the root layout property.\n- `"text-color"`: Overrides the color specified by the root paint property.\n- `"font-scale"`: Applies a scaling factor on `text-size` as specified by the root layout property.',group:"Types","sdk-support":{"basic functionality":{js:"0.48.0",android:"6.7.0",ios:"4.6.0",macos:"0.12.0"},"text-font":{js:"0.48.0",android:"6.7.0",ios:"4.6.0",macos:"0.12.0"},"font-scale":{js:"0.48.0",android:"6.7.0",ios:"4.6.0",macos:"0.12.0"},"text-color":{js:"1.3.0",android:"7.3.0",ios:"4.10.0",macos:"0.14.0"},image:{js:"1.6.0",android:"8.6.0",ios:"5.7.0",macos:"0.15.0"}}},image:{doc:"Returns an `image` type for use in `icon-image`, `*-pattern` entries and as a section in the `format` expression. If set, the `image` argument will check that the requested image exists in the style and will return either the resolved image name or `null`, depending on whether or not the image is currently in the style. This validation process is synchronous and requires the image to have been added to the style before requesting it in the `image` argument.",group:"Types","sdk-support":{"basic functionality":{js:"1.4.0",android:"8.6.0",ios:"5.7.0",macos:"0.15.0"}}},"number-format":{doc:"Converts the input number into a string representation using the providing formatting rules. If set, the `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits` and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.",group:"Types","sdk-support":{"basic functionality":{js:"0.54.0"}}},"to-string":{doc:'Converts the input value to a string. If the input is `null`, the result is `""`. If the input is a boolean, the result is `"true"` or `"false"`. If the input is a number, it is converted to a string as specified by the ["NumberToString" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the ECMAScript Language Specification. If the input is a color, it is converted to a string of the form `"rgba(r,g,b,a)"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. Otherwise, the input is converted to a string in the format specified by the [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.',group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-number":{doc:'Converts the input value to a number, if possible. If the input is `null` or `false`, the result is 0. If the input is `true`, the result is 1. If the input is a string, it is converted to a number as specified by the ["ToNumber Applied to the String Type" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.',group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-boolean":{doc:"Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-rgba":{doc:"Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order.",group:"Color","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-color":{doc:"Converts the input value to a color. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},rgb:{doc:"Creates a color value from red, green, and blue components, which must range between 0 and 255, and an alpha component of 1. If any component is out of range, the expression is an error.",group:"Color","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},rgba:{doc:"Creates a color value from red, green, blue components, which must range between 0 and 255, and an alpha component which must range between 0 and 1. If any component is out of range, the expression is an error.",group:"Color","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},get:{doc:"Retrieves a property value from the current feature's properties, or from another object if a second argument is provided. Returns null if the requested property is missing.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},has:{doc:"Tests for the presence of an property value in the current feature's properties, or from another object if a second argument is provided.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},length:{doc:"Gets the length of an array or string.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},properties:{doc:'Gets the feature properties object. Note that in some cases, it may be more efficient to use ["get", "property_name"] directly.',group:"Feature data","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"feature-state":{doc:"Retrieves a property value from the current feature's state. Returns null if the requested property is not present on the feature's state. A feature's state is not part of the GeoJSON or vector tile data, and must be set programmatically on each feature. Features are identified by their `id` attribute, which must be an integer or a string that can be cast to an integer. Note that [\"feature-state\"] can only be used with paint properties that support data-driven styling.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.46.0"}}},"geometry-type":{doc:"Gets the feature's geometry type: `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},id:{doc:"Gets the feature's id, if it has one.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},zoom:{doc:'Gets the current zoom level. Note that in style layout and paint properties, ["zoom"] may only appear as the input to a top-level "step" or "interpolate" expression.',group:"Zoom","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"heatmap-density":{doc:"Gets the kernel density estimation of a pixel in a heatmap layer, which is a relative measure of how many data points are crowded around a particular pixel. Can only be used in the `heatmap-color` property.",group:"Heatmap","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"line-progress":{doc:"Gets the progress along a gradient line. Can only be used in the `line-gradient` property.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.6.0",macos:"0.12.0"}}},"sky-radial-progress":{doc:"Gets the distance of a point on the sky from the sun position. Returns 0 at sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient` property.",group:"sky","sdk-support":{"basic functionality":{js:"2.0.0"}}},accumulated:{doc:"Gets the value of a cluster property accumulated so far. Can only be used in the `clusterProperties` option of a clustered GeoJSON source.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.53.0"}}},"+":{doc:"Returns the sum of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"*":{doc:"Returns the product of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"-":{doc:"For two inputs, returns the result of subtracting the second input from the first. For a single input, returns the result of subtracting it from 0.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"/":{doc:"Returns the result of floating point division of the first input by the second.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"%":{doc:"Returns the remainder after integer division of the first input by the second.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"^":{doc:"Returns the result of raising the first input to the power specified by the second.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},sqrt:{doc:"Returns the square root of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.42.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},log10:{doc:"Returns the base-ten logarithm of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},ln:{doc:"Returns the natural logarithm of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},log2:{doc:"Returns the base-two logarithm of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},sin:{doc:"Returns the sine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},cos:{doc:"Returns the cosine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},tan:{doc:"Returns the tangent of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},asin:{doc:"Returns the arcsine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},acos:{doc:"Returns the arccosine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},atan:{doc:"Returns the arctangent of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},min:{doc:"Returns the minimum value of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},max:{doc:"Returns the maximum value of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},round:{doc:'Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example, `["round", -1.5]` evaluates to -2.',group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},abs:{doc:"Returns the absolute value of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},ceil:{doc:"Returns the smallest integer that is greater than or equal to the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},floor:{doc:"Returns the largest integer that is less than or equal to the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},distance:{doc:"Returns the shortest distance in meters between the evaluated feature and the input geometry. The input value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries, particularly below zoom level 13.",group:"Math","sdk-support":{"basic functionality":{android:"9.2.0",ios:"5.9.0",macos:"0.16.0"}}},"==":{doc:"Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},"!=":{doc:"Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},">":{doc:"Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},"<":{doc:"Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},">=":{doc:"Returns `true` if the first input is greater than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},"<=":{doc:"Returns `true` if the first input is less than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},all:{doc:"Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and no further input expressions are evaluated.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},any:{doc:"Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true` and no further input expressions are evaluated.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"!":{doc:"Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},within:{doc:"Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry, `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Supported features for evaluation:\n- `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\n- `LineString`: Returns `false` if any part of a line falls outside the boundary, the line intersects the boundary, or a line's endpoint is on the boundary.",group:"Decision","sdk-support":{"basic functionality":{js:"1.9.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}}},"is-supported-script":{doc:"Returns `true` if the input string is expected to render legibly. Returns `false` if the input string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use in Mapbox GL JS).",group:"String","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.6.0"}}},upcase:{doc:"Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.",group:"String","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},downcase:{doc:"Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.",group:"String","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},concat:{doc:"Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a string as if by `to-string`.",group:"String","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"resolved-locale":{doc:"Returns the IETF language tag of the locale being used by the provided `collator`. This can be used to determine the default system locale, or to determine if a requested locale was successfully loaded.",group:"String","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}}}},fog:{range:{type:"array",default:[.5,10],minimum:-20,maximum:20,length:2,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},doc:"The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away.",example:[.5,10],"sdk-support":{"basic functionality":{js:"2.3.0"}}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"The color of the fog. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn.","sdk-support":{"basic functionality":{js:"2.3.0"}}},"horizon-blend":{type:"number","property-type":"data-constant",default:.1,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Horizon blend applies a smooth fade from the color of the fog to the color of the sky. A value of zero leaves a sharp transition from fog to sky. Increasing the value blends the color of fog into increasingly high angles of the sky.","sdk-support":{"basic functionality":{js:"2.3.0"}}}},light:{anchor:{type:"enum",default:"viewport",values:{map:{doc:"The position of the light source is aligned to the rotation of the map."},viewport:{doc:"The position of the light source is aligned to the rotation of the viewport."}},"property-type":"data-constant",transition:!1,expression:{interpolated:!1,parameters:["zoom"]},doc:"Whether extruded geometries are lit relative to the map or viewport.",example:"map","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},position:{type:"array",default:[1.15,210,30],length:3,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},doc:"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).",example:[1.5,90,80],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Color tint for lighting extruded geometries.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},intensity:{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}}},terrain:{source:{type:"string",doc:"Name of a source of `raster_dem` type to be used for terrain elevation.",required:!0,"sdk-support":{"basic functionality":{js:"2.0.0"}}},exaggeration:{type:"number","property-type":"data-constant",default:1,minimum:0,maximum:1e3,expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value.","sdk-support":{"basic functionality":{js:"2.0.0"}}}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background","paint_sky"],paint_fill:{"fill-antialias":{type:"boolean",default:!0,doc:"Whether or not the fill should be antialiased.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.21.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{type:"color",default:"#000000",doc:"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.",transition:!0,requires:[{"!":"fill-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.19.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{type:"color",doc:"The outline color of the fill. Matches the value of `fill-color` if unspecified.",transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.19.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{type:"enum",values:{map:{doc:"The fill is translated relative to the map."},viewport:{doc:"The fill is translated relative to the viewport."}},doc:"Controls the frame of reference for `fill-translate`.",default:"map",requires:["fill-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.49.0",android:"6.5.0",macos:"0.11.0",ios:"4.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available.",transition:!0,"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{type:"color",default:"#000000",doc:"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.",transition:!0,requires:[{"!":"fill-extrusion-pattern"}],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{type:"enum",values:{map:{doc:"The fill extrusion is translated relative to the map."},viewport:{doc:"The fill extrusion is translated relative to the viewport."}},doc:"Controls the frame of reference for `fill-extrusion-translate`.",default:"map",requires:["fill-extrusion-translate"],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.49.0",android:"6.5.0",macos:"0.11.0",ios:"4.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{type:"number",default:0,minimum:0,units:"meters",doc:"The height with which to extrude this layer.",transition:!0,"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{type:"number",default:0,minimum:0,units:"meters",doc:"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.",transition:!0,requires:["fill-extrusion-height"],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{type:"boolean",default:!0,doc:"Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down.",transition:!1,"sdk-support":{"basic functionality":{js:"0.50.0",ios:"4.7.0",macos:"0.13.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_line:{"line-opacity":{type:"number",doc:"The opacity at which the line will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{type:"color",doc:"The color with which the line will be drawn.",default:"#000000",transition:!0,requires:[{"!":"line-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.23.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{type:"enum",values:{map:{doc:"The line is translated relative to the map."},viewport:{doc:"The line is translated relative to the viewport."}},doc:"Controls the frame of reference for `line-translate`.",default:"map",requires:["line-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-width":{type:"number",default:1,minimum:0,transition:!0,units:"pixels",doc:"Stroke thickness.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{type:"number",default:0,minimum:0,doc:"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.",transition:!0,units:"pixels","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{type:"number",default:0,doc:"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.",transition:!0,units:"pixels","sdk-support":{"basic functionality":{js:"0.12.1",android:"3.0.0",ios:"3.1.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Blur applied to the line, in pixels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{type:"array",value:"number",doc:"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels.",minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"2.3.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.49.0",android:"6.5.0",macos:"0.11.0",ios:"4.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{type:"color",doc:'Defines a gradient with which to color a line feature. Can only be used with GeoJSON sources that specify `"lineMetrics": true`.',transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}],"sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.4.0",macos:"0.11.0"},"data-driven styling":{}},expression:{interpolated:!0,parameters:["line-progress"]},"property-type":"color-ramp"}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,transition:!0,units:"pixels",doc:"Circle radius.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.18.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{type:"color",default:"#000000",doc:"The fill color of the circle.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.18.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{type:"number",default:0,doc:"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.20.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{type:"number",doc:"The opacity at which the circle will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.20.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{type:"enum",values:{map:{doc:"The circle is translated relative to the map."},viewport:{doc:"The circle is translated relative to the viewport."}},doc:"Controls the frame of reference for `circle-translate`.",default:"map",requires:["circle-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{type:"enum",values:{map:{doc:"Circles are scaled according to their apparent distance to the camera."},viewport:{doc:"Circles are not scaled."}},default:"map",doc:"Controls the scaling behavior of the circle when the map is pitched.","sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{type:"enum",values:{map:{doc:"The circle is aligned to the plane of the map."},viewport:{doc:"The circle is aligned to the plane of the viewport."}},default:"viewport",doc:"Orientation of circle when map is pitched.","sdk-support":{"basic functionality":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.","sdk-support":{"basic functionality":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{type:"color",default:"#000000",doc:"The stroke color of the circle.",transition:!0,"sdk-support":{"basic functionality":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{type:"number",doc:"The opacity of the circle's stroke.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,transition:!0,units:"pixels",doc:"Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},"data-driven styling":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{type:"number",default:1,minimum:0,transition:!1,doc:"A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},"data-driven styling":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{type:"number",default:1,minimum:0,transition:!0,doc:"Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],doc:'Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `["heatmap-density"]` as input.',transition:!1,"sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},"data-driven styling":{}},expression:{interpolated:!0,parameters:["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{type:"number",doc:"The global opacity at which the heatmap layer will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_symbol:{"icon-opacity":{doc:"The opacity at which the icon will be drawn.",type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{type:"color",default:"#000000",transition:!0,doc:"The color of the icon. This can only be used with sdf icons.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,doc:"The color of the icon's halo. Icon halos can only be used with SDF icons.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Distance of halo to the icon outline.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Fade out the halo towards the outside.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{type:"enum",values:{map:{doc:"Icons are translated relative to the map."},viewport:{doc:"Icons are translated relative to the viewport."}},doc:"Controls the frame of reference for `icon-translate`.",default:"map",requires:["icon-image","icon-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-opacity":{type:"number",doc:"The opacity at which the text will be drawn.",default:1,minimum:0,maximum:1,transition:!0,requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{type:"color",doc:"The color with which the text will be drawn.",default:"#000000",transition:!0,overridable:!0,requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,doc:"The color of the text's halo, which helps it stand out from backgrounds.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"The halo's fadeout distance towards the outside.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{type:"enum",values:{map:{doc:"The text is translated relative to the map."},viewport:{doc:"The text is translated relative to the viewport."}},doc:"Controls the frame of reference for `text-translate`.",default:"map",requires:["text-field","text-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_raster:{"raster-opacity":{type:"number",doc:"The opacity at which the image will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{type:"number",default:0,period:360,transition:!0,units:"degrees",doc:"Rotates hues around the color wheel.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{type:"number",doc:"Increase or reduce the brightness of the image. The value is the minimum brightness.",default:0,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{type:"number",doc:"Increase or reduce the brightness of the image. The value is the maximum brightness.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-saturation":{type:"number",doc:"Increase or reduce the saturation of the image.",default:0,minimum:-1,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-contrast":{type:"number",doc:"Increase or reduce the contrast of the image.",default:0,minimum:-1,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-resampling":{type:"enum",doc:"The resampling/interpolation method to use for overscaling, also known as texture magnification filter",values:{linear:{doc:"(Bi)linear filtering interpolates pixel values using the weighted average of the four closest original source pixels creating a smooth but blurry look when overscaled"},nearest:{doc:"Nearest neighbor filtering interpolates pixel values using the nearest original source pixel creating a sharp but pixelated look when overscaled"}},default:"linear","sdk-support":{"basic functionality":{js:"0.47.0",android:"6.3.0",ios:"4.2.0",macos:"0.9.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{type:"number",default:300,minimum:0,transition:!1,units:"milliseconds",doc:"Fade duration when a new tile is added.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,doc:"The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map`.",transition:!1,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{type:"enum",values:{map:{doc:"The hillshade illumination is relative to the north direction."},viewport:{doc:"The hillshade illumination is relative to the top of the viewport."}},default:"viewport",doc:"Direction of light source when map is rotated.","sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{type:"number",doc:"Intensity of the hillshade",default:.5,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{type:"color",default:"#000000",doc:"The shading color of areas that face away from the light source.",transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",doc:"The shading color of areas that faces towards the light source.",transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{type:"color",default:"#000000",doc:"The shading color used to accentuate rugged terrain like sharp cliffs and gorges.",transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_background:{"background-color":{type:"color",default:"#000000",doc:"The color with which the background will be drawn.",transition:!0,requires:[{"!":"background-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"background-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity at which the background will be drawn.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_sky:{"sky-type":{type:"enum",values:{gradient:{doc:"Renders the sky with a gradient that can be configured with `sky-gradient-radius` and `sky-gradient`."},atmosphere:{doc:"Renders the sky with a simulated atmospheric scattering algorithm, the sun direction can be attached to the light position or explicitly set through `sky-atmosphere-sun`."}},default:"atmosphere",doc:"The type of the sky","sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun":{type:"array",value:"number",length:2,units:"degrees",minimum:[0,0],maximum:[360,180],transition:!1,doc:"Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0° is directly above, at zenith, and 90° at the horizon. When this property is ommitted, the sun center is directly inherited from the light position.","sdk-support":{"basic functionality":{js:"2.0.0"}},requires:[{"sky-type":"atmosphere"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun-intensity":{type:"number",requires:[{"sky-type":"atmosphere"}],default:10,minimum:0,maximum:100,transition:!1,doc:"Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky.","sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"data-constant"},"sky-gradient-center":{type:"array",requires:[{"sky-type":"gradient"}],value:"number",default:[0,0],length:2,units:"degrees",minimum:[0,0],maximum:[360,180],transition:!1,doc:"Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0° is directly above, at zenith, and 90° at the horizon.","sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-gradient-radius":{type:"number",requires:[{"sky-type":"gradient"}],default:90,minimum:0,maximum:180,transition:!1,doc:"The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`.","sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-gradient":{type:"color",default:["interpolate",["linear"],["sky-radial-progress"],.8,"#87ceeb",1,"white"],doc:"Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`.",transition:!1,requires:[{"sky-type":"gradient"}],"sdk-support":{"basic functionality":{js:"2.0.0"},"data-driven styling":{}},expression:{interpolated:!0,parameters:["sky-radial-progress"]},"property-type":"color-ramp"},"sky-atmosphere-halo-color":{type:"color",default:"white",doc:"A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer.",transition:!1,requires:[{"sky-type":"atmosphere"}],"sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"data-constant"},"sky-atmosphere-color":{type:"color",default:"white",doc:"A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density.",transition:!1,requires:[{"sky-type":"atmosphere"}],"sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"data-constant"},"sky-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity of the entire sky layer.",transition:!0,"sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds",doc:"Time allotted for transitions to complete."},delay:{type:"number",default:0,minimum:0,units:"milliseconds",doc:"Length of time before a transition begins."}},"property-type":{"data-driven":{type:"property-type",doc:"Property is interpolable and can be represented using a property expression."},"cross-faded":{type:"property-type",doc:"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms."},"cross-faded-data-driven":{type:"property-type",doc:"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms. It can be represented using a property expression."},"color-ramp":{type:"property-type",doc:"Property should be specified using a color ramp from which the output color can be sampled based on a property calculation."},"data-constant":{type:"property-type",doc:"Property is interpolable but cannot be represented using a property expression."},constant:{type:"property-type",doc:"Property is constant across all zoom levels and property values."}},promoteId:{"*":{type:"string",doc:"A name of a feature property to use as ID for feature state."}}};var E="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{};function _(e){var t={exports:{}};return e(t,t.exports),t.exports}function S(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.')} -/*! https://mths.be/punycode v1.3.2 by @mathias */var M=_((function(e,t){!function(n){var o=t&&!t.nodeType&&t,i=e&&!e.nodeType&&e,r="object"==b(E)&&E;r.global!==r&&r.window!==r&&r.self!==r||(n=r);var a,s,l=2147483647,c=/^xn--/,u=/[^\x20-\x7E]/,d=/[\x2E\u3002\uFF0E\uFF61]/g,p={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=Math.floor,g=String.fromCharCode;function m(e){throw RangeError(p[e])}function f(e,t){for(var n=e.length,o=[];n--;)o[n]=t(e[n]);return o}function y(e,t){var n=e.split("@"),o="";return n.length>1&&(o=n[0]+"@",e=n[1]),o+f((e=e.replace(d,".")).split("."),t).join(".")}function A(e){for(var t,n,o=[],i=0,r=e.length;i=55296&&t<=56319&&i65535&&(t+=g((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=g(e)})).join("")}function C(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function I(e,t,n){var o=0;for(e=n?h(e/700):e>>1,e+=h(e/t);e>455;o+=36)e=h(e/35);return h(o+36*e/(e+38))}function w(e){var t,n,o,i,r,a,s,c,u,d,p,g=[],f=e.length,y=0,A=128,C=72;for((n=e.lastIndexOf("-"))<0&&(n=0),o=0;o=128&&m("not-basic"),g.push(e.charCodeAt(o));for(i=n>0?n+1:0;i=f&&m("invalid-input"),((c=(p=e.charCodeAt(i++))-48<10?p-22:p-65<26?p-65:p-97<26?p-97:36)>=36||c>h((l-y)/a))&&m("overflow"),y+=c*a,!(c<(u=s<=C?1:s>=C+26?26:s-C));s+=36)a>h(l/(d=36-u))&&m("overflow"),a*=d;C=I(y-r,t=g.length+1,0==r),h(y/t)>l-A&&m("overflow"),A+=h(y/t),y%=t,g.splice(y++,0,A)}return v(g)}function _(e){var t,n,o,i,r,a,s,c,u,d,p,f,y,v,b,w=[];for(f=(e=A(e)).length,t=128,n=0,r=72,a=0;a=t&&ph((l-n)/(y=o+1))&&m("overflow"),n+=(s-t)*y,t=s,a=0;al&&m("overflow"),p==t){for(c=n,u=36;!(c<(d=u<=r?1:u>=r+26?26:u-r));u+=36)b=c-d,v=36-d,w.push(g(C(d+b%v,0))),c=h(b/v);w.push(g(C(c,0))),r=I(n,y,o==i),n=0,++o}++n,++t}return w.join("")}if(a={version:"1.3.2",ucs2:{decode:A,encode:v},decode:w,encode:_,toASCII:function(e){return y(e,(function(e){return u.test(e)?"xn--"+_(e):e}))},toUnicode:function(e){return y(e,(function(e){return c.test(e)?w(e.slice(4).toLowerCase()):e}))}},o&&i)if(e.exports==o)i.exports=a;else for(s in a)a.hasOwnProperty(s)&&(o[s]=a[s]);else n.punycode=a}(E)})),P=function(e){return"string"==typeof e},x=function(e){return"object"===b(e)&&null!==e},k=function(e){return null===e},G=function(e){return null==e};function R(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var T=function(e,t,n,o){t=t||"&",n=n||"=";var i={};if("string"!=typeof e||0===e.length)return i;var r=/\+/g;e=e.split(t);var a=1e3;o&&"number"==typeof o.maxKeys&&(a=o.maxKeys);var s=e.length;a>0&&s>a&&(s=a);for(var l=0;l=0?(c=h.substr(0,g),u=h.substr(g+1)):(c=h,u=""),d=decodeURIComponent(c),p=decodeURIComponent(u),R(i,d)?Array.isArray(i[d])?i[d].push(p):i[d]=[i[d],p]:i[d]=p}return i},O=function(e){switch(b(e)){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}},L=function(e,t,n,o){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"===b(e)?Object.keys(e).map((function(o){var i=encodeURIComponent(O(o))+n;return Array.isArray(e[o])?e[o].map((function(e){return i+encodeURIComponent(O(e))})).join(t):i+encodeURIComponent(O(e[o]))})).join(t):o?encodeURIComponent(O(o))+n+encodeURIComponent(O(e)):""},D=_((function(e,t){t.decode=t.parse=T,t.encode=t.stringify=L}));function N(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var j=/^([a-z0-9.+-]+:)/i,U=/:[0-9]*$/,B=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,F=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),z=["'"].concat(F),V=["%","/","?",";","#"].concat(z),q=["/","?","#"],W=/^[+a-z0-9A-Z_-]{0,63}$/,H=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,Y={javascript:!0,"javascript:":!0},J={javascript:!0,"javascript:":!0},Z={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function K(e,t,n){if(e&&x(e)&&e instanceof N)return e;var o=new N;return o.parse(e,t,n),o}N.prototype.parse=function(e,t,n){if(!P(e))throw new TypeError("Parameter 'url' must be a string, not "+b(e));var o=e.indexOf("?"),i=-1!==o&&o127?C+="x":C+=v[I];if(!C.match(W)){var E=y.slice(0,g),_=y.slice(g+1),S=v.match(H);S&&(E.push(S[1]),_.unshift(S[2])),_.length&&(a="/"+_.join(".")+a),this.hostname=E.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),f||(this.hostname=M.toASCII(this.hostname));var x=this.port?":"+this.port:"",k=this.hostname||"";this.host=k+x,this.href+=this.host,f&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==a[0]&&(a="/"+a))}if(!Y[c])for(g=0,A=z.length;g0)&&n.host.split("@"))&&(n.auth=_.shift(),n.host=n.hostname=_.shift());return n.search=e.search,n.query=e.query,k(n.pathname)&&k(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!v.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var I=v.slice(-1)[0],b=(n.host||e.host||v.length>1)&&("."===I||".."===I)||""===I,w=0,E=v.length;E>=0;E--)"."===(I=v[E])?v.splice(E,1):".."===I?(v.splice(E,1),w++):w&&(v.splice(E,1),w--);if(!y&&!A)for(;w--;w)v.unshift("..");!y||""===v[0]||v[0]&&"/"===v[0].charAt(0)||v.unshift(""),b&&"/"!==v.join("/").substr(-1)&&v.push("");var _,S=""===v[0]||v[0]&&"/"===v[0].charAt(0);C&&(n.hostname=n.host=S?"":v.length?v.shift():"",(_=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=_.shift(),n.host=n.hostname=_.shift()));return(y=y||n.host&&v.length)&&!S&&v.unshift(""),v.length?n.pathname=v.join("/"):(n.pathname=null,n.path=null),k(n.pathname)&&k(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},N.prototype.parseHost=function(){var e=this.host,t=U.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};function X(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:[];p(this,e),this.parent=t,this.bindings={};var o,i=v(n);try{for(i.s();!(o=i.n()).done;){var r=a(o.value,2),s=r[0],l=r[1];this.bindings[s]=l}}catch(e){i.e(e)}finally{i.f()}}return u(e,[{key:"concat",value:function(t){return new e(this,t)}},{key:"get",value:function(e){if(this.bindings[e])return this.bindings[e];if(this.parent)return this.parent.get(e);throw new Error("".concat(e," not found in scope."))}},{key:"has",value:function(e){return!!this.bindings[e]||!!this.parent&&this.parent.has(e)}}])}(),ee={kind:"null"},te={kind:"number"},ne={kind:"string"},oe={kind:"boolean"},ie={kind:"color"},re={kind:"object"},ae={kind:"value"},se={kind:"collator"},le={kind:"formatted"},ce={kind:"resolvedImage"};function ue(e,t){return{kind:"array",itemType:e,N:t}}function de(e){if("array"===e.kind){var t=de(e.itemType);return"number"==typeof e.N?"array<".concat(t,", ").concat(e.N,">"):"value"===e.itemType.kind?"array":"array<".concat(t,">")}return e.kind}var pe=[ee,te,ne,oe,ie,le,re,ue(ae),ce];function he(e,t){if("error"===t.kind)return null;if("array"===e.kind){if("array"===t.kind&&(0===t.N&&"value"===t.itemType.kind||!he(e.itemType,t.itemType))&&("number"!=typeof e.N||e.N===t.N))return null}else{if(e.kind===t.kind)return null;if("value"===e.kind)for(var n=0,o=pe;n255?255:e}function i(e){return e<0?0:e>1?1:e}function r(e){return"%"===e[e.length-1]?o(parseFloat(e)/100*255):o(parseInt(e))}function a(e){return"%"===e[e.length-1]?i(parseFloat(e)/100):i(parseFloat(e))}function s(e,t,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?e+(t-e)*n*6:2*n<1?t:3*n<2?e+(t-e)*(2/3-n)*6:e}try{t.parseCSSColor=function(e){var t,i=e.replace(/ /g,"").toLowerCase();if(i in n)return n[i].slice();if("#"===i[0])return 4===i.length?(t=parseInt(i.substr(1),16))>=0&&t<=4095?[(3840&t)>>4|(3840&t)>>8,240&t|(240&t)>>4,15&t|(15&t)<<4,1]:null:7===i.length&&(t=parseInt(i.substr(1),16))>=0&&t<=16777215?[(16711680&t)>>16,(65280&t)>>8,255&t,1]:null;var l=i.indexOf("("),c=i.indexOf(")");if(-1!==l&&c+1===i.length){var u=i.substr(0,l),d=i.substr(l+1,c-(l+1)).split(","),p=1;switch(u){case"rgba":if(4!==d.length)return null;p=a(d.pop());case"rgb":return 3!==d.length?null:[r(d[0]),r(d[1]),r(d[2]),p];case"hsla":if(4!==d.length)return null;p=a(d.pop());case"hsl":if(3!==d.length)return null;var h=(parseFloat(d[0])%360+360)%360/360,g=a(d[1]),m=a(d[2]),f=m<=.5?m*(g+1):m+g-m*g,y=2*m-f;return[o(255*s(y,f,h+1/3)),o(255*s(y,f,h)),o(255*s(y,f,h-1/3)),p];default:return null}}return null}}catch(e){}})),ye=function(){function e(t,n,o){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;p(this,e),this.r=t,this.g=n,this.b=o,this.a=i}return u(e,[{key:"toString",value:function(){var e=a(this.toArray(),4),t=e[0],n=e[1],o=e[2],i=e[3];return"rgba(".concat(Math.round(t),",").concat(Math.round(n),",").concat(Math.round(o),",").concat(i,")")}},{key:"toArray",value:function(){var e=this.r,t=this.g,n=this.b,o=this.a;return 0===o?[0,0,0,0]:[255*e/o,255*t/o,255*n/o,o]}}],[{key:"parse",value:function(t){if(t){if(t instanceof e)return t;if("string"==typeof t){var n=fe.parseCSSColor(t);if(n)return new e(n[0]/255*n[3],n[1]/255*n[3],n[2]/255*n[3],n[3])}}}}])}();ye.black=new ye(0,0,0,1),ye.white=new ye(1,1,1,1),ye.transparent=new ye(0,0,0,0),ye.red=new ye(1,0,0,1),ye.blue=new ye(0,0,1,1);var Ae=function(){return u((function e(t,n,o){p(this,e),this.sensitivity=t?n?"variant":"case":n?"accent":"base",this.locale=o,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"})}),[{key:"compare",value:function(e,t){return this.collator.compare(e,t)}},{key:"resolvedLocale",value:function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale}}])}(),ve=u((function e(t,n,o,i,r){p(this,e),this.text=t,this.image=n,this.scale=o,this.fontStack=i,this.textColor=r})),Ce=function(){function e(t){p(this,e),this.sections=t}return u(e,[{key:"isEmpty",value:function(){return 0===this.sections.length||!this.sections.some((function(e){return 0!==e.text.length||e.image&&0!==e.image.name.length}))}},{key:"toString",value:function(){return 0===this.sections.length?"":this.sections.map((function(e){return e.text})).join("")}},{key:"serialize",value:function(){var e,t=["format"],n=v(this.sections);try{for(n.s();!(e=n.n()).done;){var o=e.value;if(o.image)t.push(["image",o.image.name]);else{t.push(o.text);var i={};o.fontStack&&(i["text-font"]=["literal",o.fontStack.split(",")]),o.scale&&(i["font-scale"]=o.scale),o.textColor&&(i["text-color"]=["rgba"].concat(o.textColor.toArray())),t.push(i)}}}catch(e){n.e(e)}finally{n.f()}return t}}],[{key:"fromString",value:function(t){return new e([new ve(t,null,null,null,null)])}},{key:"factory",value:function(t){return t instanceof e?t:e.fromString(t)}}])}(),Ie=function(){function e(t){p(this,e),this.name=t.name,this.available=t.available}return u(e,[{key:"toString",value:function(){return this.name}},{key:"serialize",value:function(){return["image",this.name]}}],[{key:"fromString",value:function(t){return t?new e({name:t,available:!1}):null}}])}();function be(e,t,n,o){return"number"==typeof e&&e>=0&&e<=255&&"number"==typeof t&&t>=0&&t<=255&&"number"==typeof n&&n>=0&&n<=255?void 0===o||"number"==typeof o&&o>=0&&o<=1?null:"Invalid rgba value [".concat([e,t,n,o].join(", "),"]: 'a' must be between 0 and 1."):"Invalid rgba value [".concat(("number"==typeof o?[e,t,n,o]:[e,t,n]).join(", "),"]: 'r', 'g', and 'b' must be between 0 and 255.")}function we(e){if(null===e)return!0;if("string"==typeof e)return!0;if("boolean"==typeof e)return!0;if("number"==typeof e)return!0;if(e instanceof ye)return!0;if(e instanceof Ae)return!0;if(e instanceof Ce)return!0;if(e instanceof Ie)return!0;if(Array.isArray(e)){var t,n=v(e);try{for(n.s();!(t=n.n()).done;){if(!we(t.value))return!1}}catch(e){n.e(e)}finally{n.f()}return!0}if("object"===b(e)){for(var o in e)if(!we(e[o]))return!1;return!0}return!1}function Ee(e){if(null===e)return ee;if("string"==typeof e)return ne;if("boolean"==typeof e)return oe;if("number"==typeof e)return te;if(e instanceof ye)return ie;if(e instanceof Ae)return se;if(e instanceof Ce)return le;if(e instanceof Ie)return ce;if(Array.isArray(e)){var t,n,o=e.length,i=v(e);try{for(i.s();!(n=i.n()).done;){var r=Ee(n.value);if(t){if(t===r)continue;t=ae;break}t=r}}catch(e){i.e(e)}finally{i.f()}return ue(t||ae,o)}return re}function _e(e){var t=b(e);return null===e?"":"string"===t||"number"===t||"boolean"===t?String(e):e instanceof ye||e instanceof Ce||e instanceof Ie?e.toString():JSON.stringify(e)}var Se=function(){function e(t,n){p(this,e),this.type=t,this.value=n}return u(e,[{key:"evaluate",value:function(){return this.value}},{key:"eachChild",value:function(){}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){return"array"===this.type.kind||"object"===this.type.kind?["literal",this.value]:this.value instanceof ye?["rgba"].concat(this.value.toArray()):this.value instanceof Ce?this.value.serialize():this.value}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("'literal' expression requires exactly one argument, but found ".concat(t.length-1," instead."));if(!we(t[1]))return n.error("invalid value");var o=t[1],i=Ee(o),r=n.expectedType;return"array"!==i.kind||0!==i.N||!r||"array"!==r.kind||"number"==typeof r.N&&0!==r.N||(i=r),new e(i,o)}}])}(),Me=function(){return u((function e(t){p(this,e),this.name="ExpressionEvaluationError",this.message=t}),[{key:"toJSON",value:function(){return this.message}}])}(),Pe={string:ne,number:te,boolean:oe,object:re},xe=function(){function e(t,n){p(this,e),this.type=t,this.args=n}return u(e,[{key:"evaluate",value:function(e){for(var t=0;t1)&&t.push(o)}}return t.concat(this.args.map((function(e){return e.serialize()})))}}],[{key:"parse",value:function(t,n){if(t.length<2)return n.error("Expected at least one argument.");var o,i=1,r=t[0];if("array"===r){var a,s;if(t.length>2){var l=t[1];if("string"!=typeof l||!(l in Pe)||"object"===l)return n.error('The item type argument of "array" must be one of string, number, boolean',1);a=Pe[l],i++}else a=ae;if(t.length>3){if(null!==t[2]&&("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return n.error('The length argument to "array" must be a positive integer literal',2);s=t[2],i++}o=ue(a,s)}else o=Pe[r];for(var c=[];i-1),n}},{key:"eachChild",value:function(e){e(this.input)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){return["image",this.input.serialize()]}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("Expected two arguments.");var o=n.parse(t[1],1,ne);return o?new e(o):n.error("No image name provided.")}}])}(),Re={"to-boolean":oe,"to-color":ie,"to-number":te,"to-string":ne},Te=function(){function e(t,n){p(this,e),this.type=t,this.args=n}return u(e,[{key:"evaluate",value:function(e){if("boolean"===this.type.kind)return Boolean(this.args[0].evaluate(e));if("color"===this.type.kind){var t,n,o,i=v(this.args);try{for(i.s();!(o=i.n()).done;){if(t=o.value.evaluate(e),n=null,t instanceof ye)return t;if("string"==typeof t){var r=e.parseColor(t);if(r)return r}else if(Array.isArray(t)&&!(n=t.length<3||t.length>4?"Invalid rbga value ".concat(JSON.stringify(t),": expected an array containing either three or four numeric values."):be(t[0],t[1],t[2],t[3])))return new ye(t[0]/255,t[1]/255,t[2]/255,t[3])}}catch(e){i.e(e)}finally{i.f()}throw new Me(n||"Could not parse color from value '".concat("string"==typeof t?t:String(JSON.stringify(t)),"'"))}if("number"===this.type.kind){var a,s=null,l=v(this.args);try{for(l.s();!(a=l.n()).done;){if(null===(s=a.value.evaluate(e)))return 0;var c=Number(s);if(!isNaN(c))return c}}catch(e){l.e(e)}finally{l.f()}throw new Me("Could not convert ".concat(JSON.stringify(s)," to number."))}return"formatted"===this.type.kind?Ce.fromString(_e(this.args[0].evaluate(e))):"resolvedImage"===this.type.kind?Ie.fromString(_e(this.args[0].evaluate(e))):_e(this.args[0].evaluate(e))}},{key:"eachChild",value:function(e){this.args.forEach(e)}},{key:"outputDefined",value:function(){return this.args.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){if("formatted"===this.type.kind)return new ke([{content:this.args[0],scale:null,font:null,textColor:null}]).serialize();if("resolvedImage"===this.type.kind)return new Ge(this.args[0]).serialize();var e=["to-".concat(this.type.kind)];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(t.length<2)return n.error("Expected at least one argument.");var o=t[0];if(("to-boolean"===o||"to-string"===o)&&2!==t.length)return n.error("Expected one argument.");for(var i=Re[o],r=[],a=1;a=t[2])&&(!(e[1]<=t[1])&&!(e[3]>=t[3])))}function Be(e,t){var n,o=(180+e[0])/360,i=(n=e[1],(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+n*Math.PI/360)))/360),r=Math.pow(2,t.z);return[Math.round(o*r*8192),Math.round(i*r*8192)]}function Fe(e,t,n){return t[1]>e[1]!=n[1]>e[1]&&e[0]<(n[0]-t[0])*(e[1]-t[1])/(n[1]-t[1])+t[0]}function ze(e,t){for(var n,o,i,r,a,s,l,c=!1,u=0,d=t.length;u0&&d<0||u<0&&d>0}function We(e,t,n){var o,i,r,a,s,l,c,u,d,p=v(n);try{for(p.s();!(o=p.n()).done;)for(var h=o.value,g=0;gn[2]){var i=.5*o,r=e[0]-n[0]>i?-o:n[0]-e[0]>i?o:0;0===r&&(r=e[0]-n[2]>i?-o:n[2]-e[0]>i?o:0),e[0]+=r}je(t,e)}function Xe(e,t,n,o){var i,r=8192*Math.pow(2,o.z),a=[8192*o.x,8192*o.y],s=[],l=v(e);try{for(l.s();!(i=l.n()).done;){var c,u=v(i.value);try{for(u.s();!(c=u.n()).done;){var d=c.value,p=[d.x+a[0],d.y+a[1]];Ke(p,t,n,r),s.push(p)}}catch(e){u.e(e)}finally{u.f()}}}catch(e){l.e(e)}finally{l.f()}return s}function Qe(e,t,n,o){var i,r,a=8192*Math.pow(2,o.z),s=[8192*o.x,8192*o.y],l=[],c=v(e);try{for(c.s();!(i=c.n()).done;){var u,d=i.value,p=[],h=v(d);try{for(h.s();!(u=h.n()).done;){var g=u.value,m=[g.x+s[0],g.y+s[1]];je(t,m),p.push(m)}}catch(e){h.e(e)}finally{h.f()}l.push(p)}}catch(e){c.e(e)}finally{c.f()}if(t[2]-t[0]<=a/2){(r=t)[0]=r[1]=1/0,r[2]=r[3]=-1/0;var f,y=v(l);try{for(y.s();!(f=y.n()).done;){var A,C=v(f.value);try{for(C.s();!(A=C.n()).done;){Ke(A.value,t,n,a)}}catch(e){C.e(e)}finally{C.f()}}}catch(e){y.e(e)}finally{y.f()}}return l}var $e=function(){function e(t,n){p(this,e),this.type=oe,this.geojson=t,this.geometries=n}return u(e,[{key:"evaluate",value:function(e){if(null!=e.geometry()&&null!=e.canonicalID()){if("Point"===e.geometryType())return function(e,t){var n=[1/0,1/0,-1/0,-1/0],o=[1/0,1/0,-1/0,-1/0],i=e.canonicalID();if("Polygon"===t.type){var r=Je(t.coordinates,o,i),a=Xe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var s,l=v(a);try{for(l.s();!(s=l.n()).done;){if(!ze(s.value,r))return!1}}catch(e){l.e(e)}finally{l.f()}}if("MultiPolygon"===t.type){var c=Ze(t.coordinates,o,i),u=Xe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var d,p=v(u);try{for(p.s();!(d=p.n()).done;){if(!Ve(d.value,c))return!1}}catch(e){p.e(e)}finally{p.f()}}return!0}(e,this.geometries);if("LineString"===e.geometryType())return function(e,t){var n=[1/0,1/0,-1/0,-1/0],o=[1/0,1/0,-1/0,-1/0],i=e.canonicalID();if("Polygon"===t.type){var r=Je(t.coordinates,o,i),a=Qe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var s,l=v(a);try{for(l.s();!(s=l.n()).done;){if(!He(s.value,r))return!1}}catch(e){l.e(e)}finally{l.f()}}if("MultiPolygon"===t.type){var c=Ze(t.coordinates,o,i),u=Qe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var d,p=v(u);try{for(p.s();!(d=p.n()).done;){if(!Ye(d.value,c))return!1}}catch(e){p.e(e)}finally{p.f()}}return!0}(e,this.geometries)}return!1}},{key:"eachChild",value:function(){}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){return["within",this.geojson]}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("'within' expression requires exactly one argument, but found ".concat(t.length-1," instead."));if(we(t[1])){var o=t[1];if("FeatureCollection"===o.type)for(var i=0;i=0)return!1;var n=!0;return e.eachChild((function(e){n&&!nt(e,t)&&(n=!1)})),n}var ot=function(){function e(t,n){p(this,e),this.type=n.type,this.name=t,this.boundExpression=n}return u(e,[{key:"evaluate",value:function(e){return this.boundExpression.evaluate(e)}},{key:"eachChild",value:function(){}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){return["var",this.name]}}],[{key:"parse",value:function(t,n){if(2!==t.length||"string"!=typeof t[1])return n.error("'var' expression requires exactly one string literal argument.");var o=t[1];return n.scope.has(o)?new e(o,n.scope.get(o)):n.error('Unknown variable "'.concat(o,'". Make sure "').concat(o,'" has been bound in an enclosing "let" expression before using it.'),1)}}])}(),it=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=arguments.length>2?arguments[2]:void 0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:new $,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[];p(this,e),this.registry=t,this.path=n,this.key=n.map((function(e){return"[".concat(e,"]")})).join(""),this.scope=i,this.errors=r,this.expectedType=o}return u(e,[{key:"parse",value:function(e,t,n,o){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};return t?this.concat(t,n,o)._parse(e,i):this._parse(e,i)}},{key:"_parse",value:function(e,t){function n(e,t,n){return"assert"===n?new xe(t,[e]):"coerce"===n?new Te(t,[e]):e}if(null!==e&&"string"!=typeof e&&"boolean"!=typeof e&&"number"!=typeof e||(e=["literal",e]),Array.isArray(e)){if(0===e.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');var o=e[0];if("string"!=typeof o)return this.error("Expression name must be a string, but found ".concat(b(o),' instead. If you wanted a literal array, use ["literal", [...]].'),0),null;var i=this.registry[o];if(i){var r=i.parse(e,this);if(!r)return null;if(this.expectedType){var a=this.expectedType,s=r.type;if("string"!==a.kind&&"number"!==a.kind&&"boolean"!==a.kind&&"object"!==a.kind&&"array"!==a.kind||"value"!==s.kind)if("color"!==a.kind&&"formatted"!==a.kind&&"resolvedImage"!==a.kind||"value"!==s.kind&&"string"!==s.kind){if(this.checkSubtype(a,s))return null}else r=n(r,a,t.typeAnnotation||"coerce");else r=n(r,a,t.typeAnnotation||"assert")}if(!(r instanceof Se)&&"resolvedImage"!==r.type.kind&&function e(t){if(t instanceof ot)return e(t.boundExpression);if(t instanceof De&&"error"===t.name)return!1;if(t instanceof Ne)return!1;if(t instanceof $e)return!1;var n=t instanceof Te||t instanceof xe,o=!0;if(t.eachChild((function(t){o=n?o&&e(t):o&&t instanceof Se})),!o)return!1;return et(t)&&nt(t,["zoom","heatmap-density","line-progress","sky-radial-progress","accumulated","is-supported-script"])}(r)){var l=new Le;try{r=new Se(r.type,r.evaluate(l))}catch(e){return this.error(e.message),null}}return r}return this.error('Unknown expression "'.concat(o,'". If you wanted a literal array, use ["literal", [...]].'),0)}return void 0===e?this.error("'undefined' value invalid. Use null instead."):"object"===b(e)?this.error('Bare objects invalid. Use ["literal", {...}] instead.'):this.error("Expected an array, but found ".concat(b(e)," instead."))}},{key:"concat",value:function(t,n,o){var i="number"==typeof t?this.path.concat(t):this.path,r=o?this.scope.concat(o):this.scope;return new e(this.registry,i,n||null,r,this.errors)}},{key:"error",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;ot))throw new Me("Input is not a number.");a=s-1}return 0}var at=function(){function e(t,n,o){p(this,e),this.type=t,this.input=n,this.labels=[],this.outputs=[];var i,r=v(o);try{for(r.s();!(i=r.n()).done;){var s=a(i.value,2),l=s[0],c=s[1];this.labels.push(l),this.outputs.push(c)}}catch(e){r.e(e)}finally{r.f()}}return u(e,[{key:"evaluate",value:function(e){var t=this.labels,n=this.outputs;if(1===t.length)return n[0].evaluate(e);var o=this.input.evaluate(e);if(o<=t[0])return n[0].evaluate(e);var i=t.length;return o>=t[i-1]?n[i-1].evaluate(e):n[rt(t,o)].evaluate(e)}},{key:"eachChild",value:function(e){e(this.input);var t,n=v(this.outputs);try{for(n.s();!(t=n.n()).done;){e(t.value)}}catch(e){n.e(e)}finally{n.f()}}},{key:"outputDefined",value:function(){return this.outputs.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){for(var e=["step",this.input.serialize()],t=0;t0&&e.push(this.labels[t]),e.push(this.outputs[t].serialize());return e}}],[{key:"parse",value:function(t,n){if(t.length-1<4)return n.error("Expected at least 4 arguments, but found only ".concat(t.length-1,"."));if((t.length-1)%2!=0)return n.error("Expected an even number of arguments.");var o=n.parse(t[1],1,te);if(!o)return null;var i=[],r=null;n.expectedType&&"value"!==n.expectedType.kind&&(r=n.expectedType);for(var a=1;a=s)return n.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',c);var d=n.parse(l,u,r);if(!d)return null;r=r||d.type,i.push([s,d])}return new e(r,o,i)}}])}(),st=lt;function lt(e,t,n,o){this.cx=3*e,this.bx=3*(n-e)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*t,this.by=3*(o-t)-this.cy,this.ay=1-this.cy-this.by,this.p1x=e,this.p1y=o,this.p2x=n,this.p2y=o}function ct(e,t,n){return e*(1-n)+t*n}lt.prototype.sampleCurveX=function(e){return((this.ax*e+this.bx)*e+this.cx)*e},lt.prototype.sampleCurveY=function(e){return((this.ay*e+this.by)*e+this.cy)*e},lt.prototype.sampleCurveDerivativeX=function(e){return(3*this.ax*e+2*this.bx)*e+this.cx},lt.prototype.solveCurveX=function(e,t){var n,o,i,r,a;for(void 0===t&&(t=1e-6),i=e,a=0;a<8;a++){if(r=this.sampleCurveX(i)-e,Math.abs(r)(o=1))return o;for(;nr?n=i:o=i,i=.5*(o-n)+n}return i},lt.prototype.solve=function(e,t){return this.sampleCurveY(this.solveCurveX(e,t))};var ut=Object.freeze({__proto__:null,number:ct,color:function(e,t,n){return new ye(ct(e.r,t.r,n),ct(e.g,t.g,n),ct(e.b,t.b,n),ct(e.a,t.a,n))},array:function(e,t,n){return e.map((function(e,o){return ct(e,t[o],n)}))}}),dt=6/29,pt=3*dt*dt,ht=Math.PI/180,gt=180/Math.PI;function mt(e){return e>.008856451679035631?Math.pow(e,1/3):e/pt+4/29}function ft(e){return e>dt?e*e*e:pt*(e-4/29)}function yt(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function At(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function vt(e){var t=At(e.r),n=At(e.g),o=At(e.b),i=mt((.4124564*t+.3575761*n+.1804375*o)/.95047),r=mt((.2126729*t+.7151522*n+.072175*o)/1);return{l:116*r-16,a:500*(i-r),b:200*(r-mt((.0193339*t+.119192*n+.9503041*o)/1.08883)),alpha:e.a}}function Ct(e){var t=(e.l+16)/116,n=isNaN(e.a)?t:t+e.a/500,o=isNaN(e.b)?t:t-e.b/200;return t=1*ft(t),n=.95047*ft(n),o=1.08883*ft(o),new ye(yt(3.2404542*n-1.5371385*t-.4985314*o),yt(-.969266*n+1.8760108*t+.041556*o),yt(.0556434*n-.2040259*t+1.0572252*o),e.alpha)}function It(e,t,n){var o=t-e;return e+n*(o>180||o<-180?o-360*Math.round(o/360):o)}var bt={forward:vt,reverse:Ct,interpolate:function(e,t,n){return{l:ct(e.l,t.l,n),a:ct(e.a,t.a,n),b:ct(e.b,t.b,n),alpha:ct(e.alpha,t.alpha,n)}}},wt={forward:function(e){var t=vt(e),n=t.l,o=t.a,i=t.b,r=Math.atan2(i,o)*gt;return{h:r<0?r+360:r,c:Math.sqrt(o*o+i*i),l:n,alpha:e.a}},reverse:function(e){var t=e.h*ht,n=e.c;return Ct({l:e.l,a:Math.cos(t)*n,b:Math.sin(t)*n,alpha:e.alpha})},interpolate:function(e,t,n){return{h:It(e.h,t.h,n),c:ct(e.c,t.c,n),l:ct(e.l,t.l,n),alpha:ct(e.alpha,t.alpha,n)}}},Et=Object.freeze({__proto__:null,lab:bt,hcl:wt}),_t=function(){function e(t,n,o,i,r){p(this,e),this.type=t,this.operator=n,this.interpolation=o,this.input=i,this.labels=[],this.outputs=[];var s,l=v(r);try{for(l.s();!(s=l.n()).done;){var c=a(s.value,2),u=c[0],d=c[1];this.labels.push(u),this.outputs.push(d)}}catch(e){l.e(e)}finally{l.f()}}return u(e,[{key:"evaluate",value:function(t){var n=this.labels,o=this.outputs;if(1===n.length)return o[0].evaluate(t);var i=this.input.evaluate(t);if(i<=n[0])return o[0].evaluate(t);var r=n.length;if(i>=n[r-1])return o[r-1].evaluate(t);var a=rt(n,i),s=n[a],l=n[a+1],c=e.interpolationFactor(this.interpolation,i,s,l),u=o[a].evaluate(t),d=o[a+1].evaluate(t);return"interpolate"===this.operator?ut[this.type.kind.toLowerCase()](u,d,c):"interpolate-hcl"===this.operator?wt.reverse(wt.interpolate(wt.forward(u),wt.forward(d),c)):bt.reverse(bt.interpolate(bt.forward(u),bt.forward(d),c))}},{key:"eachChild",value:function(e){e(this.input);var t,n=v(this.outputs);try{for(n.s();!(t=n.n()).done;){e(t.value)}}catch(e){n.e(e)}finally{n.f()}}},{key:"outputDefined",value:function(){return this.outputs.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){var e;e="linear"===this.interpolation.name?["linear"]:"exponential"===this.interpolation.name?1===this.interpolation.base?["linear"]:["exponential",this.interpolation.base]:["cubic-bezier"].concat(this.interpolation.controlPoints);for(var t=[this.operator,e,this.input.serialize()],n=0;n1})))return n.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);c={name:"cubic-bezier",controlPoints:h}}if(t.length-1<4)return n.error("Expected at least 4 arguments, but found only ".concat(t.length-1,"."));if((t.length-1)%2!=0)return n.error("Expected an even number of arguments.");if(!(u=n.parse(u,2,te)))return null;var g=[],m=null;"interpolate-hcl"===a||"interpolate-lab"===a?m=ie:n.expectedType&&"value"!==n.expectedType.kind&&(m=n.expectedType);for(var f=0;f=y)return n.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',v);var b=n.parse(A,I,m);if(!b)return null;m=m||b.type,g.push([y,b])}return"number"===m.kind||"color"===m.kind||"array"===m.kind&&"number"===m.itemType.kind&&"number"==typeof m.N?new e(m,a,c,u,g):n.error("Type ".concat(de(m)," is not interpolatable."))}}])}();function St(e,t,n,o){var i=o-n,r=e-n;return 0===i?0:1===t?r/i:(Math.pow(t,r)-1)/(Math.pow(t,i)-1)}var Mt=function(){function e(t,n){p(this,e),this.type=t,this.args=n}return u(e,[{key:"evaluate",value:function(e){var t,n,o=null,i=0,r=v(this.args);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(i++,(o=a.evaluate(e))&&o instanceof Ie&&!o.available&&(t||(t=o.name),o=null,i===this.args.length&&(o=t)),null!==o)break}}catch(e){r.e(e)}finally{r.f()}return o}},{key:"eachChild",value:function(e){this.args.forEach(e)}},{key:"outputDefined",value:function(){return this.args.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){var e=["coalesce"];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(t.length<2)return n.error("Expectected at least one argument.");var o=null,i=n.expectedType;i&&"value"!==i.kind&&(o=i);var r,a=[],s=v(t.slice(1));try{for(s.s();!(r=s.n()).done;){var l=r.value,c=n.parse(l,1+a.length,o,void 0,{typeAnnotation:"omit"});if(!c)return null;o=o||c.type,a.push(c)}}catch(e){s.e(e)}finally{s.f()}return new e(i&&a.some((function(e){return he(i,e.type)}))?ae:o,a)}}])}(),Pt=function(){function e(t,n){p(this,e),this.type=n.type,this.bindings=[].concat(t),this.result=n}return u(e,[{key:"evaluate",value:function(e){return this.result.evaluate(e)}},{key:"eachChild",value:function(e){var t,n=v(this.bindings);try{for(n.s();!(t=n.n()).done;){e(t.value[1])}}catch(e){n.e(e)}finally{n.f()}e(this.result)}},{key:"outputDefined",value:function(){return this.result.outputDefined()}},{key:"serialize",value:function(){var e,t=["let"],n=v(this.bindings);try{for(n.s();!(e=n.n()).done;){var o=a(e.value,2),i=o[0],r=o[1];t.push(i,r.serialize())}}catch(e){n.e(e)}finally{n.f()}return t.push(this.result.serialize()),t}}],[{key:"parse",value:function(t,n){if(t.length<4)return n.error("Expected at least 3 arguments, but found ".concat(t.length-1," instead."));for(var o=[],i=1;i=n.length)throw new Me("Array index out of bounds: ".concat(t," > ").concat(n.length-1,"."));if(t!==Math.floor(t))throw new Me("Array index must be an integer, but found ".concat(t," instead."));return n[t]}},{key:"eachChild",value:function(e){e(this.index),e(this.input)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){return["at",this.index.serialize(),this.input.serialize()]}}],[{key:"parse",value:function(t,n){if(3!==t.length)return n.error("Expected 2 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,te),i=n.parse(t[2],2,ue(n.expectedType||ae));return o&&i?new e(i.type.itemType,o,i):null}}])}(),kt=function(){function e(t,n){p(this,e),this.type=oe,this.needle=t,this.haystack=n}return u(e,[{key:"evaluate",value:function(e){var t=this.needle.evaluate(e),n=this.haystack.evaluate(e);if(!n)return!1;if(!me(t,["boolean","string","number","null"]))throw new Me("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(Ee(t))," instead."));if(!me(n,["string","array"]))throw new Me("Expected second argument to be of type array or string, but found ".concat(de(Ee(n))," instead."));return n.indexOf(t)>=0}},{key:"eachChild",value:function(e){e(this.needle),e(this.haystack)}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){return["in",this.needle.serialize(),this.haystack.serialize()]}}],[{key:"parse",value:function(t,n){if(3!==t.length)return n.error("Expected 2 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,ae),i=n.parse(t[2],2,ae);return o&&i?ge(o.type,[oe,ne,te,ee,ae])?new e(o,i):n.error("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(o.type)," instead")):null}}])}(),Gt=function(){function e(t,n,o){p(this,e),this.type=te,this.needle=t,this.haystack=n,this.fromIndex=o}return u(e,[{key:"evaluate",value:function(e){var t=this.needle.evaluate(e),n=this.haystack.evaluate(e);if(!me(t,["boolean","string","number","null"]))throw new Me("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(Ee(t))," instead."));if(!me(n,["string","array"]))throw new Me("Expected second argument to be of type array or string, but found ".concat(de(Ee(n))," instead."));if(this.fromIndex){var o=this.fromIndex.evaluate(e);return n.indexOf(t,o)}return n.indexOf(t)}},{key:"eachChild",value:function(e){e(this.needle),e(this.haystack),this.fromIndex&&e(this.fromIndex)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){if(null!=this.fromIndex&&void 0!==this.fromIndex){var e=this.fromIndex.serialize();return["index-of",this.needle.serialize(),this.haystack.serialize(),e]}return["index-of",this.needle.serialize(),this.haystack.serialize()]}}],[{key:"parse",value:function(t,n){if(t.length<=2||t.length>=5)return n.error("Expected 3 or 4 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,ae),i=n.parse(t[2],2,ae);if(!o||!i)return null;if(!ge(o.type,[oe,ne,te,ee,ae]))return n.error("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(o.type)," instead"));if(4===t.length){var r=n.parse(t[3],3,te);return r?new e(o,i,r):null}return new e(o,i)}}])}(),Rt=function(){function e(t,n,o,i,r,a){p(this,e),this.inputType=t,this.type=n,this.input=o,this.cases=i,this.outputs=r,this.otherwise=a}return u(e,[{key:"evaluate",value:function(e){var t=this.input.evaluate(e);return(Ee(t)===this.inputType&&this.outputs[this.cases[t]]||this.otherwise).evaluate(e)}},{key:"eachChild",value:function(e){e(this.input),this.outputs.forEach(e),e(this.otherwise)}},{key:"outputDefined",value:function(){return this.outputs.every((function(e){return e.outputDefined()}))&&this.otherwise.outputDefined()}},{key:"serialize",value:function(){var e,t=this,n=["match",this.input.serialize()],o=[],i={},r=v(Object.keys(this.cases).sort());try{for(r.s();!(e=r.n()).done;){var s=e.value,l=i[this.cases[s]];void 0===l?(i[this.cases[s]]=o.length,o.push([this.cases[s],[s]])):o[l][1].push(s)}}catch(e){r.e(e)}finally{r.f()}for(var c=function(e){return"number"===t.inputType.kind?Number(e):e},u=0,d=o;uNumber.MAX_SAFE_INTEGER)return u.error("Branch labels must be integers no larger than ".concat(Number.MAX_SAFE_INTEGER,"."));if("number"==typeof h&&Math.floor(h)!==h)return u.error("Numeric branch labels must be integer values.");if(o){if(u.checkSubtype(o,Ee(h)))return null}else o=Ee(h);if(void 0!==r[String(h)])return u.error("Branch labels must be unique.");r[String(h)]=a.length}}catch(e){p.e(e)}finally{p.f()}var g=n.parse(c,s,i);if(!g)return null;i=i||g.type,a.push(g)}var m=n.parse(t[1],1,ae);if(!m)return null;var f=n.parse(t[t.length-1],t.length-1,i);return f?"value"!==m.type.kind&&n.concat(1).checkSubtype(o,m.type)?null:new e(o,i,m,r,a,f):null}}])}(),Tt=function(){function e(t,n,o){p(this,e),this.type=t,this.branches=n,this.otherwise=o}return u(e,[{key:"evaluate",value:function(e){var t,n=v(this.branches);try{for(n.s();!(t=n.n()).done;){var o=a(t.value,2),i=o[0],r=o[1];if(i.evaluate(e))return r.evaluate(e)}}catch(e){n.e(e)}finally{n.f()}return this.otherwise.evaluate(e)}},{key:"eachChild",value:function(e){var t,n=v(this.branches);try{for(n.s();!(t=n.n()).done;){var o=a(t.value,2),i=o[0],r=o[1];e(i),e(r)}}catch(e){n.e(e)}finally{n.f()}e(this.otherwise)}},{key:"outputDefined",value:function(){return this.branches.every((function(e){var t=a(e,2);t[0];return t[1].outputDefined()}))&&this.otherwise.outputDefined()}},{key:"serialize",value:function(){var e=["case"];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(t.length<4)return n.error("Expected at least 3 arguments, but found only ".concat(t.length-1,"."));if(t.length%2!=0)return n.error("Expected an odd number of arguments.");var o;n.expectedType&&"value"!==n.expectedType.kind&&(o=n.expectedType);for(var i=[],r=1;r=5)return n.error("Expected 3 or 4 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,ae),i=n.parse(t[2],2,te);if(!o||!i)return null;if(!ge(o.type,[ue(ae),ne,ae]))return n.error("Expected first argument to be of type array or string, but found ".concat(de(o.type)," instead"));if(4===t.length){var r=n.parse(t[3],3,te);return r?new e(o.type,o,i,r):null}return new e(o.type,o,i)}}])}();function Lt(e,t){return"=="===e||"!="===e?"boolean"===t.kind||"string"===t.kind||"number"===t.kind||"null"===t.kind||"value"===t.kind:"string"===t.kind||"number"===t.kind||"value"===t.kind}function Dt(e,t,n,o){return 0===o.compare(t,n)}function Nt(e,t,n){var o="=="!==e&&"!="!==e;return function(){function i(e,t,n){p(this,i),this.type=oe,this.lhs=e,this.rhs=t,this.collator=n,this.hasUntypedArgument="value"===e.type.kind||"value"===t.type.kind}return u(i,[{key:"evaluate",value:function(i){var r=this.lhs.evaluate(i),a=this.rhs.evaluate(i);if(o&&this.hasUntypedArgument){var s=Ee(r),l=Ee(a);if(s.kind!==l.kind||"string"!==s.kind&&"number"!==s.kind)throw new Me('Expected arguments for "'.concat(e,'" to be (string, string) or (number, number), but found (').concat(s.kind,", ").concat(l.kind,") instead."))}if(this.collator&&!o&&this.hasUntypedArgument){var c=Ee(r),u=Ee(a);if("string"!==c.kind||"string"!==u.kind)return t(i,r,a)}return this.collator?n(i,r,a,this.collator.evaluate(i)):t(i,r,a)}},{key:"eachChild",value:function(e){e(this.lhs),e(this.rhs),this.collator&&e(this.collator)}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){var t=[e];return this.eachChild((function(e){t.push(e.serialize())})),t}}],[{key:"parse",value:function(e,t){if(3!==e.length&&4!==e.length)return t.error("Expected two or three arguments.");var n=e[0],r=t.parse(e[1],1,ae);if(!r)return null;if(!Lt(n,r.type))return t.concat(1).error('"'.concat(n,"\" comparisons are not supported for type '").concat(de(r.type),"'."));var a=t.parse(e[2],2,ae);if(!a)return null;if(!Lt(n,a.type))return t.concat(2).error('"'.concat(n,"\" comparisons are not supported for type '").concat(de(a.type),"'."));if(r.type.kind!==a.type.kind&&"value"!==r.type.kind&&"value"!==a.type.kind)return t.error("Cannot compare types '".concat(de(r.type),"' and '").concat(de(a.type),"'."));o&&("value"===r.type.kind&&"value"!==a.type.kind?r=new xe(a.type,[r]):"value"!==r.type.kind&&"value"===a.type.kind&&(a=new xe(r.type,[a])));var s=null;if(4===e.length){if("string"!==r.type.kind&&"string"!==a.type.kind&&"value"!==r.type.kind&&"value"!==a.type.kind)return t.error("Cannot use collator to compare non-string types.");if(!(s=t.parse(e[3],3,se)))return null}return new i(r,a,s)}}])}()}var jt=Nt("==",(function(e,t,n){return t===n}),Dt),Ut=Nt("!=",(function(e,t,n){return t!==n}),(function(e,t,n,o){return!Dt(0,t,n,o)})),Bt=Nt("<",(function(e,t,n){return t",(function(e,t,n){return t>n}),(function(e,t,n,o){return o.compare(t,n)>0})),zt=Nt("<=",(function(e,t,n){return t<=n}),(function(e,t,n,o){return o.compare(t,n)<=0})),Vt=Nt(">=",(function(e,t,n){return t>=n}),(function(e,t,n,o){return o.compare(t,n)>=0})),qt=function(){function e(t,n,o,i,r){p(this,e),this.type=ne,this.number=t,this.locale=n,this.currency=o,this.minFractionDigits=i,this.maxFractionDigits=r}return u(e,[{key:"evaluate",value:function(e){return new Intl.NumberFormat(this.locale?this.locale.evaluate(e):[],{style:this.currency?"currency":"decimal",currency:this.currency?this.currency.evaluate(e):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(e):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(e):void 0}).format(this.number.evaluate(e))}},{key:"eachChild",value:function(e){e(this.number),this.locale&&e(this.locale),this.currency&&e(this.currency),this.minFractionDigits&&e(this.minFractionDigits),this.maxFractionDigits&&e(this.maxFractionDigits)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){var e={};return this.locale&&(e.locale=this.locale.serialize()),this.currency&&(e.currency=this.currency.serialize()),this.minFractionDigits&&(e["min-fraction-digits"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(e["max-fraction-digits"]=this.maxFractionDigits.serialize()),["number-format",this.number.serialize(),e]}}],[{key:"parse",value:function(t,n){if(3!==t.length)return n.error("Expected two arguments.");var o=n.parse(t[1],1,te);if(!o)return null;var i=t[2];if("object"!==b(i)||Array.isArray(i))return n.error("NumberFormat options argument must be an object.");var r=null;if(i.locale&&!(r=n.parse(i.locale,1,ne)))return null;var a=null;if(i.currency&&!(a=n.parse(i.currency,1,ne)))return null;var s=null;if(i["min-fraction-digits"]&&!(s=n.parse(i["min-fraction-digits"],1,te)))return null;var l=null;return i["max-fraction-digits"]&&!(l=n.parse(i["max-fraction-digits"],1,te))?null:new e(o,r,a,s,l)}}])}(),Wt={"==":jt,"!=":Ut,">":Ft,"<":Bt,">=":Vt,"<=":zt,array:xe,at:xt,boolean:xe,case:Tt,coalesce:Mt,collator:Ne,format:ke,image:Ge,in:kt,"index-of":Gt,interpolate:_t,"interpolate-hcl":_t,"interpolate-lab":_t,length:function(){function e(t){p(this,e),this.type=te,this.input=t}return u(e,[{key:"evaluate",value:function(e){var t=this.input.evaluate(e);if("string"==typeof t)return t.length;if(Array.isArray(t))return t.length;throw new Me("Expected value to be of type string or array, but found ".concat(de(Ee(t))," instead."))}},{key:"eachChild",value:function(e){e(this.input)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){var e=["length"];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("Expected 1 argument, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1);return o?"array"!==o.type.kind&&"string"!==o.type.kind&&"value"!==o.type.kind?n.error("Expected argument of type string or array, but found ".concat(de(o.type)," instead.")):new e(o):null}}])}(),let:Pt,literal:Se,match:Rt,number:xe,"number-format":qt,object:xe,slice:Ot,step:at,string:xe,"to-boolean":Te,"to-color":Te,"to-number":Te,"to-string":Te,var:ot,within:$e};function Ht(e,t){var n=a(t,4),o=n[0],i=n[1],r=n[2],s=n[3];o=o.evaluate(e),i=i.evaluate(e),r=r.evaluate(e);var l=s?s.evaluate(e):1,c=be(o,i,r,l);if(c)throw new Me(c);return new ye(o/255*l,i/255*l,r/255*l,l)}function Yt(e,t){return e in t}function Jt(e,t){var n=t[e];return void 0===n?null:n}function Zt(e){return{type:e}}function Kt(e){return{result:"success",value:e}}function Xt(e){return{result:"error",value:e}}function Qt(e){return"data-driven"===e["property-type"]||"cross-faded-data-driven"===e["property-type"]}function $t(e){return!!e.expression&&e.expression.parameters.indexOf("zoom")>-1}function en(e){return!!e.expression&&e.expression.interpolated}function tn(e){return e instanceof Number?"number":e instanceof String?"string":e instanceof Boolean?"boolean":Array.isArray(e)?"array":null===e?"null":b(e)}function nn(e){return"object"===b(e)&&null!==e&&!Array.isArray(e)}function on(e){return e}function rn(e,t){var n,o,i,r="color"===t.type,a=e.stops&&"object"===b(e.stops[0][0]),s=a||void 0!==e.property,l=a||!s,c=e.type||(en(t)?"exponential":"interval");if(r&&((e=X({},e)).stops&&(e.stops=e.stops.map((function(e){return[e[0],ye.parse(e[1])]}))),e.default?e.default=ye.parse(e.default):e.default=ye.parse(t.default)),e.colorSpace&&"rgb"!==e.colorSpace&&!Et[e.colorSpace])throw new Error("Unknown color space: ".concat(e.colorSpace));if("exponential"===c)n=cn;else if("interval"===c)n=ln;else if("categorical"===c){n=sn,o=Object.create(null);var u,d=v(e.stops);try{for(d.s();!(u=d.n()).done;){var p=u.value;o[p[0]]=p[1]}}catch(e){d.e(e)}finally{d.f()}i=b(e.stops[0][0])}else{if("identity"!==c)throw new Error('Unknown function type "'.concat(c,'"'));n=un}if(a){for(var h={},g=[],m=0;m=e.stops[o-1][0])return e.stops[o-1][1];var i=rt(e.stops.map((function(e){return e[0]})),n);return e.stops[i][1]}function cn(e,t,n){var o=void 0!==e.base?e.base:1;if("number"!==tn(n))return an(e.default,t.default);var i=e.stops.length;if(1===i)return e.stops[0][1];if(n<=e.stops[0][0])return e.stops[0][1];if(n>=e.stops[i-1][0])return e.stops[i-1][1];var r=rt(e.stops.map((function(e){return e[0]})),n),a=function(e,t,n,o){var i=o-n,r=e-n;return 0===i?0:1===t?r/i:(Math.pow(t,r)-1)/(Math.pow(t,i)-1)}(n,o,e.stops[r][0],e.stops[r+1][0]),s=e.stops[r][1],l=e.stops[r+1][1],c=ut[t.type]||on;if(e.colorSpace&&"rgb"!==e.colorSpace){var u=Et[e.colorSpace];c=function(e,t){return u.reverse(u.interpolate(u.forward(e),u.forward(t),a))}}return"function"==typeof s.evaluate?{evaluate:function(){for(var e=arguments.length,t=new Array(e),n=0;n":[oe,[ne,ae],function(e,t){var n=a(t,2),o=n[0],i=n[1],r=e.properties()[o.value],s=i.value;return b(r)===b(s)&&r>s}],"filter-id->":[oe,[ae],function(e,t){var n=a(t,1)[0],o=e.id(),i=n.value;return b(o)===b(i)&&o>i}],"filter-<=":[oe,[ne,ae],function(e,t){var n=a(t,2),o=n[0],i=n[1],r=e.properties()[o.value],s=i.value;return b(r)===b(s)&&r<=s}],"filter-id-<=":[oe,[ae],function(e,t){var n=a(t,1)[0],o=e.id(),i=n.value;return b(o)===b(i)&&o<=i}],"filter->=":[oe,[ne,ae],function(e,t){var n=a(t,2),o=n[0],i=n[1],r=e.properties()[o.value],s=i.value;return b(r)===b(s)&&r>=s}],"filter-id->=":[oe,[ae],function(e,t){var n=a(t,1)[0],o=e.id(),i=n.value;return b(o)===b(i)&&o>=i}],"filter-has":[oe,[ae],function(e,t){return a(t,1)[0].value in e.properties()}],"filter-has-id":[oe,[],function(e){return null!==e.id()&&void 0!==e.id()}],"filter-type-in":[oe,[ue(ne)],function(e,t){return a(t,1)[0].value.indexOf(e.geometryType())>=0}],"filter-id-in":[oe,[ue(ae)],function(e,t){return a(t,1)[0].value.indexOf(e.id())>=0}],"filter-in-small":[oe,[ne,ue(ae)],function(e,t){var n=a(t,2),o=n[0];return n[1].value.indexOf(e.properties()[o.value])>=0}],"filter-in-large":[oe,[ne,ue(ae)],function(e,t){var n=a(t,2),o=n[0],i=n[1];return function(e,t,n,o){for(;n<=o;){var i=n+o>>1;if(t[i]===e)return!0;t[i]>e?o=i-1:n=i+1}return!1}(e.properties()[o.value],i.value,0,i.value.length-1)}],all:{type:oe,overloads:[[[oe,oe],function(e,t){var n=a(t,2),o=n[0],i=n[1];return o.evaluate(e)&&i.evaluate(e)}],[Zt(oe),function(e,t){var n,o=v(t);try{for(o.s();!(n=o.n()).done;){if(!n.value.evaluate(e))return!1}}catch(e){o.e(e)}finally{o.f()}return!0}]]},any:{type:oe,overloads:[[[oe,oe],function(e,t){var n=a(t,2),o=n[0],i=n[1];return o.evaluate(e)||i.evaluate(e)}],[Zt(oe),function(e,t){var n,o=v(t);try{for(o.s();!(n=o.n()).done;){if(n.value.evaluate(e))return!0}}catch(e){o.e(e)}finally{o.f()}return!1}]]},"!":[oe,[oe],function(e,t){return!a(t,1)[0].evaluate(e)}],"is-supported-script":[oe,[ne],function(e,t){var n=a(t,1)[0],o=e.globals&&e.globals.isSupportedScript;return!o||o(n.evaluate(e))}],upcase:[ne,[ne],function(e,t){return a(t,1)[0].evaluate(e).toUpperCase()}],downcase:[ne,[ne],function(e,t){return a(t,1)[0].evaluate(e).toLowerCase()}],concat:[ne,Zt(ae),function(e,t){return t.map((function(t){return _e(t.evaluate(e))})).join("")}],"resolved-locale":[ne,[se],function(e,t){return a(t,1)[0].evaluate(e).resolvedLocale()}]});var dn=function(){return u((function e(t,n){var o;p(this,e),this.expression=t,this._warningHistory={},this._evaluator=new Le,this._defaultValue=n?"color"===(o=n).type&&nn(o.default)?new ye(0,0,0,0):"color"===o.type?ye.parse(o.default)||null:void 0===o.default?null:o.default:null,this._enumValues=n&&"enum"===n.type?n.values:null}),[{key:"evaluateWithoutErrorHandling",value:function(e,t,n,o,i,r){return this._evaluator.globals=e,this._evaluator.feature=t,this._evaluator.featureState=n,this._evaluator.canonical=o,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=r,this.expression.evaluate(this._evaluator)}},{key:"evaluate",value:function(e,t,n,o,i,r){this._evaluator.globals=e,this._evaluator.feature=t||null,this._evaluator.featureState=n||null,this._evaluator.canonical=o,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=r||null;try{var a=this.expression.evaluate(this._evaluator);if(null==a||"number"==typeof a&&a!=a)return this._defaultValue;if(this._enumValues&&!(a in this._enumValues))throw new Me("Expected value to be one of ".concat(Object.keys(this._enumValues).map((function(e){return JSON.stringify(e)})).join(", "),", but found ").concat(JSON.stringify(a)," instead."));return a}catch(e){return this._warningHistory[e.message]||(this._warningHistory[e.message]=!0,"undefined"!=typeof console&&console.warn(e.message)),this._defaultValue}}}])}();function pn(e){return Array.isArray(e)&&e.length>0&&"string"==typeof e[0]&&e[0]in Wt}function hn(e,t){var n=new it(Wt,[],t?function(e){var t={color:ie,string:ne,number:te,enum:ne,boolean:oe,formatted:le,resolvedImage:ce};if("array"===e.type)return ue(t[e.value]||ae,e.length);return t[e.type]}(t):void 0),o=n.parse(e,void 0,void 0,void 0,t&&"string"===t.type?{typeAnnotation:"coerce"}:void 0);return o?Kt(new dn(o,t)):Xt(n.errors)}var gn=function(){return u((function e(t,n){p(this,e),this.kind=t,this._styleExpression=n,this.isStateDependent="constant"!==t&&!tt(n.expression)}),[{key:"evaluateWithoutErrorHandling",value:function(e,t,n,o,i,r){return this._styleExpression.evaluateWithoutErrorHandling(e,t,n,o,i,r)}},{key:"evaluate",value:function(e,t,n,o,i,r){return this._styleExpression.evaluate(e,t,n,o,i,r)}}])}(),mn=function(){return u((function e(t,n,o,i){p(this,e),this.kind=t,this.zoomStops=o,this._styleExpression=n,this.isStateDependent="camera"!==t&&!tt(n.expression),this.interpolationType=i}),[{key:"evaluateWithoutErrorHandling",value:function(e,t,n,o,i,r){return this._styleExpression.evaluateWithoutErrorHandling(e,t,n,o,i,r)}},{key:"evaluate",value:function(e,t,n,o,i,r){return this._styleExpression.evaluate(e,t,n,o,i,r)}},{key:"interpolationFactor",value:function(e,t,n){return this.interpolationType?_t.interpolationFactor(this.interpolationType,e,t,n):0}}])}();function fn(e,t){if("error"===(e=hn(e,t)).result)return e;var n=e.value.expression,o=et(n);if(!o&&!Qt(t))return Xt([new Q("","data expressions not supported")]);var i=nt(n,["zoom"]);if(!i&&!$t(t))return Xt([new Q("","zoom expressions not supported")]);var r=function e(t){var n=null;if(t instanceof Pt)n=e(t.result);else if(t instanceof Mt){var o,i=v(t.args);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(n=e(r))break}}catch(e){i.e(e)}finally{i.f()}}else(t instanceof at||t instanceof _t)&&t.input instanceof De&&"zoom"===t.input.name&&(n=t);if(n instanceof Q)return n;return t.eachChild((function(t){var o=e(t);o instanceof Q?n=o:!n&&o?n=new Q("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'):n&&o&&n!==o&&(n=new Q("",'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'))})),n}(n);if(!r&&!i)return Xt([new Q("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]);if(r instanceof Q)return Xt([r]);if(r instanceof _t&&!en(t))return Xt([new Q("",'"interpolate" expressions cannot be used with this property')]);if(!r)return Kt(new gn(o?"constant":"source",e.value));var a=r instanceof _t?r.interpolation:void 0;return Kt(new mn(o?"camera":"composite",e.value,r.labels,a))}var yn=function(){function e(t,n){p(this,e),this._parameters=t,this._specification=n,X(this,rn(this._parameters,this._specification))}return u(e,null,[{key:"deserialize",value:function(t){return new e(t._parameters,t._specification)}},{key:"serialize",value:function(e){return{_parameters:e._parameters,_specification:e._specification}}}])}();function An(e){return"object"===b(e)?["literal",e]:e}function vn(e,t){var n=e.stops;if(!n)return function(e,t){var n=["get",e.property];if(void 0===e.default)return"string"===t.type?["string",n]:n;if("enum"===t.type)return["match",n,Object.keys(t.values),n,e.default];var o=["color"===t.type?"to-color":t.type,n,An(e.default)];return"array"===t.type&&o.splice(1,0,t.value,t.length||null),o}(e,t);var o=n&&"object"===b(n[0][0]),i=o||void 0!==e.property,r=o||!i;return n=n.map((function(e){return!i&&t.tokens&&"string"==typeof e[1]?[e[0],Sn(e[1])]:[e[0],An(e[1])]})),o?function(e,t,n){for(var o={},i={},r=[],a=0;a3&&void 0!==arguments[3]?arguments[3]:["zoom"],r=_n(e,t),a=!1;if("interval"===r)o=["step",i],a=!0;else{if("exponential"!==r)throw new Error('Unknown zoom function type "'.concat(r,'"'));var s=void 0!==e.base?e.base:1;o=[Cn(e),1===s?["linear"]:["exponential",s],i]}var l,c=v(n);try{for(c.s();!(l=c.n()).done;){var u=l.value;En(o,u[0],u[1],a)}}catch(e){c.e(e)}finally{c.f()}return wn(o),o}(e,t,n):bn(e,t,n)}function Cn(e){switch(e.colorSpace){case"hcl":return"interpolate-hcl";case"lab":return"interpolate-lab";default:return"interpolate"}}function In(e,t){var n,o,i=An((n=e.default,o=t.default,void 0!==n?n:void 0!==o?o:void 0));return void 0===i&&"resolvedImage"===t.type?"":i}function bn(e,t,n){var o=_n(e,t),i=["get",e.property];if("categorical"===o&&"boolean"==typeof n[0][0]){var r,a=["case"],s=v(n);try{for(s.s();!(r=s.n()).done;){var l=r.value;a.push(["==",i,l[0]],l[1])}}catch(e){s.e(e)}finally{s.f()}return a.push(In(e,t)),a}if("categorical"===o){var c,u=["match",i],d=v(n);try{for(d.s();!(c=d.n()).done;){var p=c.value;En(u,p[0],p[1],!1)}}catch(e){d.e(e)}finally{d.f()}return u.push(In(e,t)),u}if("interval"===o){var h,g=["step",["number",i]],m=v(n);try{for(m.s();!(h=m.n()).done;){var f=h.value;En(g,f[0],f[1],!0)}}catch(e){m.e(e)}finally{m.f()}return wn(g),void 0===e.default?g:["case",["==",["typeof",i],"number"],g,An(e.default)]}if("exponential"===o){var y,A=void 0!==e.base?e.base:1,C=[Cn(e),1===A?["linear"]:["exponential",A],["number",i]],I=v(n);try{for(I.s();!(y=I.n()).done;){var b=y.value;En(C,b[0],b[1],!1)}}catch(e){I.e(e)}finally{I.f()}return void 0===e.default?C:["case",["==",["typeof",i],"number"],C,An(e.default)]}throw new Error("Unknown property function type ".concat(o))}function wn(e){"step"===e[0]&&3===e.length&&(e.push(0),e.push(e[3]))}function En(e,t,n,o){e.length>3&&t===e[e.length-2]||(o&&2===e.length||e.push(t),e.push(n))}function _n(e,t){return e.type?e.type:t.expression.interpolated?"exponential":"interval"}function Sn(e){for(var t=["concat"],n=/{([^{}]+)}/g,o=0,i=n.exec(e);null!==i;i=n.exec(e)){var r=e.slice(o,n.lastIndex-i[0].length);o=n.lastIndex,r.length>0&&t.push(r),t.push(["get",i[1]])}if(1===t.length)return e;if(o=2&&"$id"!==e[1]&&"$type"!==e[1];case"in":return e.length>=3&&("string"!=typeof e[1]||Array.isArray(e[2]));case"!in":case"!has":case"none":return!1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3!==e.length||Array.isArray(e[1])||Array.isArray(e[2]);case"any":case"all":var t,n=v(e.slice(1));try{for(n.s();!(t=n.n()).done;){var o=t.value;if(!Mn(o)&&"boolean"!=typeof o)return!1}}catch(e){n.e(e)}finally{n.f()}return!0;default:return!0}}var Pn={type:"boolean",default:!1,transition:!1,"property-type":"data-driven",expression:{interpolated:!1,parameters:["zoom","feature"]}};function xn(e){if(null==e)return{filter:function(){return!0},needGeometry:!1};Mn(e)||(e=Gn(e));var t=hn(e,Pn);if("error"===t.result)throw new Error(t.value.map((function(e){return"".concat(e.key,": ").concat(e.message)})).join(", "));return{filter:function(e,n,o){return t.value.evaluate(e,n,{},o)},needGeometry:function e(t){if(!Array.isArray(t))return!1;if("within"===t[0])return!0;for(var n=1;nt?1:0}function Gn(e){if(!e)return!0;var t,n=e[0];return e.length<=1?"any"!==n:"=="===n?Rn(e[1],e[2],"=="):"!="===n?Ln(Rn(e[1],e[2],"==")):"<"===n||">"===n||"<="===n||">="===n?Rn(e[1],e[2],n):"any"===n?(t=e.slice(1),["any"].concat(t.map(Gn))):"all"===n?["all"].concat(e.slice(1).map(Gn)):"none"===n?["all"].concat(e.slice(1).map(Gn).map(Ln)):"in"===n?Tn(e[1],e.slice(2)):"!in"===n?Ln(Tn(e[1],e.slice(2))):"has"===n?On(e[1]):"!has"===n?Ln(On(e[1])):"within"!==n||e}function Rn(e,t,n){switch(e){case"$type":return["filter-type-".concat(n),t];case"$id":return["filter-id-".concat(n),t];default:return["filter-".concat(n),e,t]}}function Tn(e,t){if(0===t.length)return!1;switch(e){case"$type":return["filter-type-in",["literal",t]];case"$id":return["filter-id-in",["literal",t]];default:return t.length>200&&!t.some((function(e){return b(e)!==b(t[0])}))?["filter-in-large",e,["literal",t.sort(kn)]]:["filter-in-small",e,["literal",t]]}}function On(e){switch(e){case"$type":return!0;case"$id":return["filter-has-id"];default:return["filter-has",e]}}function Ln(e){return["!",e]}var Dn=["type","source","source-layer","minzoom","maxzoom","filter","layout"];function Nn(e,t){var n={};for(var o in e)"ref"!==o&&(n[o]=e[o]);return Dn.forEach((function(e){e in t&&(n[e]=t[e])})),n}function jn(e){e=e.slice();for(var t=Object.create(null),n=0;ns)return[new Un(t,n,"".concat(n," is greater than the maximum value ").concat(s))]}return[]}function Yn(e){var t,n,o,i=e.valueSpec,r=zn(e.value.type),a={},s="categorical"!==r&&void 0===e.value.property,l=!s,c="array"===tn(e.value.stops)&&"array"===tn(e.value.stops[0])&&"object"===tn(e.value.stops[0][0]),u=qn({key:e.key,value:e.value,valueSpec:e.styleSpec.function,style:e.style,styleSpec:e.styleSpec,objectElementValidators:{stops:function(e){if("identity"===r)return[new Un(e.key,e.value,'identity function may not have a "stops" property')];var t=[],n=e.value;t=t.concat(Wn({key:e.key,value:n,valueSpec:e.valueSpec,style:e.style,styleSpec:e.styleSpec,arrayElementValidator:d})),"array"===tn(n)&&0===n.length&&t.push(new Un(e.key,n,"array must have at least one stop"));return t},default:function(e){return lo({key:e.key,value:e.value,valueSpec:i,style:e.style,styleSpec:e.styleSpec})}}});return"identity"===r&&s&&u.push(new Un(e.key,e.value,'missing required property "property"')),"identity"===r||e.value.stops||u.push(new Un(e.key,e.value,'missing required property "stops"')),"exponential"===r&&e.valueSpec.expression&&!en(e.valueSpec)&&u.push(new Un(e.key,e.value,"exponential functions not supported")),e.styleSpec.$version>=8&&(l&&!Qt(e.valueSpec)?u.push(new Un(e.key,e.value,"property functions not supported")):s&&!$t(e.valueSpec)&&u.push(new Un(e.key,e.value,"zoom functions not supported"))),"categorical"!==r&&!c||void 0!==e.value.property||u.push(new Un(e.key,e.value,'"property" property is required')),u;function d(e){var t=[],r=e.value,s=e.key;if("array"!==tn(r))return[new Un(s,r,"array expected, ".concat(tn(r)," found"))];if(2!==r.length)return[new Un(s,r,"array length 2 expected, length ".concat(r.length," found"))];if(c){if("object"!==tn(r[0]))return[new Un(s,r,"object expected, ".concat(tn(r[0])," found"))];if(void 0===r[0].zoom)return[new Un(s,r,"object stop key must have zoom")];if(void 0===r[0].value)return[new Un(s,r,"object stop key must have value")];if(o&&o>zn(r[0].zoom))return[new Un(s,r[0].zoom,"stop zoom values must appear in ascending order")];zn(r[0].zoom)!==o&&(o=zn(r[0].zoom),n=void 0,a={}),t=t.concat(qn({key:"".concat(s,"[0]"),value:r[0],valueSpec:{zoom:{}},style:e.style,styleSpec:e.styleSpec,objectElementValidators:{zoom:Hn,value:p}}))}else t=t.concat(p({key:"".concat(s,"[0]"),value:r[0],valueSpec:{},style:e.style,styleSpec:e.styleSpec},r));return pn(Vn(r[1]))?t.concat([new Un("".concat(s,"[1]"),r[1],"expressions are not allowed in function stops.")]):t.concat(lo({key:"".concat(s,"[1]"),value:r[1],valueSpec:i,style:e.style,styleSpec:e.styleSpec}))}function p(e,o){var s=tn(e.value),l=zn(e.value),c=null!==e.value?e.value:o;if(t){if(s!==t)return[new Un(e.key,c,"".concat(s," stop domain type must match previous stop domain type ").concat(t))]}else t=s;if("number"!==s&&"string"!==s&&"boolean"!==s)return[new Un(e.key,c,"stop domain value must be a number, string, or boolean")];if("number"!==s&&"categorical"!==r){var u="number expected, ".concat(s," found");return Qt(i)&&void 0===r&&(u+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new Un(e.key,c,u)]}return"categorical"!==r||"number"!==s||isFinite(l)&&Math.floor(l)===l?"categorical"!==r&&"number"===s&&void 0!==n&&l":case">=":n.length>=2&&"$type"===zn(n[1])&&a.push(new Un(o,n,'"$type" cannot be use with operator "'.concat(n[0],'"')));case"==":case"!=":3!==n.length&&a.push(new Un(o,n,'filter array for operator "'.concat(n[0],'" must have 3 elements')));case"in":case"!in":n.length>=2&&"string"!==(i=tn(n[1]))&&a.push(new Un("".concat(o,"[1]"),n[1],"string expected, ".concat(i," found")));for(var s=2;s1&&void 0!==arguments[1]?arguments[1]:w,n=[];return n=n.concat(lo({key:"",value:e,valueSpec:t.$root,styleSpec:t,style:e,objectElementValidators:{glyphs:co,"*":function(){return[]}}})),e.constants&&(n=n.concat(Fn({key:"constants",value:e.constants,style:e,styleSpec:t}))),po(n)}function po(e){return[].concat(e).sort((function(e,t){return e.line-t.line}))}function ho(e){return function(){for(var t=arguments.length,n=new Array(t),o=0;oc&&_.push("'"+this.terminals_[b]+"'");M=p.showPosition?"Parse error on line "+(s+1)+":\n"+p.showPosition()+"\nExpecting "+_.join(", ")+", got '"+(this.terminals_[A]||A)+"'":"Parse error on line "+(s+1)+": Unexpected "+(A==u?"end of input":"'"+(this.terminals_[A]||A)+"'"),this.parseError(M,{text:p.match,token:this.terminals_[A]||A,line:p.yylineno,loc:m,expected:_})}if(C[0]instanceof Array&&C.length>1)throw new Error("Parse Error: multiple actions possible at state: "+v+", token: "+A);switch(C[0]){case 1:n.push(A),o.push(p.yytext),i.push(p.yylloc),n.push(C[1]),A=null,l=p.yyleng,a=p.yytext,s=p.yylineno,m=p.yylloc;break;case 2:if(w=this.productions_[C[1]][1],S.$=o[o.length-w],S._$={first_line:i[i.length-(w||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(w||1)].first_column,last_column:i[i.length-1].last_column},f&&(S._$.range=[i[i.length-(w||1)].range[0],i[i.length-1].range[1]]),void 0!==(I=this.performAction.apply(S,[a,l,s,h.yy,C[1],o,i].concat(d))))return I;w&&(n=n.slice(0,-1*w*2),o=o.slice(0,-1*w),i=i.slice(0,-1*w)),n.push(this.productions_[C[1]][0]),o.push(S.$),i.push(S._$),E=r[n[n.length-2]][n[n.length-1]],n.push(E);break;case 3:return!0}}return!0}},p={EOF:1,parseError:function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},setInput:function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},unput:function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var o=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===o.length?this.yylloc.first_column:0)+o[o.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(e){this.unput(this.match.slice(e))},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},test_match:function(e,t){var n,o,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(o=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=o.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:o?o[o.length-1].length-o[o.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in i)this[r]=i[r];return!1}return!1},next:function(){if(this.done)return this.EOF;var e,t,n,o;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),r=0;rt[0].length)){if(t=n,o=r,this.options.backtrack_lexer){if(!1!==(e=this.test_match(n,i[r])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,i[o]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return e||this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"},pushState:function(e){this.begin(e)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(e,t,n,o){switch(n){case 0:break;case 1:return 6;case 2:return t.yytext=t.yytext.substr(1,t.yyleng-2),4;case 3:return 17;case 4:return 18;case 5:return 23;case 6:return 24;case 7:return 22;case 8:return 21;case 9:return 10;case 10:return 11;case 11:return 8;case 12:return 14;case 13:return"INVALID"}},rules:[/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}}};function h(){this.yy={}}return d.lexer=p,h.prototype=d,d.Parser=h,new h}();void 0!==S&&(t.parser=n,t.Parser=n.Parser,t.parse=function(){return n.parse.apply(n,arguments)})}));function mo(e){if(e instanceof String||"string"==typeof e||e instanceof o)try{return go.parse(e.toString())}catch(e){throw new Bn(e)}return e}function fo(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:w,n=e;try{n=mo(n)}catch(e){return[e]}return uo(n,t)}new Set(["vector","raster","raster-dem"]);var yo={StyleExpression:dn,isExpression:pn,isExpressionFilter:Mn,createExpression:hn,createPropertyExpression:fn,normalizePropertyExpression:function(e,t){if(nn(e))return new yn(e,t);if(pn(e)){var n=fn(e,t);if("error"===n.result)throw new Error(n.value.map((function(e){return"".concat(e.key,": ").concat(e.message)})).join(", "));return n.value}var o=e;return"string"==typeof e&&"color"===t.type&&(o=ye.parse(e)),{kind:"constant",evaluate:function(){return o}}},ZoomConstantExpression:gn,ZoomDependentExpression:mn,StylePropertyFunction:yn},Ao={convertFunction:vn,createFunction:rn,isFunction:nn};fo.parsed=fo,fo.latest=fo}).call(this,n(28),n(105).Buffer)},function(e){e.exports=JSON.parse('{"name":"geoportal-extensions","description":"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries","version":"3.0.3","date":"14/05/2024","leafletExtName":"French Geoportal Extension for Leaflet","leafletExtVersion":"2.4.0","olExtName":"French Geoportal Extension for OpenLayers","olExtVersion":"3.4.3","itownsExtName":"French Geoportal Extension for Itowns","itownsExtVersion":"2.5.0","main":"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js","types":"dist/leaflet/index.d.ts, dist/openlayers/index.d.ts, dist/itowns/index.d.ts","module":"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js","directories":{},"scripts":{"setup":"npm install","clean":"echo \\"Warning: target not yet implemented!\\" && exit 0","eslint":"eslint src/","test":"npm run test:serve","test:serve":"cd test && webpack-dev-server --hot --config webpack.test.serve.js","sample":"npm run sample:serve","sample:serve":"npm run sample:ol:serve","sample:itowns:serve":"webpack-dev-server --config build/webpack/webpack.config.itowns --mode=development --https --open-page samples/index-itowns-map.html --content-base . --output-public-path \'/dist/itowns/\' --port 9001 --open","sample:leaflet:serve":"webpack-dev-server --config build/webpack/webpack.config.leaflet --mode=development --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path \'/dist/leaflet/\' --port 9001 --open","sample:ol:serve":"webpack-dev-server --config build/webpack/webpack.config.openlayers --mode=development --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path \'/dist/openlayers/\' --port 9001 --open","generate-types:ol":"npx tsc -p build/types/tsconfig-openlayers.json","generate-types:leaflet":"npx tsc -p build/types/tsconfig-leaflet.json","generate-types:itowns":"npx tsc -p build/types/tsconfig-itowns.json","generate-jsdoc:ol":"jsdoc -c build/jsdoc/jsdoc-openlayers.json","generate-jsdoc:leaflet":"jsdoc -c build/jsdoc/jsdoc-leaflet.json","generate-jsdoc:itowns":"jsdoc -c build/jsdoc/jsdoc-itowns.json","doc":"npm run doc:serve","doc:serve":"npm run doc:ol:serve","doc:itowns:serve":"webpack-dev-server --hot --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open","doc:leaflet:serve":"webpack-dev-server --hot --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open","doc:ol:serve":"webpack-dev-server --hot --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open","build:dev":"npm-run-all --print-label --print-name build:*:dev","build:prod":"npm-run-all --print-label --print-name build:*:prod","build:src":"npm-run-all --print-label --print-name build:*:src","build":"npm-run-all --print-label --print-name build:*:*","build:itowns":"npm-run-all --print-label --print-name build:itowns:*","build:itowns:dev":"webpack --config build/webpack/webpack.config.itowns --mode=development","build:itowns:prod":"webpack --config build/webpack/webpack.config.itowns --mode=production","build:itowns:src":"webpack --config build/webpack/webpack.config.itowns --mode=none","build:ol":"npm-run-all --print-label --print-name build:ol:*","build:ol:dev":"webpack --config build/webpack/webpack.config.openlayers --mode=development","build:ol:prod":"webpack --config build/webpack/webpack.config.openlayers --mode=production","build:ol:src":"webpack --config build/webpack/webpack.config.openlayers --mode=none","build:leaflet":"npm-run-all --print-label --print-name build:leaflet:*","build:leaflet:dev":"webpack --config build/webpack/webpack.config.leaflet --mode=development","build:leaflet:prod":"webpack --config build/webpack/webpack.config.leaflet --mode=production","build:leaflet:src":"webpack --config build/webpack/webpack.config.leaflet --mode=none"},"repository":{"type":"git","url":"https://github.com/IGNF/geoportal-extensions.git"},"author":"IGNF","keywords":["geoportail","geoplateforme","javascript","OpenLayers","Leaflet","Itowns","3D"],"license":"CECILL-B","bugs":{"url":"https://github.com/IGNF/geoportal-extensions/issues"},"homepage":"https://github.com/IGNF/geoportal-extensions#readme","dependencies":{"@mapbox/mapbox-gl-style-spec":"13.20.1","eventbusjs":"0.2.0","geoportal-access-lib":"3.4.2","itowns":"2.38.2","leaflet":"1.7.1","leaflet-draw":"1.0.4","loglevel":"^1.6.7","markdown-toc":"^1.2.0","ol":"6.9.0","ol-mapbox-style":"6.7.0","proj4":"2.7.5","proj4leaflet":"1.0.2","sortablejs":"1.14.0","three":"0.137.5","typescript":"^4.5.5","whatwg-fetch":"3.0.0"},"devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-transform-template-literals":"^7.7.4","@babel/preset-env":"^7.4.4","babel-loader":"^8.0.5","chai":"^4.2.0","chalk":"^4.0.0","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.0.3","core-js":"^3.6.4","css-loader":"^3.4.2","eslint":"^6.8.0","eslint-config-standard":"^14.1.1","eslint-loader":"^4.0.0","eslint-plugin-import":"^2.17.2","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.1.1","eslint-plugin-standard":"^4.0.0","exports-loader":"^0.7.0","expose-loader":"^0.7.5","fs-extra":"^9.0.0","handlebars":"^4.7.5","handlebars-layouts":"^3.1.4","html-webpack-plugin":"^4.0.4","jsdoc-webpack-plugin":"^0.3.0","mini-css-extract-plugin":"^0.9.0","mocha":"^7.1.1","mocha-loader":"^5.0.0","npm-run-all":"^4.1.5","optimize-css-assets-webpack-plugin":"^5.0.1","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","requirejs":"^2.3.6","responsive-loader":"^1.2.0","speed-measure-webpack-plugin":"^1.3.0","string-template":"^1.0.0","style-loader":"^1.1.3","terser-webpack-plugin":"^2.0.0","url-loader":"^4.0.0","webpack":"^4.30.0","webpack-cli":"^3.3.1","webpack-dev-server":"^3.3.1","webpack-node-externals":"^1.7.2"}}')},function(e,t,n){var o,i;!function(r,a){"use strict";void 0===(i="function"==typeof(o=function(){var e=function(){},t="undefined"!=typeof window&&void 0!==window.navigator&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"],o={},i=null;function r(e,t){var n=e[t];if("function"==typeof n.bind)return n.bind(e);try{return Function.prototype.bind.call(n,e)}catch(t){return function(){return Function.prototype.apply.apply(n,[e,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function s(n){return"debug"===n&&(n="log"),"undefined"!=typeof console&&("trace"===n&&t?a:void 0!==console[n]?r(console,n):void 0!==console.log?r(console,"log"):e)}function l(){for(var t=this.getLevel(),o=0;o=0&&t<=c.levels.SILENT)return t;throw new TypeError("log.setLevel() called with invalid level: "+e)}"string"==typeof e?d+=":"+e:"symbol"==typeof e&&(d=void 0),c.name=e,c.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},c.methodFactory=t||u,c.getLevel=function(){return null!=s?s:null!=a?a:r},c.setLevel=function(e,t){return s=h(e),!1!==t&&function(e){var t=(n[e]||"silent").toUpperCase();if("undefined"!=typeof window&&d){try{return void(window.localStorage[d]=t)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"="+t+";"}catch(e){}}}(s),l.call(c)},c.setDefaultLevel=function(e){a=h(e),p()||c.setLevel(e,!1)},c.resetLevel=function(){s=null,function(){if("undefined"!=typeof window&&d){try{window.localStorage.removeItem(d)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch(e){}}}(),l.call(c)},c.enableAll=function(e){c.setLevel(c.levels.TRACE,e)},c.disableAll=function(e){c.setLevel(c.levels.SILENT,e)},c.rebuild=function(){if(i!==c&&(r=h(i.getLevel())),l.call(c),i===c)for(var e in o)o[e].rebuild()},r=h(i?i.getLevel():"WARN");var g=p();null!=g&&(s=h(g)),l.call(c)}(i=new d).getLogger=function(e){if("symbol"!=typeof e&&"string"!=typeof e||""===e)throw new TypeError("You must supply a name when creating a logger.");var t=o[e];return t||(t=o[e]=new d(e,i.methodFactory)),t};var p="undefined"!=typeof window?window.log:void 0;return i.noConflict=function(){return"undefined"!=typeof window&&window.log===i&&(window.log=p),i},i.getLoggers=function(){return o},i.default=i,i})?o.call(t,n,t,e):o)||(e.exports=i)}()},function(e,t,n){(function(t){e.exports=t.proj4=n(109)}).call(this,n(28))},function(e,t){e.exports=ol.layer.Tile},function(e,t){e.exports=ol.extent},function(e,t){e.exports=ol.layer.VectorTile},function(e,t){e.exports=ol.Collection},function(e,t){e.exports=ol.source.TileJSON},function(e,t){e.exports=ol.format.MVT},function(e,t){e.exports=ol.events.condition},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){e.exports=ol.source.TileWMS},function(e,t){e.exports=ol.source.WMTS},function(e){e.exports=JSON.parse('{"_from":"geoportal-access-lib@3.4.2","_id":"geoportal-access-lib@3.4.2","_inBundle":false,"_integrity":"sha512-dg7lW+4jhlMQzWp95ejqJLVDYgBQeTY7/ypP7qo3GS2ci4KghdgaFeFftUFbEbOSKQ6cn7FUbBTXAKB6uUADlw==","_location":"/geoportal-access-lib","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"geoportal-access-lib@3.4.2","name":"geoportal-access-lib","escapedName":"geoportal-access-lib","rawSpec":"3.4.2","saveSpec":null,"fetchSpec":"3.4.2"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/geoportal-access-lib/-/geoportal-access-lib-3.4.2.tgz","_shasum":"8f92a231104f195dbd098add811ae1367877ef7d","_spec":"geoportal-access-lib@3.4.2","_where":"/home/runner/work/geoportal-extensions/geoportal-extensions","author":{"name":"IGNF"},"bugs":{"url":"https://github.com/IGNF/geoportal-access-lib/issues"},"bundleDependencies":false,"date":"14/05/2024","dependencies":{"@xmldom/xmldom":"^0.8.10","es6-promise":"^4.2.4","node-fetch":"^2.6.1"},"deprecated":false,"description":"French Geoportal resources access library","devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-transform-template-literals":"^7.12.1","@babel/preset-env":"^7.12.11","babel-loader":"^8.2.2","chai":"^4.1.2","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.1.2","eslint":"^7.18.0","eslint-config-standard":"^16.0.2","eslint-loader":"^4.0.2","eslint-plugin-import":"^2.22.1","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.2.1","eslint-plugin-standard":"^5.0.0","glob":"^7.1.2","handlebars-layouts":"^3.1.4","handlebars-webpack-plugin":"^1.4.1","html-webpack-plugin":"^4.5.1","istanbul-instrumenter-loader":"^3.0.1","jsdoc-webpack-plugin":"^0.3.0","loglevel":"^1.6.1","mocha":"^7.2.0","mocha-loader":"^5.1.5","mocha-webpack":"^2.0.0-beta.0","mochawesome":"^6.2.1","nyc":"^15.1.0","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","sinon":"^9.2.4","sinon-es6":"0.0.3","speed-measure-webpack-plugin":"^1.4.2","string-template":"^1.0.0","terser-webpack-plugin":"^2.3.8","webpack":"^4.46.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.2","webpack-node-externals":"^2.5.2","webpack-shell-plugin":"^0.5.0"},"homepage":"https://github.com/IGNF/geoportal-access-lib#readme","keywords":["geoplateforme","geoportail","webservice","javascript","es6"],"license":"CECILL-B","main":"dist/GpServices-src.js","module":"src/Gp.js","name":"geoportal-access-lib","nyc":{"include":["src/**/*.js"],"instrument":false,"sourceMap":false},"optionalDependencies":{},"peerDependencies":{},"repository":{"type":"git","url":"git+https://github.com/IGNF/geoportal-access-lib.git"},"scripts":{"build":"webpack --mode=none","build:dev":"webpack --mode=development","build:prod":"webpack --mode=production","clean":"echo \\"Warning: no yet implemented!\\" && exit 0","cover":"nyc --reporter=lcov --reporter=text npm run test","doc":"npm run doc:serve","doc:serve":"webpack-dev-server --content-base jsdoc --port 9001 --open","eslint":"eslint src/","sample":"npm run sample:serve","sample:serve":"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:dev":"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:prod":"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","setup":"npm install","test":"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\"test_*.js\\" test/spec/","test:end-to-end:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js","test:end-to-end:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js","test:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js","test:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js"},"version":"3.4.2"}')},function(e,t){e.exports=ol.style.Circle},function(e,t){e.exports=ol.style.Icon},function(e,t){e.exports=ol.style.Text},function(e,t,n){"use strict";function o(e,t){return void 0===t&&(t=Object),t&&"function"==typeof t.freeze?t.freeze(e):e}var i=o({HTML:"text/html",isHTML:function(e){return e===i.HTML},XML_APPLICATION:"application/xml",XML_TEXT:"text/xml",XML_XHTML_APPLICATION:"application/xhtml+xml",XML_SVG_IMAGE:"image/svg+xml"}),r=o({HTML:"http://www.w3.org/1999/xhtml",isHTML:function(e){return e===r.HTML},SVG:"http://www.w3.org/2000/svg",XML:"http://www.w3.org/XML/1998/namespace",XMLNS:"http://www.w3.org/2000/xmlns/"});t.assign=function(e,t){if(null===e||"object"!=typeof e)throw new TypeError("target is not an object");for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},t.find=function(e,t,n){if(void 0===n&&(n=Array.prototype),e&&"function"==typeof n.find)return n.find.call(e,t);for(var o=0;o1?g[g.length-2].toLowerCase():"";if(m==f||m==f.replace("-","")||y+"-"+m==f){c=s?c:n[f],g.pop(),y&&f.startsWith(y)&&g.pop();break}}s||"number"!=typeof m||(c=m,s=!0);var A=g.join(" ").replace("Klokantech Noto Sans","Noto Sans");-1!==A.indexOf(" ")&&(A='"'+A+'"'),d.push(A)}a=i[e]=[u,c,d]}return a[0]+" "+a[1]+" "+t+"px"+(r?"/"+r:"")+" "+a[2]}},function(e,t){e.exports=ol.Map},function(e,t){e.exports=ol.tilegrid.TileGrid},function(e,t){e.exports=ol.render.canvas},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t){e.exports=void 0},function(e,t,n){var o=n(61);t.DOMImplementation=o.DOMImplementation,t.XMLSerializer=o.XMLSerializer,t.DOMParser=n(102).DOMParser},function(e,t,n){var o=n(35),i=o.find,r=o.NAMESPACE;function a(e){return""!==e}function s(e,t){return e.hasOwnProperty(t)||(e[t]=!0),e}function l(e){if(!e)return[];var t=function(e){return e?e.split(/[\t\n\f\r ]+/).filter(a):[]}(e);return Object.keys(t.reduce(s,{}))}function c(e,t){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])}function u(e,t){var n=e.prototype;if(!(n instanceof t)){function o(){}o.prototype=t.prototype,c(n,o=new o),e.prototype=n=o}n.constructor!=e&&("function"!=typeof e&&console.error("unknown Class:"+e),n.constructor=e)}var d={},p=d.ELEMENT_NODE=1,h=d.ATTRIBUTE_NODE=2,g=d.TEXT_NODE=3,m=d.CDATA_SECTION_NODE=4,f=d.ENTITY_REFERENCE_NODE=5,y=d.ENTITY_NODE=6,A=d.PROCESSING_INSTRUCTION_NODE=7,v=d.COMMENT_NODE=8,C=d.DOCUMENT_NODE=9,I=d.DOCUMENT_TYPE_NODE=10,b=d.DOCUMENT_FRAGMENT_NODE=11,w=d.NOTATION_NODE=12,E={},_={},S=(E.INDEX_SIZE_ERR=(_[1]="Index size error",1),E.DOMSTRING_SIZE_ERR=(_[2]="DOMString size error",2),E.HIERARCHY_REQUEST_ERR=(_[3]="Hierarchy request error",3)),M=(E.WRONG_DOCUMENT_ERR=(_[4]="Wrong document",4),E.INVALID_CHARACTER_ERR=(_[5]="Invalid character",5),E.NO_DATA_ALLOWED_ERR=(_[6]="No data allowed",6),E.NO_MODIFICATION_ALLOWED_ERR=(_[7]="No modification allowed",7),E.NOT_FOUND_ERR=(_[8]="Not found",8)),P=(E.NOT_SUPPORTED_ERR=(_[9]="Not supported",9),E.INUSE_ATTRIBUTE_ERR=(_[10]="Attribute in use",10));E.INVALID_STATE_ERR=(_[11]="Invalid state",11),E.SYNTAX_ERR=(_[12]="Syntax error",12),E.INVALID_MODIFICATION_ERR=(_[13]="Invalid modification",13),E.NAMESPACE_ERR=(_[14]="Invalid namespace",14),E.INVALID_ACCESS_ERR=(_[15]="Invalid access",15);function x(e,t){if(t instanceof Error)var n=t;else n=this,Error.call(this,_[e]),this.message=_[e],Error.captureStackTrace&&Error.captureStackTrace(this,x);return n.code=e,t&&(this.message=this.message+": "+t),n}function k(){}function G(e,t){this._node=e,this._refresh=t,R(this)}function R(e){var t=e._node._inc||e._node.ownerDocument._inc;if(e._inc!==t){var n=e._refresh(e._node);if(ye(e,"length",n.length),!e.$$length||n.length=0))throw new x(M,new Error(e.tagName+"@"+n));for(var i=t.length-1;o"==e&&">")||"&"==e&&"&"||'"'==e&&"""||"&#"+e.charCodeAt()+";"}function B(e,t){if(t(e))return!0;if(e=e.firstChild)do{if(B(e,t))return!0}while(e=e.nextSibling)}function F(){this.ownerDocument=this}function z(e,t,n,o){e&&e._inc++,n.namespaceURI===r.XMLNS&&delete t._nsMap[n.prefix?n.localName:""]}function V(e,t,n){if(e&&e._inc){e._inc++;var o=t.childNodes;if(n)o[o.length++]=n;else{for(var i=t.firstChild,r=0;i;)o[r++]=i,i=i.nextSibling;o.length=r,delete o[o.length]}}}function q(e,t){var n=t.previousSibling,o=t.nextSibling;return n?n.nextSibling=o:e.firstChild=o,o?o.previousSibling=n:e.lastChild=n,t.parentNode=null,t.previousSibling=null,t.nextSibling=null,V(e.ownerDocument,e),t}function W(e){return e&&e.nodeType===j.DOCUMENT_TYPE_NODE}function H(e){return e&&e.nodeType===j.ELEMENT_NODE}function Y(e){return e&&e.nodeType===j.TEXT_NODE}function J(e,t){var n=e.childNodes||[];if(i(n,H)||W(t))return!1;var o=i(n,W);return!(t&&o&&n.indexOf(o)>n.indexOf(t))}function Z(e,t){var n=e.childNodes||[];if(i(n,(function(e){return H(e)&&e!==t})))return!1;var o=i(n,W);return!(t&&o&&n.indexOf(o)>n.indexOf(t))}function K(e,t,n){if(!function(e){return e&&(e.nodeType===j.DOCUMENT_NODE||e.nodeType===j.DOCUMENT_FRAGMENT_NODE||e.nodeType===j.ELEMENT_NODE)}(e))throw new x(S,"Unexpected parent node type "+e.nodeType);if(n&&n.parentNode!==e)throw new x(M,"child not in parent");if(!function(e){return e&&(H(e)||Y(e)||W(e)||e.nodeType===j.DOCUMENT_FRAGMENT_NODE||e.nodeType===j.COMMENT_NODE||e.nodeType===j.PROCESSING_INSTRUCTION_NODE)}(t)||W(t)&&e.nodeType!==j.DOCUMENT_NODE)throw new x(S,"Unexpected node type "+t.nodeType+" for parent node type "+e.nodeType)}function X(e,t,n){var o=e.childNodes||[],r=t.childNodes||[];if(t.nodeType===j.DOCUMENT_FRAGMENT_NODE){var a=r.filter(H);if(a.length>1||i(r,Y))throw new x(S,"More than one element or text in fragment");if(1===a.length&&!J(e,n))throw new x(S,"Element in fragment can not be inserted before doctype")}if(H(t)&&!J(e,n))throw new x(S,"Only one element can be added and only after doctype");if(W(t)){if(i(o,W))throw new x(S,"Only one doctype is allowed");var s=i(o,H);if(n&&o.indexOf(s)1||i(r,Y))throw new x(S,"More than one element or text in fragment");if(1===a.length&&!Z(e,n))throw new x(S,"Element in fragment can not be inserted before doctype")}if(H(t)&&!Z(e,n))throw new x(S,"Only one element can be added and only after doctype");if(W(t)){if(i(o,(function(e){return W(e)&&e!==n})))throw new x(S,"Only one doctype is allowed");var s=i(o,H);if(n&&o.indexOf(s)=0;w--){if(""===(E=i[w]).prefix&&E.namespace===e.namespaceURI){d=E.namespace;break}}if(d!==e.namespaceURI)for(w=i.length-1;w>=0;w--){var E;if((E=i[w]).namespace===e.namespaceURI){E.prefix&&(u=E.prefix+":"+c);break}}}t.push("<",u);for(var _=0;_"),n&&/^script$/i.test(c))for(;l;)l.data?t.push(l.data):fe(l,t,n,o,i.slice()),l=l.nextSibling;else for(;l;)fe(l,t,n,o,i.slice()),l=l.nextSibling;t.push("")}else t.push("/>");return;case C:case b:for(l=e.firstChild;l;)fe(l,t,n,o,i.slice()),l=l.nextSibling;return;case h:return me(t,e.name,e.value);case g:return t.push(e.data.replace(/[<&>]/g,U));case m:return t.push("");case v:return t.push("\x3c!--",e.data,"--\x3e");case I:var x=e.publicId,k=e.systemId;if(t.push("");else if(k&&"."!=k)t.push(" SYSTEM ",k,">");else{var G=e.internalSubset;G&&t.push(" [",G,"]"),t.push(">")}return;case A:return t.push("");case f:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function ye(e,t,n){e[t]=n}x.prototype=Error.prototype,c(E,x),k.prototype={length:0,item:function(e){return e>=0&&e0},lookupPrefix:function(e){for(var t=this;t;){var n=t._nsMap;if(n)for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o)&&n[o]===e)return o;t=t.nodeType==h?t.ownerDocument:t.parentNode}return null},lookupNamespaceURI:function(e){for(var t=this;t;){var n=t._nsMap;if(n&&Object.prototype.hasOwnProperty.call(n,e))return n[e];t=t.nodeType==h?t.ownerDocument:t.parentNode}return null},isDefaultNamespace:function(e){return null==this.lookupPrefix(e)}},c(d,j),c(d,j.prototype),F.prototype={nodeName:"#document",nodeType:C,doctype:null,documentElement:null,_inc:1,insertBefore:function(e,t){if(e.nodeType==b){for(var n=e.firstChild;n;){var o=n.nextSibling;this.insertBefore(n,t),n=o}return e}return $(this,e,t),e.ownerDocument=this,null===this.documentElement&&e.nodeType===p&&(this.documentElement=e),e},removeChild:function(e){return this.documentElement==e&&(this.documentElement=null),q(this,e)},replaceChild:function(e,t){$(this,e,t,Q),e.ownerDocument=this,t&&this.removeChild(t),H(e)&&(this.documentElement=e)},importNode:function(e,t){return function e(t,n,o){var i;switch(n.nodeType){case p:(i=n.cloneNode(!1)).ownerDocument=t;case b:break;case h:o=!0}i||(i=n.cloneNode(!1));if(i.ownerDocument=t,i.parentNode=null,o)for(var r=n.firstChild;r;)i.appendChild(e(t,r,o)),r=r.nextSibling;return i}(this,e,t)},getElementById:function(e){var t=null;return B(this.documentElement,(function(n){if(n.nodeType==p&&n.getAttribute("id")==e)return t=n,!0})),t},getElementsByClassName:function(e){var t=l(e);return new G(this,(function(n){var o=[];return t.length>0&&B(n.documentElement,(function(i){if(i!==n&&i.nodeType===p){var r=i.getAttribute("class");if(r){var a=e===r;if(!a){var s=l(r);a=t.every((c=s,function(e){return c&&-1!==c.indexOf(e)}))}a&&o.push(i)}}var c})),o}))},createElement:function(e){var t=new ee;return t.ownerDocument=this,t.nodeName=e,t.tagName=e,t.localName=e,t.childNodes=new k,(t.attributes=new T)._ownerElement=t,t},createDocumentFragment:function(){var e=new ue;return e.ownerDocument=this,e.childNodes=new k,e},createTextNode:function(e){var t=new oe;return t.ownerDocument=this,t.appendData(e),t},createComment:function(e){var t=new ie;return t.ownerDocument=this,t.appendData(e),t},createCDATASection:function(e){var t=new re;return t.ownerDocument=this,t.appendData(e),t},createProcessingInstruction:function(e,t){var n=new de;return n.ownerDocument=this,n.tagName=n.nodeName=n.target=e,n.nodeValue=n.data=t,n},createAttribute:function(e){var t=new te;return t.ownerDocument=this,t.name=e,t.nodeName=e,t.localName=e,t.specified=!0,t},createEntityReference:function(e){var t=new ce;return t.ownerDocument=this,t.nodeName=e,t},createElementNS:function(e,t){var n=new ee,o=t.split(":"),i=n.attributes=new T;return n.childNodes=new k,n.ownerDocument=this,n.nodeName=t,n.tagName=t,n.namespaceURI=e,2==o.length?(n.prefix=o[0],n.localName=o[1]):n.localName=t,i._ownerElement=n,n},createAttributeNS:function(e,t){var n=new te,o=t.split(":");return n.ownerDocument=this,n.nodeName=t,n.name=t,n.namespaceURI=e,n.specified=!0,2==o.length?(n.prefix=o[0],n.localName=o[1]):n.localName=t,n}},u(F,j),ee.prototype={nodeType:p,hasAttribute:function(e){return null!=this.getAttributeNode(e)},getAttribute:function(e){var t=this.getAttributeNode(e);return t&&t.value||""},getAttributeNode:function(e){return this.attributes.getNamedItem(e)},setAttribute:function(e,t){var n=this.ownerDocument.createAttribute(e);n.value=n.nodeValue=""+t,this.setAttributeNode(n)},removeAttribute:function(e){var t=this.getAttributeNode(e);t&&this.removeAttributeNode(t)},appendChild:function(e){return e.nodeType===b?this.insertBefore(e,null):function(e,t){return t.parentNode&&t.parentNode.removeChild(t),t.parentNode=e,t.previousSibling=e.lastChild,t.nextSibling=null,t.previousSibling?t.previousSibling.nextSibling=t:e.firstChild=t,e.lastChild=t,V(e.ownerDocument,e,t),t}(this,e)},setAttributeNode:function(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);n&&this.removeAttributeNode(n)},hasAttributeNS:function(e,t){return null!=this.getAttributeNodeNS(e,t)},getAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);return n&&n.value||""},setAttributeNS:function(e,t,n){var o=this.ownerDocument.createAttributeNS(e,t);o.value=o.nodeValue=""+n,this.setAttributeNode(o)},getAttributeNodeNS:function(e,t){return this.attributes.getNamedItemNS(e,t)},getElementsByTagName:function(e){return new G(this,(function(t){var n=[];return B(t,(function(o){o===t||o.nodeType!=p||"*"!==e&&o.tagName!=e||n.push(o)})),n}))},getElementsByTagNameNS:function(e,t){return new G(this,(function(n){var o=[];return B(n,(function(i){i===n||i.nodeType!==p||"*"!==e&&i.namespaceURI!==e||"*"!==t&&i.localName!=t||o.push(i)})),o}))}},F.prototype.getElementsByTagName=ee.prototype.getElementsByTagName,F.prototype.getElementsByTagNameNS=ee.prototype.getElementsByTagNameNS,u(ee,j),te.prototype.nodeType=h,u(te,j),ne.prototype={data:"",substringData:function(e,t){return this.data.substring(e,e+t)},appendData:function(e){e=this.data+e,this.nodeValue=this.data=e,this.length=e.length},insertData:function(e,t){this.replaceData(e,0,t)},appendChild:function(e){throw new Error(_[S])},deleteData:function(e,t){this.replaceData(e,t,"")},replaceData:function(e,t,n){n=this.data.substring(0,e)+n+this.data.substring(e+t),this.nodeValue=this.data=n,this.length=n.length}},u(ne,j),oe.prototype={nodeName:"#text",nodeType:g,splitText:function(e){var t=this.data,n=t.substring(e);t=t.substring(0,e),this.data=this.nodeValue=t,this.length=t.length;var o=this.ownerDocument.createTextNode(n);return this.parentNode&&this.parentNode.insertBefore(o,this.nextSibling),o}},u(oe,ne),ie.prototype={nodeName:"#comment",nodeType:v},u(ie,ne),re.prototype={nodeName:"#cdata-section",nodeType:m},u(re,ne),ae.prototype.nodeType=I,u(ae,j),se.prototype.nodeType=w,u(se,j),le.prototype.nodeType=y,u(le,j),ce.prototype.nodeType=f,u(ce,j),ue.prototype.nodeName="#document-fragment",ue.prototype.nodeType=b,u(ue,j),de.prototype.nodeType=A,u(de,j),pe.prototype.serializeToString=function(e,t,n){return he.call(e,t,n)},j.prototype.toString=he;try{if(Object.defineProperty){Object.defineProperty(G.prototype,"length",{get:function(){return R(this),this.$$length}}),Object.defineProperty(j.prototype,"textContent",{get:function(){return function e(t){switch(t.nodeType){case p:case b:var n=[];for(t=t.firstChild;t;)7!==t.nodeType&&8!==t.nodeType&&n.push(e(t)),t=t.nextSibling;return n.join("");default:return t.nodeValue}}(this)},set:function(e){switch(this.nodeType){case p:case b:for(;this.firstChild;)this.removeChild(this.firstChild);(e||String(e))&&this.appendChild(this.ownerDocument.createTextNode(e));break;default:this.data=e,this.value=e,this.nodeValue=e}}}),ye=function(e,t,n){e["$$"+t]=n}}}catch(e){}t.DocumentType=ae,t.DOMException=x,t.DOMImplementation=N,t.Element=ee,t.Node=j,t.NodeList=k,t.XMLSerializer=pe},function(e,t){e.exports=void 0},function(e,t){e.exports=ol.source.ImageWMS},function(e,t,n){(function(t,n){ +var Gp=function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=80)}([function(e,t){e.exports=ol.style},function(e,t){e.exports=ol.proj},function(e,t){e.exports=ol.Observable},function(e,t){e.exports=ol.interaction},function(e,t){e.exports=ol.control.Control},function(e,t){e.exports=ol.layer.Vector},function(e,t,n){(function(t){e.exports=t.eventbus=n(111)}).call(this,n(28))},function(e,t,n){"use strict";(function(e){var n={configuration:{},isConfigLoaded:function(){if(this.configuration&&0!==Object.keys(this.configuration).length)return!0;var t="undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0!==e?e:{};return!!(t.Gp&&t.Gp.Config&&t.Gp.Config.layers&&0!==Object.keys(t.Gp.Config.layers).length)&&(this.configuration=t.Gp.Config,!0)}};t.a=n}).call(this,n(28))},function(e,t){e.exports=ol.geom},function(e,t){e.exports=ol.source.Vector},function(e,t){e.exports=ol.Overlay},function(e,t){e.exports=ol.sphere},function(e,t){e.exports=ol.Feature},function(e,t){e.exports=ol.style.Style},function(e,t){e.exports=ol.source.VectorTile},function(e,t){e.exports=ol.style.Fill},function(e,t){e.exports=ol.style.Stroke},function(e,t,n){"use strict";(function(e,o){function i(e){return function(e){if(Array.isArray(e))return I(e)}(e)||r(e)||C(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function a(e,t){return l(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o,i,r,a,s=[],l=!0,c=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(o=r.call(n)).done)&&(s.push(o.value),s.length!==t);l=!0);}catch(e){c=!0,i=e}finally{try{if(!l&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw i}}return s}}(e,t)||C(e,t)||s()}function s(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(e){if(Array.isArray(e))return e}function c(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:i}}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 r,a=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,r=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw r}}}}function C(e,t){if(e){if("string"==typeof e)return I(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?I(e,t):void 0}}function I(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129],doc:"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL."},scheme:{type:"enum",values:{xyz:{doc:"Slippy map tilenames scheme."},tms:{doc:"OSGeo spec scheme."}},default:"xyz",doc:"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed."},minzoom:{type:"number",default:0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number",default:22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},promoteId:{type:"promoteId",doc:"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`. If specified as a string for a vector tile source, the same property is used across all its source layers."},volatile:{type:"boolean",default:!1,doc:"A setting to determine whether a source's tiles are cached locally.","sdk-support":{"basic functionality":{android:"9.3.0",ios:"5.10.0"}}},"*":{type:"*",doc:"Other keys to configure the data source."}},source_raster:{type:{required:!0,type:"enum",values:{raster:{doc:"A raster tile source."}},doc:"The type of the source."},url:{type:"string",doc:"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129],doc:"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL."},minzoom:{type:"number",default:0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number",default:22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},tileSize:{type:"number",default:512,units:"pixels",doc:"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},scheme:{type:"enum",values:{xyz:{doc:"Slippy map tilenames scheme."},tms:{doc:"OSGeo spec scheme."}},default:"xyz",doc:"Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},volatile:{type:"boolean",default:!1,doc:"A setting to determine whether a source's tiles are cached locally.","sdk-support":{"basic functionality":{android:"9.3.0",ios:"5.10.0"}}},"*":{type:"*",doc:"Other keys to configure the data source."}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{doc:"A RGB-encoded raster DEM source"}},doc:"The type of the source."},url:{type:"string",doc:"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129],doc:"An array containing the longitude and latitude of the southwest and northeast corners of the source's bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in a source, no tiles outside of the given bounds are requested by Mapbox GL."},minzoom:{type:"number",default:0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number",default:22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},tileSize:{type:"number",default:512,units:"pixels",doc:"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},encoding:{type:"enum",values:{terrarium:{doc:"Terrarium format PNG tiles. See https://aws.amazon.com/es/public-datasets/terrain/ for more info."},mapbox:{doc:"Mapbox Terrain RGB tiles. See https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb for more info."}},default:"mapbox",doc:"The encoding used by this source. Mapbox Terrain RGB is used by default"},volatile:{type:"boolean",default:!1,doc:"A setting to determine whether a source's tiles are cached locally.","sdk-support":{"basic functionality":{android:"9.3.0",ios:"5.10.0"}}},"*":{type:"*",doc:"Other keys to configure the data source."}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{doc:"A GeoJSON data source."}},doc:"The data type of the GeoJSON source."},data:{type:"*",doc:"A URL to a GeoJSON file, or inline GeoJSON."},maxzoom:{type:"number",default:18,doc:"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels)."},attribution:{type:"string",doc:"Contains an attribution to be displayed when the map is shown to a user."},buffer:{type:"number",default:128,maximum:512,minimum:0,doc:"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance."},filter:{type:"*",doc:"An expression for filtering features prior to processing them for rendering."},tolerance:{type:"number",default:.375,doc:"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance)."},cluster:{type:"boolean",default:!1,doc:"If the data is a collection of point features, setting this to true clusters the points by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n * `cluster` Is `true` if the point is a cluster \n * `cluster_id` A unqiue id for the cluster to be used in conjunction with the [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\n * `point_count` Number of original points grouped into this cluster\n * `point_count_abbreviated` An abbreviated point count"},clusterRadius:{type:"number",default:50,minimum:0,doc:"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile."},clusterMaxZoom:{type:"number",doc:"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15."},clusterMinPoints:{type:"number",doc:"Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`."},clusterProperties:{type:"*",doc:'An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from clustered points. Has the form `{"property_name": [operator, map_expression]}`. `operator` is any expression function that accepts at least 2 operands (e.g. `"+"` or `"max"`) — it accumulates the property value from clusters/points the cluster contains; `map_expression` produces the value of a single point.\n\nExample: `{"sum": ["+", ["get", "scalerank"]]}`.\n\nFor more advanced use cases, in place of `operator`, you can use a custom reduce expression that references a special `["accumulated"]` value, e.g.:\n`{"sum": [["+", ["accumulated"], ["get", "sum"]], ["get", "scalerank"]]}`'},lineMetrics:{type:"boolean",default:!1,doc:"Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values."},generateId:{type:"boolean",default:!1,doc:"Whether to generate ids for the geojson features. When enabled, the `feature.id` property will be auto assigned based on its index in the `features` array, over-writing any previous values."},promoteId:{type:"promoteId",doc:"A property to use as a feature id (for feature state). Either a property name, or an object of the form `{: }`."}},source_video:{type:{required:!0,type:"enum",values:{video:{doc:"A video data source."}},doc:"The data type of the video source."},urls:{required:!0,type:"array",value:"string",doc:"URLs to video content in order of preferred format."},coordinates:{required:!0,doc:"Corners of video specified in longitude, latitude pairs.",type:"array",length:4,value:{type:"array",length:2,value:"number",doc:"A single longitude, latitude pair."}}},source_image:{type:{required:!0,type:"enum",values:{image:{doc:"An image data source."}},doc:"The data type of the image source."},url:{required:!0,type:"string",doc:"URL that points to an image."},coordinates:{required:!0,doc:"Corners of image specified in longitude, latitude pairs.",type:"array",length:4,value:{type:"array",length:2,value:"number",doc:"A single longitude, latitude pair."}}},layer:{id:{type:"string",doc:"Unique layer name.",required:!0},type:{type:"enum",values:{fill:{doc:"A filled polygon with an optional stroked border.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},line:{doc:"A stroked line.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},symbol:{doc:"An icon or a text label.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},circle:{doc:"A filled circle.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},heatmap:{doc:"A heatmap.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"fill-extrusion":{doc:"An extruded (3D) polygon.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},raster:{doc:"Raster map textures such as satellite imagery.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},hillshade:{doc:"Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.","sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},background:{doc:"The background color or pattern of the map.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}}},sky:{doc:"A spherical dome around the map that is always rendered behind all other layers.","sdk-support":{"basic functionality":{js:"2.0.0"}}}},doc:"Rendering type of this layer.",required:!0},metadata:{type:"*",doc:"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},source:{type:"string",doc:"Name of a source description to be used for this layer. Required for all layer types except `background`."},"source-layer":{type:"string",doc:"Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources."},minzoom:{type:"number",minimum:0,maximum:24,doc:"The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden."},maxzoom:{type:"number",minimum:0,maximum:24,doc:"The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden."},filter:{type:"filter",doc:"A expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression is not supported in filter expressions."},layout:{type:"layout",doc:"Layout properties for the layer."},paint:{type:"paint",doc:"Default paint properties for this layer."}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background","layout_sky"],layout_background:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_sky:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"constant"}},layout_fill:{"fill-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.","sdk-support":{"basic functionality":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"},"data-driven styling":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_circle:{"circle-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.","sdk-support":{"basic functionality":{js:"1.2.0",android:"9.2.0",ios:"5.9.0",macos:"0.16.0"},"data-driven styling":{js:"1.2.0",android:"9.2.0",ios:"5.9.0",macos:"0.16.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},"property-type":"constant"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},"property-type":"constant"}},layout_line:{"line-cap":{type:"enum",values:{butt:{doc:"A cap with a squared-off end which is drawn to the exact endpoint of the line."},round:{doc:"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line."},square:{doc:"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width."}},default:"butt",doc:"The display of line endings.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"2.3.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-join":{type:"enum",values:{bevel:{doc:"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width."},round:{doc:"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line."},miter:{doc:"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet."}},default:"miter",doc:"The display of lines when joining.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{type:"number",default:2,doc:"Used to automatically convert miter joins to bevel joins for sharp angles.",requires:[{"line-join":"miter"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-round-limit":{type:"number",default:1.05,doc:"Used to automatically convert round joins to miter joins for shallow angles.",requires:[{"line-join":"round"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.","sdk-support":{"basic functionality":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"},"data-driven styling":{js:"1.2.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_symbol:{"symbol-placement":{type:"enum",values:{point:{doc:"The label is placed at the point where the geometry is located."},line:{doc:"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries."},"line-center":{doc:"The label is placed at the center of the line of the geometry. Can only be used on `LineString` and `Polygon` geometries. Note that a single feature in a vector tile may contain multiple line geometries."}},default:"point",doc:"Label placement relative to its geometry.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"`line-center` value":{js:"0.47.0",android:"6.4.0",ios:"4.3.0",macos:"0.10.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-spacing":{type:"number",default:250,minimum:1,units:"pixels",doc:"Distance between two symbol anchors.",requires:[{"symbol-placement":"line"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{type:"boolean",default:!1,doc:"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{type:"number",doc:"Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.","sdk-support":{"basic functionality":{js:"0.53.0",android:"7.4.0",ios:"4.11.0",macos:"0.14.0"},"data-driven styling":{js:"0.53.0",android:"7.4.0",ios:"4.11.0",macos:"0.14.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{type:"enum",values:{auto:{doc:"Sorts symbols by `symbol-sort-key` if set. Otherwise, sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`."},"viewport-y":{doc:"Sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`."},source:{doc:"Sorts symbols by `symbol-sort-key` if set. Otherwise, no sorting is applied; symbols are rendered in the same order as the source data."}},default:"auto",doc:"Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`.","sdk-support":{"basic functionality":{js:"0.49.0",android:"6.6.0",ios:"4.5.0",macos:"0.12.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{type:"boolean",default:!1,doc:"If true, the icon will be visible even if it collides with other previously drawn symbols.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{type:"boolean",default:!1,doc:"If true, other symbols can be visible even if they collide with the icon.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-optional":{type:"boolean",default:!1,doc:"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.",requires:["icon-image","text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{type:"enum",values:{map:{doc:"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line` or `line-center`, aligns icon x-axes with the line."},viewport:{doc:"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`."},auto:{doc:"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`."}},default:"auto",doc:"In combination with `symbol-placement`, determines the rotation behavior of icons.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"`auto` value":{js:"0.25.0",android:"4.2.0",ios:"3.4.0",macos:"0.3.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-size":{type:"number",default:1,minimum:0,units:"factor of the original icon size",doc:"Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{type:"enum",values:{none:{doc:"The icon is displayed at its intrinsic aspect ratio."},width:{doc:"The icon is scaled in the x-dimension to fit the width of the text."},height:{doc:"The icon is scaled in the y-dimension to fit the height of the text."},both:{doc:"The icon is scaled in both x- and y-dimensions."}},default:"none",doc:"Scales the icon to fit around the associated text.",requires:["icon-image","text-field"],"sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"},"stretchable icons":{js:"1.6.0",android:"9.2.0",ios:"5.8.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",doc:"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.",requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],"sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-image":{type:"resolvedImage",doc:"Name of image in sprite to use for drawing an image background.",tokens:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{type:"number",default:0,period:360,units:"degrees",doc:"Rotates the icon clockwise.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.21.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{type:"number",default:2,minimum:0,units:"pixels",doc:"Size of the additional area around the icon bounding box used for detecting symbol collisions.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{type:"boolean",default:!1,doc:"If true, the icon may be flipped to prevent it from being rendered upside-down.",requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],doc:"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{type:"enum",values:{center:{doc:"The center of the icon is placed closest to the anchor."},left:{doc:"The left side of the icon is placed closest to the anchor."},right:{doc:"The right side of the icon is placed closest to the anchor."},top:{doc:"The top of the icon is placed closest to the anchor."},bottom:{doc:"The bottom of the icon is placed closest to the anchor."},"top-left":{doc:"The top left corner of the icon is placed closest to the anchor."},"top-right":{doc:"The top right corner of the icon is placed closest to the anchor."},"bottom-left":{doc:"The bottom left corner of the icon is placed closest to the anchor."},"bottom-right":{doc:"The bottom right corner of the icon is placed closest to the anchor."}},default:"center",doc:"Part of the icon placed closest to the anchor.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{type:"enum",values:{map:{doc:"The icon is aligned to the plane of the map."},viewport:{doc:"The icon is aligned to the plane of the viewport."},auto:{doc:"Automatically matches the value of `icon-rotation-alignment`."}},default:"auto",doc:"Orientation of icon when map is pitched.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{type:"enum",values:{map:{doc:"The text is aligned to the plane of the map."},viewport:{doc:"The text is aligned to the plane of the viewport."},auto:{doc:"Automatically matches the value of `text-rotation-alignment`."}},default:"auto",doc:"Orientation of text when map is pitched.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"},"`auto` value":{js:"0.25.0",android:"4.2.0",ios:"3.4.0",macos:"0.3.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{type:"enum",values:{map:{doc:"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line` or `line-center`, aligns text x-axes with the line."},viewport:{doc:"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`."},auto:{doc:"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line` or `line-center`, this is equivalent to `map`."}},default:"auto",doc:"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"`auto` value":{js:"0.25.0",android:"4.2.0",ios:"3.4.0",macos:"0.3.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-field":{type:"formatted",default:"",tokens:!0,doc:"Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-font":{type:"array",value:"string",default:["Open Sans Regular","Arial Unicode MS Regular"],doc:"Font stack to use for displaying text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-size":{type:"number",default:16,minimum:0,units:"pixels",doc:"Font size.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",doc:"The maximum line width for text wrapping.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{type:"number",default:1.2,units:"ems",doc:"Text leading value for multi-line text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"2.3.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-letter-spacing":{type:"number",default:0,units:"ems",doc:"Text tracking amount.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.40.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-justify":{type:"enum",values:{auto:{doc:"The text is aligned towards the anchor position."},left:{doc:"The text is aligned to the left."},center:{doc:"The text is centered."},right:{doc:"The text is aligned to the right."}},default:"center",doc:"Text justification options.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"},auto:{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{type:"number",units:"ems",default:0,doc:"Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present.","sdk-support":{"basic functionality":{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"},"data-driven styling":{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"}},requires:["text-field"],"property-type":"data-driven",expression:{interpolated:!0,parameters:["zoom","feature"]}},"text-variable-anchor":{type:"array",value:"enum",values:{center:{doc:"The center of the text is placed closest to the anchor."},left:{doc:"The left side of the text is placed closest to the anchor."},right:{doc:"The right side of the text is placed closest to the anchor."},top:{doc:"The top of the text is placed closest to the anchor."},bottom:{doc:"The bottom of the text is placed closest to the anchor."},"top-left":{doc:"The top left corner of the text is placed closest to the anchor."},"top-right":{doc:"The top right corner of the text is placed closest to the anchor."},"bottom-left":{doc:"The bottom left corner of the text is placed closest to the anchor."},"bottom-right":{doc:"The bottom right corner of the text is placed closest to the anchor."}},requires:["text-field",{"symbol-placement":["point"]}],doc:"To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.","sdk-support":{"basic functionality":{js:"0.54.0",android:"7.4.0",ios:"4.10.0",macos:"0.14.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-anchor":{type:"enum",values:{center:{doc:"The center of the text is placed closest to the anchor."},left:{doc:"The left side of the text is placed closest to the anchor."},right:{doc:"The right side of the text is placed closest to the anchor."},top:{doc:"The top of the text is placed closest to the anchor."},bottom:{doc:"The bottom of the text is placed closest to the anchor."},"top-left":{doc:"The top left corner of the text is placed closest to the anchor."},"top-right":{doc:"The top right corner of the text is placed closest to the anchor."},"bottom-left":{doc:"The bottom left corner of the text is placed closest to the anchor."},"bottom-right":{doc:"The bottom right corner of the text is placed closest to the anchor."}},default:"center",doc:"Part of the text placed closest to the anchor.",requires:["text-field",{"!":"text-variable-anchor"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{type:"number",default:45,units:"degrees",doc:"Maximum angle change between adjacent characters.",requires:["text-field",{"symbol-placement":["line","line-center"]}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-writing-mode":{type:"array",value:"enum",values:{horizontal:{doc:"If a text's language supports horizontal writing mode, symbols with point placement would be laid out horizontally."},vertical:{doc:"If a text's language supports vertical writing mode, symbols with point placement would be laid out vertically."}},doc:"The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant.",requires:["text-field",{"symbol-placement":["point"]}],"sdk-support":{"basic functionality":{js:"1.3.0",android:"8.3.0",ios:"5.3.0",macos:"0.15.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotate":{type:"number",default:0,period:360,units:"degrees",doc:"Rotates the text clockwise.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",doc:"Size of the additional area around the text bounding box used for detecting symbol collisions.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-keep-upright":{type:"boolean",default:!0,doc:"If true, the text may be flipped vertically to prevent it from being rendered upside-down.",requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-transform":{type:"enum",values:{none:{doc:"The text is not altered."},uppercase:{doc:"Forces all letters to be displayed in uppercase."},lowercase:{doc:"Forces all letters to be displayed in lowercase."}},default:"none",doc:"Specifies how to capitalize text, similar to the CSS `text-transform` property.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-offset":{type:"array",doc:"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position.",value:"number",units:"ems",length:2,default:[0,0],requires:["text-field",{"!":"text-radial-offset"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.35.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{type:"boolean",default:!1,doc:"If true, the text will be visible even if it collides with other previously drawn symbols.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{type:"boolean",default:!1,doc:"If true, other symbols can be visible even if they collide with the text.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-optional":{type:"boolean",default:!1,doc:"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.",requires:["text-field","icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_raster:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},"property-type":"constant"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{doc:"The layer is shown."},none:{doc:"The layer is not shown."}},default:"visible",doc:"Whether this layer is displayed.","sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},"property-type":"constant"}},filter:{type:"array",value:"*",doc:"A filter selects specific features from a layer."},filter_operator:{type:"enum",values:{"==":{doc:'`["==", key, value]` equality: `feature[key] = value`'},"!=":{doc:'`["!=", key, value]` inequality: `feature[key] ≠ value`'},">":{doc:'`[">", key, value]` greater than: `feature[key] > value`'},">=":{doc:'`[">=", key, value]` greater than or equal: `feature[key] ≥ value`'},"<":{doc:'`["<", key, value]` less than: `feature[key] < value`'},"<=":{doc:'`["<=", key, value]` less than or equal: `feature[key] ≤ value`'},in:{doc:'`["in", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`'},"!in":{doc:'`["!in", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`'},all:{doc:'`["all", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`'},any:{doc:'`["any", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`'},none:{doc:'`["none", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`'},has:{doc:'`["has", key]` `feature[key]` exists'},"!has":{doc:'`["!has", key]` `feature[key]` does not exist'},within:{doc:'`["within", object]` feature geometry is within object geometry'}},doc:"The filter operator."},geometry_type:{type:"enum",values:{Point:{doc:"Filter to point geometries."},LineString:{doc:"Filter to line geometries."},Polygon:{doc:"Filter to polygon geometries."}},doc:"The geometry type for the filter to select."},function:{expression:{type:"expression",doc:"An expression."},stops:{type:"array",doc:"An array of stops.",value:"function_stop"},base:{type:"number",default:1,minimum:0,doc:"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly."},property:{type:"string",doc:"The name of a feature property to use as the function input.",default:"$zoom"},type:{type:"enum",values:{identity:{doc:"Return the input value as the output value."},exponential:{doc:"Generate an output by interpolating between stops just less than and just greater than the function input."},interval:{doc:"Return the output value of the stop just less than the function input."},categorical:{doc:"Return the output value of the stop equal to the function input."}},doc:"The interpolation strategy to use in function evaluation.",default:"exponential"},colorSpace:{type:"enum",values:{rgb:{doc:"Use the RGB color space to interpolate color values"},lab:{doc:"Use the LAB color space to interpolate color values."},hcl:{doc:"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually."}},doc:"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.",default:"rgb"},default:{type:"*",required:!1,doc:"A value to serve as a fallback function result when a value isn't otherwise available. It is used in the following circumstances:\n* In categorical functions, when the feature value does not match any of the stop domain values.\n* In property and zoom-and-property functions, when a feature does not contain a value for the specified property.\n* In identity functions, when the feature value is not valid for the style property (for example, if the function is being used for a `circle-color` property but the feature property value is not a string or not a valid color).\n* In interval or exponential property and zoom-and-property functions, when the feature value is not numeric.\nIf no default is provided, the style property's default is used in these circumstances."}},function_stop:{type:"array",minimum:0,maximum:24,value:["number","color"],length:2,doc:"Zoom level and value pair."},expression:{type:"array",value:"*",minimum:1,doc:"An expression defines a function that can be used for data-driven style properties or feature filters."},expression_name:{doc:"",type:"enum",values:{let:{doc:'Binds expressions to named variables, which can then be referenced in the result expression using ["var", "variable_name"].',group:"Variable binding","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},var:{doc:'References variable bound using "let".',group:"Variable binding","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},literal:{doc:"Provides a literal array or object value.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},array:{doc:"Asserts that the input is an array (optionally with a specific item type and length). If, when the input expression is evaluated, it is not of the asserted type, then this assertion will cause the whole expression to be aborted.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},at:{doc:"Retrieves an item from an array.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},in:{doc:"Determines whether an item exists in an array or a substring exists in a string.",group:"Lookup","sdk-support":{"basic functionality":{js:"1.6.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}}},"index-of":{doc:"Returns the first position at which an item can be found in an array or a substring can be found in a string, or `-1` if the input cannot be found. Accepts an optional index from where to begin the search.",group:"Lookup","sdk-support":{"basic functionality":{js:"1.10.0"}}},slice:{doc:"Returns an item from an array or a substring from a string from a specified start index, or between a start index and an end index if set. The return value is inclusive of the start index but not of the end index.",group:"Lookup","sdk-support":{"basic functionality":{js:"1.10.0"}}},case:{doc:"Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},match:{doc:'Selects the output for which the label value matches the input value, or the fallback value if no match is found. The input can be any expression (for example, `["get", "building_type"]`). Each label must be unique, and must be either:\n - a single literal value; or\n - an array of literal values, the values of which must be all strings or all numbers (for example `[100, 101]` or `["c", "b"]`).\n\nThe input matches if any of the values in the array matches using strict equality, similar to the `"in"` operator.\nIf the input type does not match the type of the labels, the result will be the fallback value.',group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},coalesce:{doc:"Evaluates each expression in turn until the first non-null value is obtained, and returns that value.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},step:{doc:'Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output values ("stops"). The `input` may be any numeric expression (e.g., `["get", "population"]`). Stop inputs must be numeric literals in strictly ascending order. Returns the output value of the stop just less than the input, or the first output if the input is less than the first stop.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.42.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},interpolate:{doc:'Produces continuous, smooth results by interpolating between pairs of input and output values ("stops"). The `input` may be any numeric expression (e.g., `["get", "population"]`). Stop inputs must be numeric literals in strictly ascending order. The output type must be `number`, `array`, or `color`.\n\nInterpolation types:\n- `["linear"]`: Interpolates linearly between the pair of stops just less than and just greater than the input.\n- `["exponential", base]`: Interpolates exponentially between the stops just less than and just greater than the input. `base` controls the rate at which the output increases: higher values make the output increase more towards the high end of the range. With values close to 1 the output increases linearly.\n- `["cubic-bezier", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given control points.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.42.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"interpolate-hcl":{doc:'Produces continuous, smooth results by interpolating between pairs of input and output values ("stops"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the Hue-Chroma-Luminance color space.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.49.0"}}},"interpolate-lab":{doc:'Produces continuous, smooth results by interpolating between pairs of input and output values ("stops"). Works like `interpolate`, but the output type must be `color`, and the interpolation is performed in the CIELAB color space.',group:"Ramps, scales, curves","sdk-support":{"basic functionality":{js:"0.49.0"}}},ln2:{doc:"Returns mathematical constant ln(2).",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},pi:{doc:"Returns the mathematical constant pi.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},e:{doc:"Returns the mathematical constant e.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},typeof:{doc:"Returns a string describing the type of the given value.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},string:{doc:"Asserts that the input value is a string. If multiple values are provided, each one is evaluated in order until a string is obtained. If none of the inputs are strings, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},number:{doc:"Asserts that the input value is a number. If multiple values are provided, each one is evaluated in order until a number is obtained. If none of the inputs are numbers, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},boolean:{doc:"Asserts that the input value is a boolean. If multiple values are provided, each one is evaluated in order until a boolean is obtained. If none of the inputs are booleans, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},object:{doc:"Asserts that the input value is an object. If multiple values are provided, each one is evaluated in order until an object is obtained. If none of the inputs are objects, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},collator:{doc:"Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none is provided, the default locale is used. If the requested locale is not available, the `collator` will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.",group:"Types","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},format:{doc:'Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain a string literal or expression, including an [`\'image\'`](#types-image) expression. Strings may be followed by a style override object that supports the following properties:\n- `"text-font"`: Overrides the font stack specified by the root layout property.\n- `"text-color"`: Overrides the color specified by the root paint property.\n- `"font-scale"`: Applies a scaling factor on `text-size` as specified by the root layout property.',group:"Types","sdk-support":{"basic functionality":{js:"0.48.0",android:"6.7.0",ios:"4.6.0",macos:"0.12.0"},"text-font":{js:"0.48.0",android:"6.7.0",ios:"4.6.0",macos:"0.12.0"},"font-scale":{js:"0.48.0",android:"6.7.0",ios:"4.6.0",macos:"0.12.0"},"text-color":{js:"1.3.0",android:"7.3.0",ios:"4.10.0",macos:"0.14.0"},image:{js:"1.6.0",android:"8.6.0",ios:"5.7.0",macos:"0.15.0"}}},image:{doc:"Returns an `image` type for use in `icon-image`, `*-pattern` entries and as a section in the `format` expression. If set, the `image` argument will check that the requested image exists in the style and will return either the resolved image name or `null`, depending on whether or not the image is currently in the style. This validation process is synchronous and requires the image to have been added to the style before requesting it in the `image` argument.",group:"Types","sdk-support":{"basic functionality":{js:"1.4.0",android:"8.6.0",ios:"5.7.0",macos:"0.15.0"}}},"number-format":{doc:"Converts the input number into a string representation using the providing formatting rules. If set, the `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits` and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.",group:"Types","sdk-support":{"basic functionality":{js:"0.54.0"}}},"to-string":{doc:'Converts the input value to a string. If the input is `null`, the result is `""`. If the input is a boolean, the result is `"true"` or `"false"`. If the input is a number, it is converted to a string as specified by the ["NumberToString" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the ECMAScript Language Specification. If the input is a color, it is converted to a string of the form `"rgba(r,g,b,a)"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. Otherwise, the input is converted to a string in the format specified by the [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.',group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-number":{doc:'Converts the input value to a number, if possible. If the input is `null` or `false`, the result is 0. If the input is `true`, the result is 1. If the input is a string, it is converted to a number as specified by the ["ToNumber Applied to the String Type" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.',group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-boolean":{doc:"Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-rgba":{doc:"Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order.",group:"Color","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"to-color":{doc:"Converts the input value to a color. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.",group:"Types","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},rgb:{doc:"Creates a color value from red, green, and blue components, which must range between 0 and 255, and an alpha component of 1. If any component is out of range, the expression is an error.",group:"Color","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},rgba:{doc:"Creates a color value from red, green, blue components, which must range between 0 and 255, and an alpha component which must range between 0 and 1. If any component is out of range, the expression is an error.",group:"Color","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},get:{doc:"Retrieves a property value from the current feature's properties, or from another object if a second argument is provided. Returns null if the requested property is missing.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},has:{doc:"Tests for the presence of an property value in the current feature's properties, or from another object if a second argument is provided.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},length:{doc:"Gets the length of an array or string.",group:"Lookup","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},properties:{doc:'Gets the feature properties object. Note that in some cases, it may be more efficient to use ["get", "property_name"] directly.',group:"Feature data","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"feature-state":{doc:"Retrieves a property value from the current feature's state. Returns null if the requested property is not present on the feature's state. A feature's state is not part of the GeoJSON or vector tile data, and must be set programmatically on each feature. Features are identified by their `id` attribute, which must be an integer or a string that can be cast to an integer. Note that [\"feature-state\"] can only be used with paint properties that support data-driven styling.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.46.0"}}},"geometry-type":{doc:"Gets the feature's geometry type: `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},id:{doc:"Gets the feature's id, if it has one.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},zoom:{doc:'Gets the current zoom level. Note that in style layout and paint properties, ["zoom"] may only appear as the input to a top-level "step" or "interpolate" expression.',group:"Zoom","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"heatmap-density":{doc:"Gets the kernel density estimation of a pixel in a heatmap layer, which is a relative measure of how many data points are crowded around a particular pixel. Can only be used in the `heatmap-color` property.",group:"Heatmap","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"line-progress":{doc:"Gets the progress along a gradient line. Can only be used in the `line-gradient` property.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.6.0",macos:"0.12.0"}}},"sky-radial-progress":{doc:"Gets the distance of a point on the sky from the sun position. Returns 0 at sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient` property.",group:"sky","sdk-support":{"basic functionality":{js:"2.0.0"}}},accumulated:{doc:"Gets the value of a cluster property accumulated so far. Can only be used in the `clusterProperties` option of a clustered GeoJSON source.",group:"Feature data","sdk-support":{"basic functionality":{js:"0.53.0"}}},"+":{doc:"Returns the sum of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"*":{doc:"Returns the product of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"-":{doc:"For two inputs, returns the result of subtracting the second input from the first. For a single input, returns the result of subtracting it from 0.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"/":{doc:"Returns the result of floating point division of the first input by the second.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"%":{doc:"Returns the remainder after integer division of the first input by the second.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"^":{doc:"Returns the result of raising the first input to the power specified by the second.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},sqrt:{doc:"Returns the square root of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.42.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},log10:{doc:"Returns the base-ten logarithm of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},ln:{doc:"Returns the natural logarithm of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},log2:{doc:"Returns the base-two logarithm of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},sin:{doc:"Returns the sine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},cos:{doc:"Returns the cosine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},tan:{doc:"Returns the tangent of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},asin:{doc:"Returns the arcsine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},acos:{doc:"Returns the arccosine of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},atan:{doc:"Returns the arctangent of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},min:{doc:"Returns the minimum value of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},max:{doc:"Returns the maximum value of the inputs.",group:"Math","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},round:{doc:'Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example, `["round", -1.5]` evaluates to -2.',group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},abs:{doc:"Returns the absolute value of the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},ceil:{doc:"Returns the smallest integer that is greater than or equal to the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},floor:{doc:"Returns the largest integer that is less than or equal to the input.",group:"Math","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},distance:{doc:"Returns the shortest distance in meters between the evaluated feature and the input geometry. The input value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries, particularly below zoom level 13.",group:"Math","sdk-support":{"basic functionality":{android:"9.2.0",ios:"5.9.0",macos:"0.16.0"}}},"==":{doc:"Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},"!=":{doc:"Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},">":{doc:"Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},"<":{doc:"Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},">=":{doc:"Returns `true` if the first input is greater than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},"<=":{doc:"Returns `true` if the first input is less than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},collator:{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}},all:{doc:"Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and no further input expressions are evaluated.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},any:{doc:"Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true` and no further input expressions are evaluated.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"!":{doc:"Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.",group:"Decision","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},within:{doc:"Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry, `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Supported features for evaluation:\n- `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\n- `LineString`: Returns `false` if any part of a line falls outside the boundary, the line intersects the boundary, or a line's endpoint is on the boundary.",group:"Decision","sdk-support":{"basic functionality":{js:"1.9.0",android:"9.1.0",ios:"5.8.0",macos:"0.15.0"}}},"is-supported-script":{doc:"Returns `true` if the input string is expected to render legibly. Returns `false` if the input string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use in Mapbox GL JS).",group:"String","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.6.0"}}},upcase:{doc:"Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.",group:"String","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},downcase:{doc:"Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.",group:"String","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},concat:{doc:"Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a string as if by `to-string`.",group:"String","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}}},"resolved-locale":{doc:"Returns the IETF language tag of the locale being used by the provided `collator`. This can be used to determine the default system locale, or to determine if a requested locale was successfully loaded.",group:"String","sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.2.0",macos:"0.9.0"}}}}},fog:{range:{type:"array",default:[.5,10],minimum:-20,maximum:20,length:2,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},doc:"The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away.",example:[.5,10],"sdk-support":{"basic functionality":{js:"2.3.0"}}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"The color of the fog. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn.","sdk-support":{"basic functionality":{js:"2.3.0"}}},"horizon-blend":{type:"number","property-type":"data-constant",default:.1,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Horizon blend applies a smooth fade from the color of the fog to the color of the sky. A value of zero leaves a sharp transition from fog to sky. Increasing the value blends the color of fog into increasingly high angles of the sky.","sdk-support":{"basic functionality":{js:"2.3.0"}}}},light:{anchor:{type:"enum",default:"viewport",values:{map:{doc:"The position of the light source is aligned to the rotation of the map."},viewport:{doc:"The position of the light source is aligned to the rotation of the viewport."}},"property-type":"data-constant",transition:!1,expression:{interpolated:!1,parameters:["zoom"]},doc:"Whether extruded geometries are lit relative to the map or viewport.",example:"map","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},position:{type:"array",default:[1.15,210,30],length:3,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},doc:"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).",example:[1.5,90,80],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Color tint for lighting extruded geometries.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}},intensity:{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}}}},terrain:{source:{type:"string",doc:"Name of a source of `raster_dem` type to be used for terrain elevation.",required:!0,"sdk-support":{"basic functionality":{js:"2.0.0"}}},exaggeration:{type:"number","property-type":"data-constant",default:1,minimum:0,maximum:1e3,expression:{interpolated:!0,parameters:["zoom"]},transition:!0,doc:"Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value.","sdk-support":{"basic functionality":{js:"2.0.0"}}}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background","paint_sky"],paint_fill:{"fill-antialias":{type:"boolean",default:!0,doc:"Whether or not the fill should be antialiased.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.21.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{type:"color",default:"#000000",doc:"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.",transition:!0,requires:[{"!":"fill-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.19.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{type:"color",doc:"The outline color of the fill. Matches the value of `fill-color` if unspecified.",transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.19.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{type:"enum",values:{map:{doc:"The fill is translated relative to the map."},viewport:{doc:"The fill is translated relative to the viewport."}},doc:"Controls the frame of reference for `fill-translate`.",default:"map",requires:["fill-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.49.0",android:"6.5.0",macos:"0.11.0",ios:"4.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available.",transition:!0,"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{type:"color",default:"#000000",doc:"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.",transition:!0,requires:[{"!":"fill-extrusion-pattern"}],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{type:"enum",values:{map:{doc:"The fill extrusion is translated relative to the map."},viewport:{doc:"The fill extrusion is translated relative to the viewport."}},doc:"Controls the frame of reference for `fill-extrusion-translate`.",default:"map",requires:["fill-extrusion-translate"],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.49.0",android:"6.5.0",macos:"0.11.0",ios:"4.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{type:"number",default:0,minimum:0,units:"meters",doc:"The height with which to extrude this layer.",transition:!0,"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{type:"number",default:0,minimum:0,units:"meters",doc:"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.",transition:!0,requires:["fill-extrusion-height"],"sdk-support":{"basic functionality":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"},"data-driven styling":{js:"0.27.0",android:"5.1.0",ios:"3.6.0",macos:"0.5.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{type:"boolean",default:!0,doc:"Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down.",transition:!1,"sdk-support":{"basic functionality":{js:"0.50.0",ios:"4.7.0",macos:"0.13.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_line:{"line-opacity":{type:"number",doc:"The opacity at which the line will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{type:"color",doc:"The color with which the line will be drawn.",default:"#000000",transition:!0,requires:[{"!":"line-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.23.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{type:"enum",values:{map:{doc:"The line is translated relative to the map."},viewport:{doc:"The line is translated relative to the viewport."}},doc:"Controls the frame of reference for `line-translate`.",default:"map",requires:["line-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-width":{type:"number",default:1,minimum:0,transition:!0,units:"pixels",doc:"Stroke thickness.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{type:"number",default:0,minimum:0,doc:"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.",transition:!0,units:"pixels","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{type:"number",default:0,doc:"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.",transition:!0,units:"pixels","sdk-support":{"basic functionality":{js:"0.12.1",android:"3.0.0",ios:"3.1.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Blur applied to the line, in pixels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{type:"array",value:"number",doc:"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels.",minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"2.3.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.49.0",android:"6.5.0",macos:"0.11.0",ios:"4.4.0"}},expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{type:"color",doc:'Defines a gradient with which to color a line feature. Can only be used with GeoJSON sources that specify `"lineMetrics": true`.',transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}],"sdk-support":{"basic functionality":{js:"0.45.0",android:"6.5.0",ios:"4.4.0",macos:"0.11.0"},"data-driven styling":{}},expression:{interpolated:!0,parameters:["line-progress"]},"property-type":"color-ramp"}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,transition:!0,units:"pixels",doc:"Circle radius.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.18.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{type:"color",default:"#000000",doc:"The fill color of the circle.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.18.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{type:"number",default:0,doc:"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.20.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{type:"number",doc:"The opacity at which the circle will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.20.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{type:"enum",values:{map:{doc:"The circle is translated relative to the map."},viewport:{doc:"The circle is translated relative to the viewport."}},doc:"Controls the frame of reference for `circle-translate`.",default:"map",requires:["circle-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{type:"enum",values:{map:{doc:"Circles are scaled according to their apparent distance to the camera."},viewport:{doc:"Circles are not scaled."}},default:"map",doc:"Controls the scaling behavior of the circle when the map is pitched.","sdk-support":{"basic functionality":{js:"0.21.0",android:"4.2.0",ios:"3.4.0",macos:"0.2.1"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{type:"enum",values:{map:{doc:"The circle is aligned to the plane of the map."},viewport:{doc:"The circle is aligned to the plane of the viewport."}},default:"viewport",doc:"Orientation of circle when map is pitched.","sdk-support":{"basic functionality":{js:"0.39.0",android:"5.2.0",ios:"3.7.0",macos:"0.6.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.","sdk-support":{"basic functionality":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{type:"color",default:"#000000",doc:"The stroke color of the circle.",transition:!0,"sdk-support":{"basic functionality":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{type:"number",doc:"The opacity of the circle's stroke.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"},"data-driven styling":{js:"0.29.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,transition:!0,units:"pixels",doc:"Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},"data-driven styling":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{type:"number",default:1,minimum:0,transition:!1,doc:"A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},"data-driven styling":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{type:"number",default:1,minimum:0,transition:!0,doc:"Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level.","sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],doc:'Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `["heatmap-density"]` as input.',transition:!1,"sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"},"data-driven styling":{}},expression:{interpolated:!0,parameters:["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{type:"number",doc:"The global opacity at which the heatmap layer will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.41.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_symbol:{"icon-opacity":{doc:"The opacity at which the icon will be drawn.",type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{type:"color",default:"#000000",transition:!0,doc:"The color of the icon. This can only be used with sdf icons.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,doc:"The color of the icon's halo. Icon halos can only be used with SDF icons.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Distance of halo to the icon outline.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Fade out the halo towards the outside.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.",requires:["icon-image"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{type:"enum",values:{map:{doc:"Icons are translated relative to the map."},viewport:{doc:"Icons are translated relative to the viewport."}},doc:"Controls the frame of reference for `icon-translate`.",default:"map",requires:["icon-image","icon-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-opacity":{type:"number",doc:"The opacity at which the text will be drawn.",default:1,minimum:0,maximum:1,transition:!0,requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{type:"color",doc:"The color with which the text will be drawn.",default:"#000000",transition:!0,overridable:!0,requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,doc:"The color of the text's halo, which helps it stand out from backgrounds.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",doc:"The halo's fadeout distance towards the outside.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{js:"0.33.0",android:"5.0.0",ios:"3.5.0",macos:"0.4.0"}},expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",doc:"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.",requires:["text-field"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{type:"enum",values:{map:{doc:"The text is translated relative to the map."},viewport:{doc:"The text is translated relative to the viewport."}},doc:"Controls the frame of reference for `text-translate`.",default:"map",requires:["text-field","text-translate"],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_raster:{"raster-opacity":{type:"number",doc:"The opacity at which the image will be drawn.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{type:"number",default:0,period:360,transition:!0,units:"degrees",doc:"Rotates hues around the color wheel.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{type:"number",doc:"Increase or reduce the brightness of the image. The value is the minimum brightness.",default:0,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{type:"number",doc:"Increase or reduce the brightness of the image. The value is the maximum brightness.",default:1,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-saturation":{type:"number",doc:"Increase or reduce the saturation of the image.",default:0,minimum:-1,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-contrast":{type:"number",doc:"Increase or reduce the contrast of the image.",default:0,minimum:-1,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-resampling":{type:"enum",doc:"The resampling/interpolation method to use for overscaling, also known as texture magnification filter",values:{linear:{doc:"(Bi)linear filtering interpolates pixel values using the weighted average of the four closest original source pixels creating a smooth but blurry look when overscaled"},nearest:{doc:"Nearest neighbor filtering interpolates pixel values using the nearest original source pixel creating a sharp but pixelated look when overscaled"}},default:"linear","sdk-support":{"basic functionality":{js:"0.47.0",android:"6.3.0",ios:"4.2.0",macos:"0.9.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{type:"number",default:300,minimum:0,transition:!1,units:"milliseconds",doc:"Fade duration when a new tile is added.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,doc:"The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map`.",transition:!1,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{type:"enum",values:{map:{doc:"The hillshade illumination is relative to the north direction."},viewport:{doc:"The hillshade illumination is relative to the top of the viewport."}},default:"viewport",doc:"Direction of light source when map is rotated.","sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{type:"number",doc:"Intensity of the hillshade",default:.5,minimum:0,maximum:1,transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{type:"color",default:"#000000",doc:"The shading color of areas that face away from the light source.",transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",doc:"The shading color of areas that faces towards the light source.",transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{type:"color",default:"#000000",doc:"The shading color used to accentuate rugged terrain like sharp cliffs and gorges.",transition:!0,"sdk-support":{"basic functionality":{js:"0.43.0",android:"6.0.0",ios:"4.0.0",macos:"0.7.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_background:{"background-color":{type:"color",default:"#000000",doc:"The color with which the background will be drawn.",transition:!0,requires:[{"!":"background-pattern"}],"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"background-pattern":{type:"resolvedImage",transition:!0,doc:"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.","sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"},"data-driven styling":{}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity at which the background will be drawn.",transition:!0,"sdk-support":{"basic functionality":{js:"0.10.0",android:"2.0.1",ios:"2.0.0",macos:"0.1.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_sky:{"sky-type":{type:"enum",values:{gradient:{doc:"Renders the sky with a gradient that can be configured with `sky-gradient-radius` and `sky-gradient`."},atmosphere:{doc:"Renders the sky with a simulated atmospheric scattering algorithm, the sun direction can be attached to the light position or explicitly set through `sky-atmosphere-sun`."}},default:"atmosphere",doc:"The type of the sky","sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun":{type:"array",value:"number",length:2,units:"degrees",minimum:[0,0],maximum:[360,180],transition:!1,doc:"Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0° is directly above, at zenith, and 90° at the horizon. When this property is ommitted, the sun center is directly inherited from the light position.","sdk-support":{"basic functionality":{js:"2.0.0"}},requires:[{"sky-type":"atmosphere"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun-intensity":{type:"number",requires:[{"sky-type":"atmosphere"}],default:10,minimum:0,maximum:100,transition:!1,doc:"Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky.","sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"data-constant"},"sky-gradient-center":{type:"array",requires:[{"sky-type":"gradient"}],value:"number",default:[0,0],length:2,units:"degrees",minimum:[0,0],maximum:[360,180],transition:!1,doc:"Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0° north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0° is directly above, at zenith, and 90° at the horizon.","sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-gradient-radius":{type:"number",requires:[{"sky-type":"gradient"}],default:90,minimum:0,maximum:180,transition:!1,doc:"The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`.","sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-gradient":{type:"color",default:["interpolate",["linear"],["sky-radial-progress"],.8,"#87ceeb",1,"white"],doc:"Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`.",transition:!1,requires:[{"sky-type":"gradient"}],"sdk-support":{"basic functionality":{js:"2.0.0"},"data-driven styling":{}},expression:{interpolated:!0,parameters:["sky-radial-progress"]},"property-type":"color-ramp"},"sky-atmosphere-halo-color":{type:"color",default:"white",doc:"A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer.",transition:!1,requires:[{"sky-type":"atmosphere"}],"sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"data-constant"},"sky-atmosphere-color":{type:"color",default:"white",doc:"A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density.",transition:!1,requires:[{"sky-type":"atmosphere"}],"sdk-support":{"basic functionality":{js:"2.0.0"}},"property-type":"data-constant"},"sky-opacity":{type:"number",default:1,minimum:0,maximum:1,doc:"The opacity of the entire sky layer.",transition:!0,"sdk-support":{"basic functionality":{js:"2.0.0"}},expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds",doc:"Time allotted for transitions to complete."},delay:{type:"number",default:0,minimum:0,units:"milliseconds",doc:"Length of time before a transition begins."}},"property-type":{"data-driven":{type:"property-type",doc:"Property is interpolable and can be represented using a property expression."},"cross-faded":{type:"property-type",doc:"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms."},"cross-faded-data-driven":{type:"property-type",doc:"Property is non-interpolable; rather, its values will be cross-faded to smoothly transition between integer zooms. It can be represented using a property expression."},"color-ramp":{type:"property-type",doc:"Property should be specified using a color ramp from which the output color can be sampled based on a property calculation."},"data-constant":{type:"property-type",doc:"Property is interpolable but cannot be represented using a property expression."},constant:{type:"property-type",doc:"Property is constant across all zoom levels and property values."}},promoteId:{"*":{type:"string",doc:"A name of a feature property to use as ID for feature state."}}};var E="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{};function _(e){var t={exports:{}};return e(t,t.exports),t.exports}function S(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.')} +/*! https://mths.be/punycode v1.3.2 by @mathias */var M=_((function(e,t){!function(n){var o=t&&!t.nodeType&&t,i=e&&!e.nodeType&&e,r="object"==b(E)&&E;r.global!==r&&r.window!==r&&r.self!==r||(n=r);var a,s,l=2147483647,c=/^xn--/,u=/[^\x20-\x7E]/,d=/[\x2E\u3002\uFF0E\uFF61]/g,p={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=Math.floor,g=String.fromCharCode;function m(e){throw RangeError(p[e])}function f(e,t){for(var n=e.length,o=[];n--;)o[n]=t(e[n]);return o}function y(e,t){var n=e.split("@"),o="";return n.length>1&&(o=n[0]+"@",e=n[1]),o+f((e=e.replace(d,".")).split("."),t).join(".")}function A(e){for(var t,n,o=[],i=0,r=e.length;i=55296&&t<=56319&&i65535&&(t+=g((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=g(e)})).join("")}function C(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function I(e,t,n){var o=0;for(e=n?h(e/700):e>>1,e+=h(e/t);e>455;o+=36)e=h(e/35);return h(o+36*e/(e+38))}function w(e){var t,n,o,i,r,a,s,c,u,d,p,g=[],f=e.length,y=0,A=128,C=72;for((n=e.lastIndexOf("-"))<0&&(n=0),o=0;o=128&&m("not-basic"),g.push(e.charCodeAt(o));for(i=n>0?n+1:0;i=f&&m("invalid-input"),((c=(p=e.charCodeAt(i++))-48<10?p-22:p-65<26?p-65:p-97<26?p-97:36)>=36||c>h((l-y)/a))&&m("overflow"),y+=c*a,!(c<(u=s<=C?1:s>=C+26?26:s-C));s+=36)a>h(l/(d=36-u))&&m("overflow"),a*=d;C=I(y-r,t=g.length+1,0==r),h(y/t)>l-A&&m("overflow"),A+=h(y/t),y%=t,g.splice(y++,0,A)}return v(g)}function _(e){var t,n,o,i,r,a,s,c,u,d,p,f,y,v,b,w=[];for(f=(e=A(e)).length,t=128,n=0,r=72,a=0;a=t&&ph((l-n)/(y=o+1))&&m("overflow"),n+=(s-t)*y,t=s,a=0;al&&m("overflow"),p==t){for(c=n,u=36;!(c<(d=u<=r?1:u>=r+26?26:u-r));u+=36)b=c-d,v=36-d,w.push(g(C(d+b%v,0))),c=h(b/v);w.push(g(C(c,0))),r=I(n,y,o==i),n=0,++o}++n,++t}return w.join("")}if(a={version:"1.3.2",ucs2:{decode:A,encode:v},decode:w,encode:_,toASCII:function(e){return y(e,(function(e){return u.test(e)?"xn--"+_(e):e}))},toUnicode:function(e){return y(e,(function(e){return c.test(e)?w(e.slice(4).toLowerCase()):e}))}},o&&i)if(e.exports==o)i.exports=a;else for(s in a)a.hasOwnProperty(s)&&(o[s]=a[s]);else n.punycode=a}(E)})),P=function(e){return"string"==typeof e},x=function(e){return"object"===b(e)&&null!==e},k=function(e){return null===e},G=function(e){return null==e};function R(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var T=function(e,t,n,o){t=t||"&",n=n||"=";var i={};if("string"!=typeof e||0===e.length)return i;var r=/\+/g;e=e.split(t);var a=1e3;o&&"number"==typeof o.maxKeys&&(a=o.maxKeys);var s=e.length;a>0&&s>a&&(s=a);for(var l=0;l=0?(c=h.substr(0,g),u=h.substr(g+1)):(c=h,u=""),d=decodeURIComponent(c),p=decodeURIComponent(u),R(i,d)?Array.isArray(i[d])?i[d].push(p):i[d]=[i[d],p]:i[d]=p}return i},O=function(e){switch(b(e)){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}},L=function(e,t,n,o){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"===b(e)?Object.keys(e).map((function(o){var i=encodeURIComponent(O(o))+n;return Array.isArray(e[o])?e[o].map((function(e){return i+encodeURIComponent(O(e))})).join(t):i+encodeURIComponent(O(e[o]))})).join(t):o?encodeURIComponent(O(o))+n+encodeURIComponent(O(e)):""},D=_((function(e,t){t.decode=t.parse=T,t.encode=t.stringify=L}));function N(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var j=/^([a-z0-9.+-]+:)/i,U=/:[0-9]*$/,B=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,F=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),z=["'"].concat(F),V=["%","/","?",";","#"].concat(z),q=["/","?","#"],W=/^[+a-z0-9A-Z_-]{0,63}$/,H=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,Y={javascript:!0,"javascript:":!0},J={javascript:!0,"javascript:":!0},Z={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function K(e,t,n){if(e&&x(e)&&e instanceof N)return e;var o=new N;return o.parse(e,t,n),o}N.prototype.parse=function(e,t,n){if(!P(e))throw new TypeError("Parameter 'url' must be a string, not "+b(e));var o=e.indexOf("?"),i=-1!==o&&o127?C+="x":C+=v[I];if(!C.match(W)){var E=y.slice(0,g),_=y.slice(g+1),S=v.match(H);S&&(E.push(S[1]),_.unshift(S[2])),_.length&&(a="/"+_.join(".")+a),this.hostname=E.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),f||(this.hostname=M.toASCII(this.hostname));var x=this.port?":"+this.port:"",k=this.hostname||"";this.host=k+x,this.href+=this.host,f&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==a[0]&&(a="/"+a))}if(!Y[c])for(g=0,A=z.length;g0)&&n.host.split("@"))&&(n.auth=_.shift(),n.host=n.hostname=_.shift());return n.search=e.search,n.query=e.query,k(n.pathname)&&k(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!v.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var I=v.slice(-1)[0],b=(n.host||e.host||v.length>1)&&("."===I||".."===I)||""===I,w=0,E=v.length;E>=0;E--)"."===(I=v[E])?v.splice(E,1):".."===I?(v.splice(E,1),w++):w&&(v.splice(E,1),w--);if(!y&&!A)for(;w--;w)v.unshift("..");!y||""===v[0]||v[0]&&"/"===v[0].charAt(0)||v.unshift(""),b&&"/"!==v.join("/").substr(-1)&&v.push("");var _,S=""===v[0]||v[0]&&"/"===v[0].charAt(0);C&&(n.hostname=n.host=S?"":v.length?v.shift():"",(_=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=_.shift(),n.host=n.hostname=_.shift()));return(y=y||n.host&&v.length)&&!S&&v.unshift(""),v.length?n.pathname=v.join("/"):(n.pathname=null,n.path=null),k(n.pathname)&&k(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},N.prototype.parseHost=function(){var e=this.host,t=U.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};function X(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:[];p(this,e),this.parent=t,this.bindings={};var o,i=v(n);try{for(i.s();!(o=i.n()).done;){var r=a(o.value,2),s=r[0],l=r[1];this.bindings[s]=l}}catch(e){i.e(e)}finally{i.f()}}return u(e,[{key:"concat",value:function(t){return new e(this,t)}},{key:"get",value:function(e){if(this.bindings[e])return this.bindings[e];if(this.parent)return this.parent.get(e);throw new Error("".concat(e," not found in scope."))}},{key:"has",value:function(e){return!!this.bindings[e]||!!this.parent&&this.parent.has(e)}}])}(),ee={kind:"null"},te={kind:"number"},ne={kind:"string"},oe={kind:"boolean"},ie={kind:"color"},re={kind:"object"},ae={kind:"value"},se={kind:"collator"},le={kind:"formatted"},ce={kind:"resolvedImage"};function ue(e,t){return{kind:"array",itemType:e,N:t}}function de(e){if("array"===e.kind){var t=de(e.itemType);return"number"==typeof e.N?"array<".concat(t,", ").concat(e.N,">"):"value"===e.itemType.kind?"array":"array<".concat(t,">")}return e.kind}var pe=[ee,te,ne,oe,ie,le,re,ue(ae),ce];function he(e,t){if("error"===t.kind)return null;if("array"===e.kind){if("array"===t.kind&&(0===t.N&&"value"===t.itemType.kind||!he(e.itemType,t.itemType))&&("number"!=typeof e.N||e.N===t.N))return null}else{if(e.kind===t.kind)return null;if("value"===e.kind)for(var n=0,o=pe;n255?255:e}function i(e){return e<0?0:e>1?1:e}function r(e){return"%"===e[e.length-1]?o(parseFloat(e)/100*255):o(parseInt(e))}function a(e){return"%"===e[e.length-1]?i(parseFloat(e)/100):i(parseFloat(e))}function s(e,t,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?e+(t-e)*n*6:2*n<1?t:3*n<2?e+(t-e)*(2/3-n)*6:e}try{t.parseCSSColor=function(e){var t,i=e.replace(/ /g,"").toLowerCase();if(i in n)return n[i].slice();if("#"===i[0])return 4===i.length?(t=parseInt(i.substr(1),16))>=0&&t<=4095?[(3840&t)>>4|(3840&t)>>8,240&t|(240&t)>>4,15&t|(15&t)<<4,1]:null:7===i.length&&(t=parseInt(i.substr(1),16))>=0&&t<=16777215?[(16711680&t)>>16,(65280&t)>>8,255&t,1]:null;var l=i.indexOf("("),c=i.indexOf(")");if(-1!==l&&c+1===i.length){var u=i.substr(0,l),d=i.substr(l+1,c-(l+1)).split(","),p=1;switch(u){case"rgba":if(4!==d.length)return null;p=a(d.pop());case"rgb":return 3!==d.length?null:[r(d[0]),r(d[1]),r(d[2]),p];case"hsla":if(4!==d.length)return null;p=a(d.pop());case"hsl":if(3!==d.length)return null;var h=(parseFloat(d[0])%360+360)%360/360,g=a(d[1]),m=a(d[2]),f=m<=.5?m*(g+1):m+g-m*g,y=2*m-f;return[o(255*s(y,f,h+1/3)),o(255*s(y,f,h)),o(255*s(y,f,h-1/3)),p];default:return null}}return null}}catch(e){}})),ye=function(){function e(t,n,o){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;p(this,e),this.r=t,this.g=n,this.b=o,this.a=i}return u(e,[{key:"toString",value:function(){var e=a(this.toArray(),4),t=e[0],n=e[1],o=e[2],i=e[3];return"rgba(".concat(Math.round(t),",").concat(Math.round(n),",").concat(Math.round(o),",").concat(i,")")}},{key:"toArray",value:function(){var e=this.r,t=this.g,n=this.b,o=this.a;return 0===o?[0,0,0,0]:[255*e/o,255*t/o,255*n/o,o]}}],[{key:"parse",value:function(t){if(t){if(t instanceof e)return t;if("string"==typeof t){var n=fe.parseCSSColor(t);if(n)return new e(n[0]/255*n[3],n[1]/255*n[3],n[2]/255*n[3],n[3])}}}}])}();ye.black=new ye(0,0,0,1),ye.white=new ye(1,1,1,1),ye.transparent=new ye(0,0,0,0),ye.red=new ye(1,0,0,1),ye.blue=new ye(0,0,1,1);var Ae=function(){return u((function e(t,n,o){p(this,e),this.sensitivity=t?n?"variant":"case":n?"accent":"base",this.locale=o,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"})}),[{key:"compare",value:function(e,t){return this.collator.compare(e,t)}},{key:"resolvedLocale",value:function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale}}])}(),ve=u((function e(t,n,o,i,r){p(this,e),this.text=t,this.image=n,this.scale=o,this.fontStack=i,this.textColor=r})),Ce=function(){function e(t){p(this,e),this.sections=t}return u(e,[{key:"isEmpty",value:function(){return 0===this.sections.length||!this.sections.some((function(e){return 0!==e.text.length||e.image&&0!==e.image.name.length}))}},{key:"toString",value:function(){return 0===this.sections.length?"":this.sections.map((function(e){return e.text})).join("")}},{key:"serialize",value:function(){var e,t=["format"],n=v(this.sections);try{for(n.s();!(e=n.n()).done;){var o=e.value;if(o.image)t.push(["image",o.image.name]);else{t.push(o.text);var i={};o.fontStack&&(i["text-font"]=["literal",o.fontStack.split(",")]),o.scale&&(i["font-scale"]=o.scale),o.textColor&&(i["text-color"]=["rgba"].concat(o.textColor.toArray())),t.push(i)}}}catch(e){n.e(e)}finally{n.f()}return t}}],[{key:"fromString",value:function(t){return new e([new ve(t,null,null,null,null)])}},{key:"factory",value:function(t){return t instanceof e?t:e.fromString(t)}}])}(),Ie=function(){function e(t){p(this,e),this.name=t.name,this.available=t.available}return u(e,[{key:"toString",value:function(){return this.name}},{key:"serialize",value:function(){return["image",this.name]}}],[{key:"fromString",value:function(t){return t?new e({name:t,available:!1}):null}}])}();function be(e,t,n,o){return"number"==typeof e&&e>=0&&e<=255&&"number"==typeof t&&t>=0&&t<=255&&"number"==typeof n&&n>=0&&n<=255?void 0===o||"number"==typeof o&&o>=0&&o<=1?null:"Invalid rgba value [".concat([e,t,n,o].join(", "),"]: 'a' must be between 0 and 1."):"Invalid rgba value [".concat(("number"==typeof o?[e,t,n,o]:[e,t,n]).join(", "),"]: 'r', 'g', and 'b' must be between 0 and 255.")}function we(e){if(null===e)return!0;if("string"==typeof e)return!0;if("boolean"==typeof e)return!0;if("number"==typeof e)return!0;if(e instanceof ye)return!0;if(e instanceof Ae)return!0;if(e instanceof Ce)return!0;if(e instanceof Ie)return!0;if(Array.isArray(e)){var t,n=v(e);try{for(n.s();!(t=n.n()).done;){if(!we(t.value))return!1}}catch(e){n.e(e)}finally{n.f()}return!0}if("object"===b(e)){for(var o in e)if(!we(e[o]))return!1;return!0}return!1}function Ee(e){if(null===e)return ee;if("string"==typeof e)return ne;if("boolean"==typeof e)return oe;if("number"==typeof e)return te;if(e instanceof ye)return ie;if(e instanceof Ae)return se;if(e instanceof Ce)return le;if(e instanceof Ie)return ce;if(Array.isArray(e)){var t,n,o=e.length,i=v(e);try{for(i.s();!(n=i.n()).done;){var r=Ee(n.value);if(t){if(t===r)continue;t=ae;break}t=r}}catch(e){i.e(e)}finally{i.f()}return ue(t||ae,o)}return re}function _e(e){var t=b(e);return null===e?"":"string"===t||"number"===t||"boolean"===t?String(e):e instanceof ye||e instanceof Ce||e instanceof Ie?e.toString():JSON.stringify(e)}var Se=function(){function e(t,n){p(this,e),this.type=t,this.value=n}return u(e,[{key:"evaluate",value:function(){return this.value}},{key:"eachChild",value:function(){}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){return"array"===this.type.kind||"object"===this.type.kind?["literal",this.value]:this.value instanceof ye?["rgba"].concat(this.value.toArray()):this.value instanceof Ce?this.value.serialize():this.value}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("'literal' expression requires exactly one argument, but found ".concat(t.length-1," instead."));if(!we(t[1]))return n.error("invalid value");var o=t[1],i=Ee(o),r=n.expectedType;return"array"!==i.kind||0!==i.N||!r||"array"!==r.kind||"number"==typeof r.N&&0!==r.N||(i=r),new e(i,o)}}])}(),Me=function(){return u((function e(t){p(this,e),this.name="ExpressionEvaluationError",this.message=t}),[{key:"toJSON",value:function(){return this.message}}])}(),Pe={string:ne,number:te,boolean:oe,object:re},xe=function(){function e(t,n){p(this,e),this.type=t,this.args=n}return u(e,[{key:"evaluate",value:function(e){for(var t=0;t1)&&t.push(o)}}return t.concat(this.args.map((function(e){return e.serialize()})))}}],[{key:"parse",value:function(t,n){if(t.length<2)return n.error("Expected at least one argument.");var o,i=1,r=t[0];if("array"===r){var a,s;if(t.length>2){var l=t[1];if("string"!=typeof l||!(l in Pe)||"object"===l)return n.error('The item type argument of "array" must be one of string, number, boolean',1);a=Pe[l],i++}else a=ae;if(t.length>3){if(null!==t[2]&&("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return n.error('The length argument to "array" must be a positive integer literal',2);s=t[2],i++}o=ue(a,s)}else o=Pe[r];for(var c=[];i-1),n}},{key:"eachChild",value:function(e){e(this.input)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){return["image",this.input.serialize()]}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("Expected two arguments.");var o=n.parse(t[1],1,ne);return o?new e(o):n.error("No image name provided.")}}])}(),Re={"to-boolean":oe,"to-color":ie,"to-number":te,"to-string":ne},Te=function(){function e(t,n){p(this,e),this.type=t,this.args=n}return u(e,[{key:"evaluate",value:function(e){if("boolean"===this.type.kind)return Boolean(this.args[0].evaluate(e));if("color"===this.type.kind){var t,n,o,i=v(this.args);try{for(i.s();!(o=i.n()).done;){if(t=o.value.evaluate(e),n=null,t instanceof ye)return t;if("string"==typeof t){var r=e.parseColor(t);if(r)return r}else if(Array.isArray(t)&&!(n=t.length<3||t.length>4?"Invalid rbga value ".concat(JSON.stringify(t),": expected an array containing either three or four numeric values."):be(t[0],t[1],t[2],t[3])))return new ye(t[0]/255,t[1]/255,t[2]/255,t[3])}}catch(e){i.e(e)}finally{i.f()}throw new Me(n||"Could not parse color from value '".concat("string"==typeof t?t:String(JSON.stringify(t)),"'"))}if("number"===this.type.kind){var a,s=null,l=v(this.args);try{for(l.s();!(a=l.n()).done;){if(null===(s=a.value.evaluate(e)))return 0;var c=Number(s);if(!isNaN(c))return c}}catch(e){l.e(e)}finally{l.f()}throw new Me("Could not convert ".concat(JSON.stringify(s)," to number."))}return"formatted"===this.type.kind?Ce.fromString(_e(this.args[0].evaluate(e))):"resolvedImage"===this.type.kind?Ie.fromString(_e(this.args[0].evaluate(e))):_e(this.args[0].evaluate(e))}},{key:"eachChild",value:function(e){this.args.forEach(e)}},{key:"outputDefined",value:function(){return this.args.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){if("formatted"===this.type.kind)return new ke([{content:this.args[0],scale:null,font:null,textColor:null}]).serialize();if("resolvedImage"===this.type.kind)return new Ge(this.args[0]).serialize();var e=["to-".concat(this.type.kind)];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(t.length<2)return n.error("Expected at least one argument.");var o=t[0];if(("to-boolean"===o||"to-string"===o)&&2!==t.length)return n.error("Expected one argument.");for(var i=Re[o],r=[],a=1;a=t[2])&&(!(e[1]<=t[1])&&!(e[3]>=t[3])))}function Be(e,t){var n,o=(180+e[0])/360,i=(n=e[1],(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+n*Math.PI/360)))/360),r=Math.pow(2,t.z);return[Math.round(o*r*8192),Math.round(i*r*8192)]}function Fe(e,t,n){return t[1]>e[1]!=n[1]>e[1]&&e[0]<(n[0]-t[0])*(e[1]-t[1])/(n[1]-t[1])+t[0]}function ze(e,t){for(var n,o,i,r,a,s,l,c=!1,u=0,d=t.length;u0&&d<0||u<0&&d>0}function We(e,t,n){var o,i,r,a,s,l,c,u,d,p=v(n);try{for(p.s();!(o=p.n()).done;)for(var h=o.value,g=0;gn[2]){var i=.5*o,r=e[0]-n[0]>i?-o:n[0]-e[0]>i?o:0;0===r&&(r=e[0]-n[2]>i?-o:n[2]-e[0]>i?o:0),e[0]+=r}je(t,e)}function Xe(e,t,n,o){var i,r=8192*Math.pow(2,o.z),a=[8192*o.x,8192*o.y],s=[],l=v(e);try{for(l.s();!(i=l.n()).done;){var c,u=v(i.value);try{for(u.s();!(c=u.n()).done;){var d=c.value,p=[d.x+a[0],d.y+a[1]];Ke(p,t,n,r),s.push(p)}}catch(e){u.e(e)}finally{u.f()}}}catch(e){l.e(e)}finally{l.f()}return s}function Qe(e,t,n,o){var i,r,a=8192*Math.pow(2,o.z),s=[8192*o.x,8192*o.y],l=[],c=v(e);try{for(c.s();!(i=c.n()).done;){var u,d=i.value,p=[],h=v(d);try{for(h.s();!(u=h.n()).done;){var g=u.value,m=[g.x+s[0],g.y+s[1]];je(t,m),p.push(m)}}catch(e){h.e(e)}finally{h.f()}l.push(p)}}catch(e){c.e(e)}finally{c.f()}if(t[2]-t[0]<=a/2){(r=t)[0]=r[1]=1/0,r[2]=r[3]=-1/0;var f,y=v(l);try{for(y.s();!(f=y.n()).done;){var A,C=v(f.value);try{for(C.s();!(A=C.n()).done;){Ke(A.value,t,n,a)}}catch(e){C.e(e)}finally{C.f()}}}catch(e){y.e(e)}finally{y.f()}}return l}var $e=function(){function e(t,n){p(this,e),this.type=oe,this.geojson=t,this.geometries=n}return u(e,[{key:"evaluate",value:function(e){if(null!=e.geometry()&&null!=e.canonicalID()){if("Point"===e.geometryType())return function(e,t){var n=[1/0,1/0,-1/0,-1/0],o=[1/0,1/0,-1/0,-1/0],i=e.canonicalID();if("Polygon"===t.type){var r=Je(t.coordinates,o,i),a=Xe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var s,l=v(a);try{for(l.s();!(s=l.n()).done;){if(!ze(s.value,r))return!1}}catch(e){l.e(e)}finally{l.f()}}if("MultiPolygon"===t.type){var c=Ze(t.coordinates,o,i),u=Xe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var d,p=v(u);try{for(p.s();!(d=p.n()).done;){if(!Ve(d.value,c))return!1}}catch(e){p.e(e)}finally{p.f()}}return!0}(e,this.geometries);if("LineString"===e.geometryType())return function(e,t){var n=[1/0,1/0,-1/0,-1/0],o=[1/0,1/0,-1/0,-1/0],i=e.canonicalID();if("Polygon"===t.type){var r=Je(t.coordinates,o,i),a=Qe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var s,l=v(a);try{for(l.s();!(s=l.n()).done;){if(!He(s.value,r))return!1}}catch(e){l.e(e)}finally{l.f()}}if("MultiPolygon"===t.type){var c=Ze(t.coordinates,o,i),u=Qe(e.geometry(),n,o,i);if(!Ue(n,o))return!1;var d,p=v(u);try{for(p.s();!(d=p.n()).done;){if(!Ye(d.value,c))return!1}}catch(e){p.e(e)}finally{p.f()}}return!0}(e,this.geometries)}return!1}},{key:"eachChild",value:function(){}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){return["within",this.geojson]}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("'within' expression requires exactly one argument, but found ".concat(t.length-1," instead."));if(we(t[1])){var o=t[1];if("FeatureCollection"===o.type)for(var i=0;i=0)return!1;var n=!0;return e.eachChild((function(e){n&&!nt(e,t)&&(n=!1)})),n}var ot=function(){function e(t,n){p(this,e),this.type=n.type,this.name=t,this.boundExpression=n}return u(e,[{key:"evaluate",value:function(e){return this.boundExpression.evaluate(e)}},{key:"eachChild",value:function(){}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){return["var",this.name]}}],[{key:"parse",value:function(t,n){if(2!==t.length||"string"!=typeof t[1])return n.error("'var' expression requires exactly one string literal argument.");var o=t[1];return n.scope.has(o)?new e(o,n.scope.get(o)):n.error('Unknown variable "'.concat(o,'". Make sure "').concat(o,'" has been bound in an enclosing "let" expression before using it.'),1)}}])}(),it=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=arguments.length>2?arguments[2]:void 0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:new $,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[];p(this,e),this.registry=t,this.path=n,this.key=n.map((function(e){return"[".concat(e,"]")})).join(""),this.scope=i,this.errors=r,this.expectedType=o}return u(e,[{key:"parse",value:function(e,t,n,o){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};return t?this.concat(t,n,o)._parse(e,i):this._parse(e,i)}},{key:"_parse",value:function(e,t){function n(e,t,n){return"assert"===n?new xe(t,[e]):"coerce"===n?new Te(t,[e]):e}if(null!==e&&"string"!=typeof e&&"boolean"!=typeof e&&"number"!=typeof e||(e=["literal",e]),Array.isArray(e)){if(0===e.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');var o=e[0];if("string"!=typeof o)return this.error("Expression name must be a string, but found ".concat(b(o),' instead. If you wanted a literal array, use ["literal", [...]].'),0),null;var i=this.registry[o];if(i){var r=i.parse(e,this);if(!r)return null;if(this.expectedType){var a=this.expectedType,s=r.type;if("string"!==a.kind&&"number"!==a.kind&&"boolean"!==a.kind&&"object"!==a.kind&&"array"!==a.kind||"value"!==s.kind)if("color"!==a.kind&&"formatted"!==a.kind&&"resolvedImage"!==a.kind||"value"!==s.kind&&"string"!==s.kind){if(this.checkSubtype(a,s))return null}else r=n(r,a,t.typeAnnotation||"coerce");else r=n(r,a,t.typeAnnotation||"assert")}if(!(r instanceof Se)&&"resolvedImage"!==r.type.kind&&function e(t){if(t instanceof ot)return e(t.boundExpression);if(t instanceof De&&"error"===t.name)return!1;if(t instanceof Ne)return!1;if(t instanceof $e)return!1;var n=t instanceof Te||t instanceof xe,o=!0;if(t.eachChild((function(t){o=n?o&&e(t):o&&t instanceof Se})),!o)return!1;return et(t)&&nt(t,["zoom","heatmap-density","line-progress","sky-radial-progress","accumulated","is-supported-script"])}(r)){var l=new Le;try{r=new Se(r.type,r.evaluate(l))}catch(e){return this.error(e.message),null}}return r}return this.error('Unknown expression "'.concat(o,'". If you wanted a literal array, use ["literal", [...]].'),0)}return void 0===e?this.error("'undefined' value invalid. Use null instead."):"object"===b(e)?this.error('Bare objects invalid. Use ["literal", {...}] instead.'):this.error("Expected an array, but found ".concat(b(e)," instead."))}},{key:"concat",value:function(t,n,o){var i="number"==typeof t?this.path.concat(t):this.path,r=o?this.scope.concat(o):this.scope;return new e(this.registry,i,n||null,r,this.errors)}},{key:"error",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;ot))throw new Me("Input is not a number.");a=s-1}return 0}var at=function(){function e(t,n,o){p(this,e),this.type=t,this.input=n,this.labels=[],this.outputs=[];var i,r=v(o);try{for(r.s();!(i=r.n()).done;){var s=a(i.value,2),l=s[0],c=s[1];this.labels.push(l),this.outputs.push(c)}}catch(e){r.e(e)}finally{r.f()}}return u(e,[{key:"evaluate",value:function(e){var t=this.labels,n=this.outputs;if(1===t.length)return n[0].evaluate(e);var o=this.input.evaluate(e);if(o<=t[0])return n[0].evaluate(e);var i=t.length;return o>=t[i-1]?n[i-1].evaluate(e):n[rt(t,o)].evaluate(e)}},{key:"eachChild",value:function(e){e(this.input);var t,n=v(this.outputs);try{for(n.s();!(t=n.n()).done;){e(t.value)}}catch(e){n.e(e)}finally{n.f()}}},{key:"outputDefined",value:function(){return this.outputs.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){for(var e=["step",this.input.serialize()],t=0;t0&&e.push(this.labels[t]),e.push(this.outputs[t].serialize());return e}}],[{key:"parse",value:function(t,n){if(t.length-1<4)return n.error("Expected at least 4 arguments, but found only ".concat(t.length-1,"."));if((t.length-1)%2!=0)return n.error("Expected an even number of arguments.");var o=n.parse(t[1],1,te);if(!o)return null;var i=[],r=null;n.expectedType&&"value"!==n.expectedType.kind&&(r=n.expectedType);for(var a=1;a=s)return n.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',c);var d=n.parse(l,u,r);if(!d)return null;r=r||d.type,i.push([s,d])}return new e(r,o,i)}}])}(),st=lt;function lt(e,t,n,o){this.cx=3*e,this.bx=3*(n-e)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*t,this.by=3*(o-t)-this.cy,this.ay=1-this.cy-this.by,this.p1x=e,this.p1y=o,this.p2x=n,this.p2y=o}function ct(e,t,n){return e*(1-n)+t*n}lt.prototype.sampleCurveX=function(e){return((this.ax*e+this.bx)*e+this.cx)*e},lt.prototype.sampleCurveY=function(e){return((this.ay*e+this.by)*e+this.cy)*e},lt.prototype.sampleCurveDerivativeX=function(e){return(3*this.ax*e+2*this.bx)*e+this.cx},lt.prototype.solveCurveX=function(e,t){var n,o,i,r,a;for(void 0===t&&(t=1e-6),i=e,a=0;a<8;a++){if(r=this.sampleCurveX(i)-e,Math.abs(r)(o=1))return o;for(;nr?n=i:o=i,i=.5*(o-n)+n}return i},lt.prototype.solve=function(e,t){return this.sampleCurveY(this.solveCurveX(e,t))};var ut=Object.freeze({__proto__:null,number:ct,color:function(e,t,n){return new ye(ct(e.r,t.r,n),ct(e.g,t.g,n),ct(e.b,t.b,n),ct(e.a,t.a,n))},array:function(e,t,n){return e.map((function(e,o){return ct(e,t[o],n)}))}}),dt=6/29,pt=3*dt*dt,ht=Math.PI/180,gt=180/Math.PI;function mt(e){return e>.008856451679035631?Math.pow(e,1/3):e/pt+4/29}function ft(e){return e>dt?e*e*e:pt*(e-4/29)}function yt(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function At(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function vt(e){var t=At(e.r),n=At(e.g),o=At(e.b),i=mt((.4124564*t+.3575761*n+.1804375*o)/.95047),r=mt((.2126729*t+.7151522*n+.072175*o)/1);return{l:116*r-16,a:500*(i-r),b:200*(r-mt((.0193339*t+.119192*n+.9503041*o)/1.08883)),alpha:e.a}}function Ct(e){var t=(e.l+16)/116,n=isNaN(e.a)?t:t+e.a/500,o=isNaN(e.b)?t:t-e.b/200;return t=1*ft(t),n=.95047*ft(n),o=1.08883*ft(o),new ye(yt(3.2404542*n-1.5371385*t-.4985314*o),yt(-.969266*n+1.8760108*t+.041556*o),yt(.0556434*n-.2040259*t+1.0572252*o),e.alpha)}function It(e,t,n){var o=t-e;return e+n*(o>180||o<-180?o-360*Math.round(o/360):o)}var bt={forward:vt,reverse:Ct,interpolate:function(e,t,n){return{l:ct(e.l,t.l,n),a:ct(e.a,t.a,n),b:ct(e.b,t.b,n),alpha:ct(e.alpha,t.alpha,n)}}},wt={forward:function(e){var t=vt(e),n=t.l,o=t.a,i=t.b,r=Math.atan2(i,o)*gt;return{h:r<0?r+360:r,c:Math.sqrt(o*o+i*i),l:n,alpha:e.a}},reverse:function(e){var t=e.h*ht,n=e.c;return Ct({l:e.l,a:Math.cos(t)*n,b:Math.sin(t)*n,alpha:e.alpha})},interpolate:function(e,t,n){return{h:It(e.h,t.h,n),c:ct(e.c,t.c,n),l:ct(e.l,t.l,n),alpha:ct(e.alpha,t.alpha,n)}}},Et=Object.freeze({__proto__:null,lab:bt,hcl:wt}),_t=function(){function e(t,n,o,i,r){p(this,e),this.type=t,this.operator=n,this.interpolation=o,this.input=i,this.labels=[],this.outputs=[];var s,l=v(r);try{for(l.s();!(s=l.n()).done;){var c=a(s.value,2),u=c[0],d=c[1];this.labels.push(u),this.outputs.push(d)}}catch(e){l.e(e)}finally{l.f()}}return u(e,[{key:"evaluate",value:function(t){var n=this.labels,o=this.outputs;if(1===n.length)return o[0].evaluate(t);var i=this.input.evaluate(t);if(i<=n[0])return o[0].evaluate(t);var r=n.length;if(i>=n[r-1])return o[r-1].evaluate(t);var a=rt(n,i),s=n[a],l=n[a+1],c=e.interpolationFactor(this.interpolation,i,s,l),u=o[a].evaluate(t),d=o[a+1].evaluate(t);return"interpolate"===this.operator?ut[this.type.kind.toLowerCase()](u,d,c):"interpolate-hcl"===this.operator?wt.reverse(wt.interpolate(wt.forward(u),wt.forward(d),c)):bt.reverse(bt.interpolate(bt.forward(u),bt.forward(d),c))}},{key:"eachChild",value:function(e){e(this.input);var t,n=v(this.outputs);try{for(n.s();!(t=n.n()).done;){e(t.value)}}catch(e){n.e(e)}finally{n.f()}}},{key:"outputDefined",value:function(){return this.outputs.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){var e;e="linear"===this.interpolation.name?["linear"]:"exponential"===this.interpolation.name?1===this.interpolation.base?["linear"]:["exponential",this.interpolation.base]:["cubic-bezier"].concat(this.interpolation.controlPoints);for(var t=[this.operator,e,this.input.serialize()],n=0;n1})))return n.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);c={name:"cubic-bezier",controlPoints:h}}if(t.length-1<4)return n.error("Expected at least 4 arguments, but found only ".concat(t.length-1,"."));if((t.length-1)%2!=0)return n.error("Expected an even number of arguments.");if(!(u=n.parse(u,2,te)))return null;var g=[],m=null;"interpolate-hcl"===a||"interpolate-lab"===a?m=ie:n.expectedType&&"value"!==n.expectedType.kind&&(m=n.expectedType);for(var f=0;f=y)return n.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',v);var b=n.parse(A,I,m);if(!b)return null;m=m||b.type,g.push([y,b])}return"number"===m.kind||"color"===m.kind||"array"===m.kind&&"number"===m.itemType.kind&&"number"==typeof m.N?new e(m,a,c,u,g):n.error("Type ".concat(de(m)," is not interpolatable."))}}])}();function St(e,t,n,o){var i=o-n,r=e-n;return 0===i?0:1===t?r/i:(Math.pow(t,r)-1)/(Math.pow(t,i)-1)}var Mt=function(){function e(t,n){p(this,e),this.type=t,this.args=n}return u(e,[{key:"evaluate",value:function(e){var t,n,o=null,i=0,r=v(this.args);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(i++,(o=a.evaluate(e))&&o instanceof Ie&&!o.available&&(t||(t=o.name),o=null,i===this.args.length&&(o=t)),null!==o)break}}catch(e){r.e(e)}finally{r.f()}return o}},{key:"eachChild",value:function(e){this.args.forEach(e)}},{key:"outputDefined",value:function(){return this.args.every((function(e){return e.outputDefined()}))}},{key:"serialize",value:function(){var e=["coalesce"];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(t.length<2)return n.error("Expectected at least one argument.");var o=null,i=n.expectedType;i&&"value"!==i.kind&&(o=i);var r,a=[],s=v(t.slice(1));try{for(s.s();!(r=s.n()).done;){var l=r.value,c=n.parse(l,1+a.length,o,void 0,{typeAnnotation:"omit"});if(!c)return null;o=o||c.type,a.push(c)}}catch(e){s.e(e)}finally{s.f()}return new e(i&&a.some((function(e){return he(i,e.type)}))?ae:o,a)}}])}(),Pt=function(){function e(t,n){p(this,e),this.type=n.type,this.bindings=[].concat(t),this.result=n}return u(e,[{key:"evaluate",value:function(e){return this.result.evaluate(e)}},{key:"eachChild",value:function(e){var t,n=v(this.bindings);try{for(n.s();!(t=n.n()).done;){e(t.value[1])}}catch(e){n.e(e)}finally{n.f()}e(this.result)}},{key:"outputDefined",value:function(){return this.result.outputDefined()}},{key:"serialize",value:function(){var e,t=["let"],n=v(this.bindings);try{for(n.s();!(e=n.n()).done;){var o=a(e.value,2),i=o[0],r=o[1];t.push(i,r.serialize())}}catch(e){n.e(e)}finally{n.f()}return t.push(this.result.serialize()),t}}],[{key:"parse",value:function(t,n){if(t.length<4)return n.error("Expected at least 3 arguments, but found ".concat(t.length-1," instead."));for(var o=[],i=1;i=n.length)throw new Me("Array index out of bounds: ".concat(t," > ").concat(n.length-1,"."));if(t!==Math.floor(t))throw new Me("Array index must be an integer, but found ".concat(t," instead."));return n[t]}},{key:"eachChild",value:function(e){e(this.index),e(this.input)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){return["at",this.index.serialize(),this.input.serialize()]}}],[{key:"parse",value:function(t,n){if(3!==t.length)return n.error("Expected 2 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,te),i=n.parse(t[2],2,ue(n.expectedType||ae));return o&&i?new e(i.type.itemType,o,i):null}}])}(),kt=function(){function e(t,n){p(this,e),this.type=oe,this.needle=t,this.haystack=n}return u(e,[{key:"evaluate",value:function(e){var t=this.needle.evaluate(e),n=this.haystack.evaluate(e);if(!n)return!1;if(!me(t,["boolean","string","number","null"]))throw new Me("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(Ee(t))," instead."));if(!me(n,["string","array"]))throw new Me("Expected second argument to be of type array or string, but found ".concat(de(Ee(n))," instead."));return n.indexOf(t)>=0}},{key:"eachChild",value:function(e){e(this.needle),e(this.haystack)}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){return["in",this.needle.serialize(),this.haystack.serialize()]}}],[{key:"parse",value:function(t,n){if(3!==t.length)return n.error("Expected 2 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,ae),i=n.parse(t[2],2,ae);return o&&i?ge(o.type,[oe,ne,te,ee,ae])?new e(o,i):n.error("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(o.type)," instead")):null}}])}(),Gt=function(){function e(t,n,o){p(this,e),this.type=te,this.needle=t,this.haystack=n,this.fromIndex=o}return u(e,[{key:"evaluate",value:function(e){var t=this.needle.evaluate(e),n=this.haystack.evaluate(e);if(!me(t,["boolean","string","number","null"]))throw new Me("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(Ee(t))," instead."));if(!me(n,["string","array"]))throw new Me("Expected second argument to be of type array or string, but found ".concat(de(Ee(n))," instead."));if(this.fromIndex){var o=this.fromIndex.evaluate(e);return n.indexOf(t,o)}return n.indexOf(t)}},{key:"eachChild",value:function(e){e(this.needle),e(this.haystack),this.fromIndex&&e(this.fromIndex)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){if(null!=this.fromIndex&&void 0!==this.fromIndex){var e=this.fromIndex.serialize();return["index-of",this.needle.serialize(),this.haystack.serialize(),e]}return["index-of",this.needle.serialize(),this.haystack.serialize()]}}],[{key:"parse",value:function(t,n){if(t.length<=2||t.length>=5)return n.error("Expected 3 or 4 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,ae),i=n.parse(t[2],2,ae);if(!o||!i)return null;if(!ge(o.type,[oe,ne,te,ee,ae]))return n.error("Expected first argument to be of type boolean, string, number or null, but found ".concat(de(o.type)," instead"));if(4===t.length){var r=n.parse(t[3],3,te);return r?new e(o,i,r):null}return new e(o,i)}}])}(),Rt=function(){function e(t,n,o,i,r,a){p(this,e),this.inputType=t,this.type=n,this.input=o,this.cases=i,this.outputs=r,this.otherwise=a}return u(e,[{key:"evaluate",value:function(e){var t=this.input.evaluate(e);return(Ee(t)===this.inputType&&this.outputs[this.cases[t]]||this.otherwise).evaluate(e)}},{key:"eachChild",value:function(e){e(this.input),this.outputs.forEach(e),e(this.otherwise)}},{key:"outputDefined",value:function(){return this.outputs.every((function(e){return e.outputDefined()}))&&this.otherwise.outputDefined()}},{key:"serialize",value:function(){var e,t=this,n=["match",this.input.serialize()],o=[],i={},r=v(Object.keys(this.cases).sort());try{for(r.s();!(e=r.n()).done;){var s=e.value,l=i[this.cases[s]];void 0===l?(i[this.cases[s]]=o.length,o.push([this.cases[s],[s]])):o[l][1].push(s)}}catch(e){r.e(e)}finally{r.f()}for(var c=function(e){return"number"===t.inputType.kind?Number(e):e},u=0,d=o;uNumber.MAX_SAFE_INTEGER)return u.error("Branch labels must be integers no larger than ".concat(Number.MAX_SAFE_INTEGER,"."));if("number"==typeof h&&Math.floor(h)!==h)return u.error("Numeric branch labels must be integer values.");if(o){if(u.checkSubtype(o,Ee(h)))return null}else o=Ee(h);if(void 0!==r[String(h)])return u.error("Branch labels must be unique.");r[String(h)]=a.length}}catch(e){p.e(e)}finally{p.f()}var g=n.parse(c,s,i);if(!g)return null;i=i||g.type,a.push(g)}var m=n.parse(t[1],1,ae);if(!m)return null;var f=n.parse(t[t.length-1],t.length-1,i);return f?"value"!==m.type.kind&&n.concat(1).checkSubtype(o,m.type)?null:new e(o,i,m,r,a,f):null}}])}(),Tt=function(){function e(t,n,o){p(this,e),this.type=t,this.branches=n,this.otherwise=o}return u(e,[{key:"evaluate",value:function(e){var t,n=v(this.branches);try{for(n.s();!(t=n.n()).done;){var o=a(t.value,2),i=o[0],r=o[1];if(i.evaluate(e))return r.evaluate(e)}}catch(e){n.e(e)}finally{n.f()}return this.otherwise.evaluate(e)}},{key:"eachChild",value:function(e){var t,n=v(this.branches);try{for(n.s();!(t=n.n()).done;){var o=a(t.value,2),i=o[0],r=o[1];e(i),e(r)}}catch(e){n.e(e)}finally{n.f()}e(this.otherwise)}},{key:"outputDefined",value:function(){return this.branches.every((function(e){var t=a(e,2);t[0];return t[1].outputDefined()}))&&this.otherwise.outputDefined()}},{key:"serialize",value:function(){var e=["case"];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(t.length<4)return n.error("Expected at least 3 arguments, but found only ".concat(t.length-1,"."));if(t.length%2!=0)return n.error("Expected an odd number of arguments.");var o;n.expectedType&&"value"!==n.expectedType.kind&&(o=n.expectedType);for(var i=[],r=1;r=5)return n.error("Expected 3 or 4 arguments, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1,ae),i=n.parse(t[2],2,te);if(!o||!i)return null;if(!ge(o.type,[ue(ae),ne,ae]))return n.error("Expected first argument to be of type array or string, but found ".concat(de(o.type)," instead"));if(4===t.length){var r=n.parse(t[3],3,te);return r?new e(o.type,o,i,r):null}return new e(o.type,o,i)}}])}();function Lt(e,t){return"=="===e||"!="===e?"boolean"===t.kind||"string"===t.kind||"number"===t.kind||"null"===t.kind||"value"===t.kind:"string"===t.kind||"number"===t.kind||"value"===t.kind}function Dt(e,t,n,o){return 0===o.compare(t,n)}function Nt(e,t,n){var o="=="!==e&&"!="!==e;return function(){function i(e,t,n){p(this,i),this.type=oe,this.lhs=e,this.rhs=t,this.collator=n,this.hasUntypedArgument="value"===e.type.kind||"value"===t.type.kind}return u(i,[{key:"evaluate",value:function(i){var r=this.lhs.evaluate(i),a=this.rhs.evaluate(i);if(o&&this.hasUntypedArgument){var s=Ee(r),l=Ee(a);if(s.kind!==l.kind||"string"!==s.kind&&"number"!==s.kind)throw new Me('Expected arguments for "'.concat(e,'" to be (string, string) or (number, number), but found (').concat(s.kind,", ").concat(l.kind,") instead."))}if(this.collator&&!o&&this.hasUntypedArgument){var c=Ee(r),u=Ee(a);if("string"!==c.kind||"string"!==u.kind)return t(i,r,a)}return this.collator?n(i,r,a,this.collator.evaluate(i)):t(i,r,a)}},{key:"eachChild",value:function(e){e(this.lhs),e(this.rhs),this.collator&&e(this.collator)}},{key:"outputDefined",value:function(){return!0}},{key:"serialize",value:function(){var t=[e];return this.eachChild((function(e){t.push(e.serialize())})),t}}],[{key:"parse",value:function(e,t){if(3!==e.length&&4!==e.length)return t.error("Expected two or three arguments.");var n=e[0],r=t.parse(e[1],1,ae);if(!r)return null;if(!Lt(n,r.type))return t.concat(1).error('"'.concat(n,"\" comparisons are not supported for type '").concat(de(r.type),"'."));var a=t.parse(e[2],2,ae);if(!a)return null;if(!Lt(n,a.type))return t.concat(2).error('"'.concat(n,"\" comparisons are not supported for type '").concat(de(a.type),"'."));if(r.type.kind!==a.type.kind&&"value"!==r.type.kind&&"value"!==a.type.kind)return t.error("Cannot compare types '".concat(de(r.type),"' and '").concat(de(a.type),"'."));o&&("value"===r.type.kind&&"value"!==a.type.kind?r=new xe(a.type,[r]):"value"!==r.type.kind&&"value"===a.type.kind&&(a=new xe(r.type,[a])));var s=null;if(4===e.length){if("string"!==r.type.kind&&"string"!==a.type.kind&&"value"!==r.type.kind&&"value"!==a.type.kind)return t.error("Cannot use collator to compare non-string types.");if(!(s=t.parse(e[3],3,se)))return null}return new i(r,a,s)}}])}()}var jt=Nt("==",(function(e,t,n){return t===n}),Dt),Ut=Nt("!=",(function(e,t,n){return t!==n}),(function(e,t,n,o){return!Dt(0,t,n,o)})),Bt=Nt("<",(function(e,t,n){return t",(function(e,t,n){return t>n}),(function(e,t,n,o){return o.compare(t,n)>0})),zt=Nt("<=",(function(e,t,n){return t<=n}),(function(e,t,n,o){return o.compare(t,n)<=0})),Vt=Nt(">=",(function(e,t,n){return t>=n}),(function(e,t,n,o){return o.compare(t,n)>=0})),qt=function(){function e(t,n,o,i,r){p(this,e),this.type=ne,this.number=t,this.locale=n,this.currency=o,this.minFractionDigits=i,this.maxFractionDigits=r}return u(e,[{key:"evaluate",value:function(e){return new Intl.NumberFormat(this.locale?this.locale.evaluate(e):[],{style:this.currency?"currency":"decimal",currency:this.currency?this.currency.evaluate(e):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(e):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(e):void 0}).format(this.number.evaluate(e))}},{key:"eachChild",value:function(e){e(this.number),this.locale&&e(this.locale),this.currency&&e(this.currency),this.minFractionDigits&&e(this.minFractionDigits),this.maxFractionDigits&&e(this.maxFractionDigits)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){var e={};return this.locale&&(e.locale=this.locale.serialize()),this.currency&&(e.currency=this.currency.serialize()),this.minFractionDigits&&(e["min-fraction-digits"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(e["max-fraction-digits"]=this.maxFractionDigits.serialize()),["number-format",this.number.serialize(),e]}}],[{key:"parse",value:function(t,n){if(3!==t.length)return n.error("Expected two arguments.");var o=n.parse(t[1],1,te);if(!o)return null;var i=t[2];if("object"!==b(i)||Array.isArray(i))return n.error("NumberFormat options argument must be an object.");var r=null;if(i.locale&&!(r=n.parse(i.locale,1,ne)))return null;var a=null;if(i.currency&&!(a=n.parse(i.currency,1,ne)))return null;var s=null;if(i["min-fraction-digits"]&&!(s=n.parse(i["min-fraction-digits"],1,te)))return null;var l=null;return i["max-fraction-digits"]&&!(l=n.parse(i["max-fraction-digits"],1,te))?null:new e(o,r,a,s,l)}}])}(),Wt={"==":jt,"!=":Ut,">":Ft,"<":Bt,">=":Vt,"<=":zt,array:xe,at:xt,boolean:xe,case:Tt,coalesce:Mt,collator:Ne,format:ke,image:Ge,in:kt,"index-of":Gt,interpolate:_t,"interpolate-hcl":_t,"interpolate-lab":_t,length:function(){function e(t){p(this,e),this.type=te,this.input=t}return u(e,[{key:"evaluate",value:function(e){var t=this.input.evaluate(e);if("string"==typeof t)return t.length;if(Array.isArray(t))return t.length;throw new Me("Expected value to be of type string or array, but found ".concat(de(Ee(t))," instead."))}},{key:"eachChild",value:function(e){e(this.input)}},{key:"outputDefined",value:function(){return!1}},{key:"serialize",value:function(){var e=["length"];return this.eachChild((function(t){e.push(t.serialize())})),e}}],[{key:"parse",value:function(t,n){if(2!==t.length)return n.error("Expected 1 argument, but found ".concat(t.length-1," instead."));var o=n.parse(t[1],1);return o?"array"!==o.type.kind&&"string"!==o.type.kind&&"value"!==o.type.kind?n.error("Expected argument of type string or array, but found ".concat(de(o.type)," instead.")):new e(o):null}}])}(),let:Pt,literal:Se,match:Rt,number:xe,"number-format":qt,object:xe,slice:Ot,step:at,string:xe,"to-boolean":Te,"to-color":Te,"to-number":Te,"to-string":Te,var:ot,within:$e};function Ht(e,t){var n=a(t,4),o=n[0],i=n[1],r=n[2],s=n[3];o=o.evaluate(e),i=i.evaluate(e),r=r.evaluate(e);var l=s?s.evaluate(e):1,c=be(o,i,r,l);if(c)throw new Me(c);return new ye(o/255*l,i/255*l,r/255*l,l)}function Yt(e,t){return e in t}function Jt(e,t){var n=t[e];return void 0===n?null:n}function Zt(e){return{type:e}}function Kt(e){return{result:"success",value:e}}function Xt(e){return{result:"error",value:e}}function Qt(e){return"data-driven"===e["property-type"]||"cross-faded-data-driven"===e["property-type"]}function $t(e){return!!e.expression&&e.expression.parameters.indexOf("zoom")>-1}function en(e){return!!e.expression&&e.expression.interpolated}function tn(e){return e instanceof Number?"number":e instanceof String?"string":e instanceof Boolean?"boolean":Array.isArray(e)?"array":null===e?"null":b(e)}function nn(e){return"object"===b(e)&&null!==e&&!Array.isArray(e)}function on(e){return e}function rn(e,t){var n,o,i,r="color"===t.type,a=e.stops&&"object"===b(e.stops[0][0]),s=a||void 0!==e.property,l=a||!s,c=e.type||(en(t)?"exponential":"interval");if(r&&((e=X({},e)).stops&&(e.stops=e.stops.map((function(e){return[e[0],ye.parse(e[1])]}))),e.default?e.default=ye.parse(e.default):e.default=ye.parse(t.default)),e.colorSpace&&"rgb"!==e.colorSpace&&!Et[e.colorSpace])throw new Error("Unknown color space: ".concat(e.colorSpace));if("exponential"===c)n=cn;else if("interval"===c)n=ln;else if("categorical"===c){n=sn,o=Object.create(null);var u,d=v(e.stops);try{for(d.s();!(u=d.n()).done;){var p=u.value;o[p[0]]=p[1]}}catch(e){d.e(e)}finally{d.f()}i=b(e.stops[0][0])}else{if("identity"!==c)throw new Error('Unknown function type "'.concat(c,'"'));n=un}if(a){for(var h={},g=[],m=0;m=e.stops[o-1][0])return e.stops[o-1][1];var i=rt(e.stops.map((function(e){return e[0]})),n);return e.stops[i][1]}function cn(e,t,n){var o=void 0!==e.base?e.base:1;if("number"!==tn(n))return an(e.default,t.default);var i=e.stops.length;if(1===i)return e.stops[0][1];if(n<=e.stops[0][0])return e.stops[0][1];if(n>=e.stops[i-1][0])return e.stops[i-1][1];var r=rt(e.stops.map((function(e){return e[0]})),n),a=function(e,t,n,o){var i=o-n,r=e-n;return 0===i?0:1===t?r/i:(Math.pow(t,r)-1)/(Math.pow(t,i)-1)}(n,o,e.stops[r][0],e.stops[r+1][0]),s=e.stops[r][1],l=e.stops[r+1][1],c=ut[t.type]||on;if(e.colorSpace&&"rgb"!==e.colorSpace){var u=Et[e.colorSpace];c=function(e,t){return u.reverse(u.interpolate(u.forward(e),u.forward(t),a))}}return"function"==typeof s.evaluate?{evaluate:function(){for(var e=arguments.length,t=new Array(e),n=0;n":[oe,[ne,ae],function(e,t){var n=a(t,2),o=n[0],i=n[1],r=e.properties()[o.value],s=i.value;return b(r)===b(s)&&r>s}],"filter-id->":[oe,[ae],function(e,t){var n=a(t,1)[0],o=e.id(),i=n.value;return b(o)===b(i)&&o>i}],"filter-<=":[oe,[ne,ae],function(e,t){var n=a(t,2),o=n[0],i=n[1],r=e.properties()[o.value],s=i.value;return b(r)===b(s)&&r<=s}],"filter-id-<=":[oe,[ae],function(e,t){var n=a(t,1)[0],o=e.id(),i=n.value;return b(o)===b(i)&&o<=i}],"filter->=":[oe,[ne,ae],function(e,t){var n=a(t,2),o=n[0],i=n[1],r=e.properties()[o.value],s=i.value;return b(r)===b(s)&&r>=s}],"filter-id->=":[oe,[ae],function(e,t){var n=a(t,1)[0],o=e.id(),i=n.value;return b(o)===b(i)&&o>=i}],"filter-has":[oe,[ae],function(e,t){return a(t,1)[0].value in e.properties()}],"filter-has-id":[oe,[],function(e){return null!==e.id()&&void 0!==e.id()}],"filter-type-in":[oe,[ue(ne)],function(e,t){return a(t,1)[0].value.indexOf(e.geometryType())>=0}],"filter-id-in":[oe,[ue(ae)],function(e,t){return a(t,1)[0].value.indexOf(e.id())>=0}],"filter-in-small":[oe,[ne,ue(ae)],function(e,t){var n=a(t,2),o=n[0];return n[1].value.indexOf(e.properties()[o.value])>=0}],"filter-in-large":[oe,[ne,ue(ae)],function(e,t){var n=a(t,2),o=n[0],i=n[1];return function(e,t,n,o){for(;n<=o;){var i=n+o>>1;if(t[i]===e)return!0;t[i]>e?o=i-1:n=i+1}return!1}(e.properties()[o.value],i.value,0,i.value.length-1)}],all:{type:oe,overloads:[[[oe,oe],function(e,t){var n=a(t,2),o=n[0],i=n[1];return o.evaluate(e)&&i.evaluate(e)}],[Zt(oe),function(e,t){var n,o=v(t);try{for(o.s();!(n=o.n()).done;){if(!n.value.evaluate(e))return!1}}catch(e){o.e(e)}finally{o.f()}return!0}]]},any:{type:oe,overloads:[[[oe,oe],function(e,t){var n=a(t,2),o=n[0],i=n[1];return o.evaluate(e)||i.evaluate(e)}],[Zt(oe),function(e,t){var n,o=v(t);try{for(o.s();!(n=o.n()).done;){if(n.value.evaluate(e))return!0}}catch(e){o.e(e)}finally{o.f()}return!1}]]},"!":[oe,[oe],function(e,t){return!a(t,1)[0].evaluate(e)}],"is-supported-script":[oe,[ne],function(e,t){var n=a(t,1)[0],o=e.globals&&e.globals.isSupportedScript;return!o||o(n.evaluate(e))}],upcase:[ne,[ne],function(e,t){return a(t,1)[0].evaluate(e).toUpperCase()}],downcase:[ne,[ne],function(e,t){return a(t,1)[0].evaluate(e).toLowerCase()}],concat:[ne,Zt(ae),function(e,t){return t.map((function(t){return _e(t.evaluate(e))})).join("")}],"resolved-locale":[ne,[se],function(e,t){return a(t,1)[0].evaluate(e).resolvedLocale()}]});var dn=function(){return u((function e(t,n){var o;p(this,e),this.expression=t,this._warningHistory={},this._evaluator=new Le,this._defaultValue=n?"color"===(o=n).type&&nn(o.default)?new ye(0,0,0,0):"color"===o.type?ye.parse(o.default)||null:void 0===o.default?null:o.default:null,this._enumValues=n&&"enum"===n.type?n.values:null}),[{key:"evaluateWithoutErrorHandling",value:function(e,t,n,o,i,r){return this._evaluator.globals=e,this._evaluator.feature=t,this._evaluator.featureState=n,this._evaluator.canonical=o,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=r,this.expression.evaluate(this._evaluator)}},{key:"evaluate",value:function(e,t,n,o,i,r){this._evaluator.globals=e,this._evaluator.feature=t||null,this._evaluator.featureState=n||null,this._evaluator.canonical=o,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=r||null;try{var a=this.expression.evaluate(this._evaluator);if(null==a||"number"==typeof a&&a!=a)return this._defaultValue;if(this._enumValues&&!(a in this._enumValues))throw new Me("Expected value to be one of ".concat(Object.keys(this._enumValues).map((function(e){return JSON.stringify(e)})).join(", "),", but found ").concat(JSON.stringify(a)," instead."));return a}catch(e){return this._warningHistory[e.message]||(this._warningHistory[e.message]=!0,"undefined"!=typeof console&&console.warn(e.message)),this._defaultValue}}}])}();function pn(e){return Array.isArray(e)&&e.length>0&&"string"==typeof e[0]&&e[0]in Wt}function hn(e,t){var n=new it(Wt,[],t?function(e){var t={color:ie,string:ne,number:te,enum:ne,boolean:oe,formatted:le,resolvedImage:ce};if("array"===e.type)return ue(t[e.value]||ae,e.length);return t[e.type]}(t):void 0),o=n.parse(e,void 0,void 0,void 0,t&&"string"===t.type?{typeAnnotation:"coerce"}:void 0);return o?Kt(new dn(o,t)):Xt(n.errors)}var gn=function(){return u((function e(t,n){p(this,e),this.kind=t,this._styleExpression=n,this.isStateDependent="constant"!==t&&!tt(n.expression)}),[{key:"evaluateWithoutErrorHandling",value:function(e,t,n,o,i,r){return this._styleExpression.evaluateWithoutErrorHandling(e,t,n,o,i,r)}},{key:"evaluate",value:function(e,t,n,o,i,r){return this._styleExpression.evaluate(e,t,n,o,i,r)}}])}(),mn=function(){return u((function e(t,n,o,i){p(this,e),this.kind=t,this.zoomStops=o,this._styleExpression=n,this.isStateDependent="camera"!==t&&!tt(n.expression),this.interpolationType=i}),[{key:"evaluateWithoutErrorHandling",value:function(e,t,n,o,i,r){return this._styleExpression.evaluateWithoutErrorHandling(e,t,n,o,i,r)}},{key:"evaluate",value:function(e,t,n,o,i,r){return this._styleExpression.evaluate(e,t,n,o,i,r)}},{key:"interpolationFactor",value:function(e,t,n){return this.interpolationType?_t.interpolationFactor(this.interpolationType,e,t,n):0}}])}();function fn(e,t){if("error"===(e=hn(e,t)).result)return e;var n=e.value.expression,o=et(n);if(!o&&!Qt(t))return Xt([new Q("","data expressions not supported")]);var i=nt(n,["zoom"]);if(!i&&!$t(t))return Xt([new Q("","zoom expressions not supported")]);var r=function e(t){var n=null;if(t instanceof Pt)n=e(t.result);else if(t instanceof Mt){var o,i=v(t.args);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(n=e(r))break}}catch(e){i.e(e)}finally{i.f()}}else(t instanceof at||t instanceof _t)&&t.input instanceof De&&"zoom"===t.input.name&&(n=t);if(n instanceof Q)return n;return t.eachChild((function(t){var o=e(t);o instanceof Q?n=o:!n&&o?n=new Q("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'):n&&o&&n!==o&&(n=new Q("",'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'))})),n}(n);if(!r&&!i)return Xt([new Q("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]);if(r instanceof Q)return Xt([r]);if(r instanceof _t&&!en(t))return Xt([new Q("",'"interpolate" expressions cannot be used with this property')]);if(!r)return Kt(new gn(o?"constant":"source",e.value));var a=r instanceof _t?r.interpolation:void 0;return Kt(new mn(o?"camera":"composite",e.value,r.labels,a))}var yn=function(){function e(t,n){p(this,e),this._parameters=t,this._specification=n,X(this,rn(this._parameters,this._specification))}return u(e,null,[{key:"deserialize",value:function(t){return new e(t._parameters,t._specification)}},{key:"serialize",value:function(e){return{_parameters:e._parameters,_specification:e._specification}}}])}();function An(e){return"object"===b(e)?["literal",e]:e}function vn(e,t){var n=e.stops;if(!n)return function(e,t){var n=["get",e.property];if(void 0===e.default)return"string"===t.type?["string",n]:n;if("enum"===t.type)return["match",n,Object.keys(t.values),n,e.default];var o=["color"===t.type?"to-color":t.type,n,An(e.default)];return"array"===t.type&&o.splice(1,0,t.value,t.length||null),o}(e,t);var o=n&&"object"===b(n[0][0]),i=o||void 0!==e.property,r=o||!i;return n=n.map((function(e){return!i&&t.tokens&&"string"==typeof e[1]?[e[0],Sn(e[1])]:[e[0],An(e[1])]})),o?function(e,t,n){for(var o={},i={},r=[],a=0;a3&&void 0!==arguments[3]?arguments[3]:["zoom"],r=_n(e,t),a=!1;if("interval"===r)o=["step",i],a=!0;else{if("exponential"!==r)throw new Error('Unknown zoom function type "'.concat(r,'"'));var s=void 0!==e.base?e.base:1;o=[Cn(e),1===s?["linear"]:["exponential",s],i]}var l,c=v(n);try{for(c.s();!(l=c.n()).done;){var u=l.value;En(o,u[0],u[1],a)}}catch(e){c.e(e)}finally{c.f()}return wn(o),o}(e,t,n):bn(e,t,n)}function Cn(e){switch(e.colorSpace){case"hcl":return"interpolate-hcl";case"lab":return"interpolate-lab";default:return"interpolate"}}function In(e,t){var n,o,i=An((n=e.default,o=t.default,void 0!==n?n:void 0!==o?o:void 0));return void 0===i&&"resolvedImage"===t.type?"":i}function bn(e,t,n){var o=_n(e,t),i=["get",e.property];if("categorical"===o&&"boolean"==typeof n[0][0]){var r,a=["case"],s=v(n);try{for(s.s();!(r=s.n()).done;){var l=r.value;a.push(["==",i,l[0]],l[1])}}catch(e){s.e(e)}finally{s.f()}return a.push(In(e,t)),a}if("categorical"===o){var c,u=["match",i],d=v(n);try{for(d.s();!(c=d.n()).done;){var p=c.value;En(u,p[0],p[1],!1)}}catch(e){d.e(e)}finally{d.f()}return u.push(In(e,t)),u}if("interval"===o){var h,g=["step",["number",i]],m=v(n);try{for(m.s();!(h=m.n()).done;){var f=h.value;En(g,f[0],f[1],!0)}}catch(e){m.e(e)}finally{m.f()}return wn(g),void 0===e.default?g:["case",["==",["typeof",i],"number"],g,An(e.default)]}if("exponential"===o){var y,A=void 0!==e.base?e.base:1,C=[Cn(e),1===A?["linear"]:["exponential",A],["number",i]],I=v(n);try{for(I.s();!(y=I.n()).done;){var b=y.value;En(C,b[0],b[1],!1)}}catch(e){I.e(e)}finally{I.f()}return void 0===e.default?C:["case",["==",["typeof",i],"number"],C,An(e.default)]}throw new Error("Unknown property function type ".concat(o))}function wn(e){"step"===e[0]&&3===e.length&&(e.push(0),e.push(e[3]))}function En(e,t,n,o){e.length>3&&t===e[e.length-2]||(o&&2===e.length||e.push(t),e.push(n))}function _n(e,t){return e.type?e.type:t.expression.interpolated?"exponential":"interval"}function Sn(e){for(var t=["concat"],n=/{([^{}]+)}/g,o=0,i=n.exec(e);null!==i;i=n.exec(e)){var r=e.slice(o,n.lastIndex-i[0].length);o=n.lastIndex,r.length>0&&t.push(r),t.push(["get",i[1]])}if(1===t.length)return e;if(o=2&&"$id"!==e[1]&&"$type"!==e[1];case"in":return e.length>=3&&("string"!=typeof e[1]||Array.isArray(e[2]));case"!in":case"!has":case"none":return!1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3!==e.length||Array.isArray(e[1])||Array.isArray(e[2]);case"any":case"all":var t,n=v(e.slice(1));try{for(n.s();!(t=n.n()).done;){var o=t.value;if(!Mn(o)&&"boolean"!=typeof o)return!1}}catch(e){n.e(e)}finally{n.f()}return!0;default:return!0}}var Pn={type:"boolean",default:!1,transition:!1,"property-type":"data-driven",expression:{interpolated:!1,parameters:["zoom","feature"]}};function xn(e){if(null==e)return{filter:function(){return!0},needGeometry:!1};Mn(e)||(e=Gn(e));var t=hn(e,Pn);if("error"===t.result)throw new Error(t.value.map((function(e){return"".concat(e.key,": ").concat(e.message)})).join(", "));return{filter:function(e,n,o){return t.value.evaluate(e,n,{},o)},needGeometry:function e(t){if(!Array.isArray(t))return!1;if("within"===t[0])return!0;for(var n=1;nt?1:0}function Gn(e){if(!e)return!0;var t,n=e[0];return e.length<=1?"any"!==n:"=="===n?Rn(e[1],e[2],"=="):"!="===n?Ln(Rn(e[1],e[2],"==")):"<"===n||">"===n||"<="===n||">="===n?Rn(e[1],e[2],n):"any"===n?(t=e.slice(1),["any"].concat(t.map(Gn))):"all"===n?["all"].concat(e.slice(1).map(Gn)):"none"===n?["all"].concat(e.slice(1).map(Gn).map(Ln)):"in"===n?Tn(e[1],e.slice(2)):"!in"===n?Ln(Tn(e[1],e.slice(2))):"has"===n?On(e[1]):"!has"===n?Ln(On(e[1])):"within"!==n||e}function Rn(e,t,n){switch(e){case"$type":return["filter-type-".concat(n),t];case"$id":return["filter-id-".concat(n),t];default:return["filter-".concat(n),e,t]}}function Tn(e,t){if(0===t.length)return!1;switch(e){case"$type":return["filter-type-in",["literal",t]];case"$id":return["filter-id-in",["literal",t]];default:return t.length>200&&!t.some((function(e){return b(e)!==b(t[0])}))?["filter-in-large",e,["literal",t.sort(kn)]]:["filter-in-small",e,["literal",t]]}}function On(e){switch(e){case"$type":return!0;case"$id":return["filter-has-id"];default:return["filter-has",e]}}function Ln(e){return["!",e]}var Dn=["type","source","source-layer","minzoom","maxzoom","filter","layout"];function Nn(e,t){var n={};for(var o in e)"ref"!==o&&(n[o]=e[o]);return Dn.forEach((function(e){e in t&&(n[e]=t[e])})),n}function jn(e){e=e.slice();for(var t=Object.create(null),n=0;ns)return[new Un(t,n,"".concat(n," is greater than the maximum value ").concat(s))]}return[]}function Yn(e){var t,n,o,i=e.valueSpec,r=zn(e.value.type),a={},s="categorical"!==r&&void 0===e.value.property,l=!s,c="array"===tn(e.value.stops)&&"array"===tn(e.value.stops[0])&&"object"===tn(e.value.stops[0][0]),u=qn({key:e.key,value:e.value,valueSpec:e.styleSpec.function,style:e.style,styleSpec:e.styleSpec,objectElementValidators:{stops:function(e){if("identity"===r)return[new Un(e.key,e.value,'identity function may not have a "stops" property')];var t=[],n=e.value;t=t.concat(Wn({key:e.key,value:n,valueSpec:e.valueSpec,style:e.style,styleSpec:e.styleSpec,arrayElementValidator:d})),"array"===tn(n)&&0===n.length&&t.push(new Un(e.key,n,"array must have at least one stop"));return t},default:function(e){return lo({key:e.key,value:e.value,valueSpec:i,style:e.style,styleSpec:e.styleSpec})}}});return"identity"===r&&s&&u.push(new Un(e.key,e.value,'missing required property "property"')),"identity"===r||e.value.stops||u.push(new Un(e.key,e.value,'missing required property "stops"')),"exponential"===r&&e.valueSpec.expression&&!en(e.valueSpec)&&u.push(new Un(e.key,e.value,"exponential functions not supported")),e.styleSpec.$version>=8&&(l&&!Qt(e.valueSpec)?u.push(new Un(e.key,e.value,"property functions not supported")):s&&!$t(e.valueSpec)&&u.push(new Un(e.key,e.value,"zoom functions not supported"))),"categorical"!==r&&!c||void 0!==e.value.property||u.push(new Un(e.key,e.value,'"property" property is required')),u;function d(e){var t=[],r=e.value,s=e.key;if("array"!==tn(r))return[new Un(s,r,"array expected, ".concat(tn(r)," found"))];if(2!==r.length)return[new Un(s,r,"array length 2 expected, length ".concat(r.length," found"))];if(c){if("object"!==tn(r[0]))return[new Un(s,r,"object expected, ".concat(tn(r[0])," found"))];if(void 0===r[0].zoom)return[new Un(s,r,"object stop key must have zoom")];if(void 0===r[0].value)return[new Un(s,r,"object stop key must have value")];if(o&&o>zn(r[0].zoom))return[new Un(s,r[0].zoom,"stop zoom values must appear in ascending order")];zn(r[0].zoom)!==o&&(o=zn(r[0].zoom),n=void 0,a={}),t=t.concat(qn({key:"".concat(s,"[0]"),value:r[0],valueSpec:{zoom:{}},style:e.style,styleSpec:e.styleSpec,objectElementValidators:{zoom:Hn,value:p}}))}else t=t.concat(p({key:"".concat(s,"[0]"),value:r[0],valueSpec:{},style:e.style,styleSpec:e.styleSpec},r));return pn(Vn(r[1]))?t.concat([new Un("".concat(s,"[1]"),r[1],"expressions are not allowed in function stops.")]):t.concat(lo({key:"".concat(s,"[1]"),value:r[1],valueSpec:i,style:e.style,styleSpec:e.styleSpec}))}function p(e,o){var s=tn(e.value),l=zn(e.value),c=null!==e.value?e.value:o;if(t){if(s!==t)return[new Un(e.key,c,"".concat(s," stop domain type must match previous stop domain type ").concat(t))]}else t=s;if("number"!==s&&"string"!==s&&"boolean"!==s)return[new Un(e.key,c,"stop domain value must be a number, string, or boolean")];if("number"!==s&&"categorical"!==r){var u="number expected, ".concat(s," found");return Qt(i)&&void 0===r&&(u+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new Un(e.key,c,u)]}return"categorical"!==r||"number"!==s||isFinite(l)&&Math.floor(l)===l?"categorical"!==r&&"number"===s&&void 0!==n&&l":case">=":n.length>=2&&"$type"===zn(n[1])&&a.push(new Un(o,n,'"$type" cannot be use with operator "'.concat(n[0],'"')));case"==":case"!=":3!==n.length&&a.push(new Un(o,n,'filter array for operator "'.concat(n[0],'" must have 3 elements')));case"in":case"!in":n.length>=2&&"string"!==(i=tn(n[1]))&&a.push(new Un("".concat(o,"[1]"),n[1],"string expected, ".concat(i," found")));for(var s=2;s1&&void 0!==arguments[1]?arguments[1]:w,n=[];return n=n.concat(lo({key:"",value:e,valueSpec:t.$root,styleSpec:t,style:e,objectElementValidators:{glyphs:co,"*":function(){return[]}}})),e.constants&&(n=n.concat(Fn({key:"constants",value:e.constants,style:e,styleSpec:t}))),po(n)}function po(e){return[].concat(e).sort((function(e,t){return e.line-t.line}))}function ho(e){return function(){for(var t=arguments.length,n=new Array(t),o=0;oc&&_.push("'"+this.terminals_[b]+"'");M=p.showPosition?"Parse error on line "+(s+1)+":\n"+p.showPosition()+"\nExpecting "+_.join(", ")+", got '"+(this.terminals_[A]||A)+"'":"Parse error on line "+(s+1)+": Unexpected "+(A==u?"end of input":"'"+(this.terminals_[A]||A)+"'"),this.parseError(M,{text:p.match,token:this.terminals_[A]||A,line:p.yylineno,loc:m,expected:_})}if(C[0]instanceof Array&&C.length>1)throw new Error("Parse Error: multiple actions possible at state: "+v+", token: "+A);switch(C[0]){case 1:n.push(A),o.push(p.yytext),i.push(p.yylloc),n.push(C[1]),A=null,l=p.yyleng,a=p.yytext,s=p.yylineno,m=p.yylloc;break;case 2:if(w=this.productions_[C[1]][1],S.$=o[o.length-w],S._$={first_line:i[i.length-(w||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(w||1)].first_column,last_column:i[i.length-1].last_column},f&&(S._$.range=[i[i.length-(w||1)].range[0],i[i.length-1].range[1]]),void 0!==(I=this.performAction.apply(S,[a,l,s,h.yy,C[1],o,i].concat(d))))return I;w&&(n=n.slice(0,-1*w*2),o=o.slice(0,-1*w),i=i.slice(0,-1*w)),n.push(this.productions_[C[1]][0]),o.push(S.$),i.push(S._$),E=r[n[n.length-2]][n[n.length-1]],n.push(E);break;case 3:return!0}}return!0}},p={EOF:1,parseError:function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},setInput:function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},unput:function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var o=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===o.length?this.yylloc.first_column:0)+o[o.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(e){this.unput(this.match.slice(e))},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},test_match:function(e,t){var n,o,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(o=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=o.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:o?o[o.length-1].length-o[o.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in i)this[r]=i[r];return!1}return!1},next:function(){if(this.done)return this.EOF;var e,t,n,o;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),r=0;rt[0].length)){if(t=n,o=r,this.options.backtrack_lexer){if(!1!==(e=this.test_match(n,i[r])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,i[o]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return e||this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"},pushState:function(e){this.begin(e)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(e,t,n,o){switch(n){case 0:break;case 1:return 6;case 2:return t.yytext=t.yytext.substr(1,t.yyleng-2),4;case 3:return 17;case 4:return 18;case 5:return 23;case 6:return 24;case 7:return 22;case 8:return 21;case 9:return 10;case 10:return 11;case 11:return 8;case 12:return 14;case 13:return"INVALID"}},rules:[/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}}};function h(){this.yy={}}return d.lexer=p,h.prototype=d,d.Parser=h,new h}();void 0!==S&&(t.parser=n,t.Parser=n.Parser,t.parse=function(){return n.parse.apply(n,arguments)})}));function mo(e){if(e instanceof String||"string"==typeof e||e instanceof o)try{return go.parse(e.toString())}catch(e){throw new Bn(e)}return e}function fo(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:w,n=e;try{n=mo(n)}catch(e){return[e]}return uo(n,t)}new Set(["vector","raster","raster-dem"]);var yo={StyleExpression:dn,isExpression:pn,isExpressionFilter:Mn,createExpression:hn,createPropertyExpression:fn,normalizePropertyExpression:function(e,t){if(nn(e))return new yn(e,t);if(pn(e)){var n=fn(e,t);if("error"===n.result)throw new Error(n.value.map((function(e){return"".concat(e.key,": ").concat(e.message)})).join(", "));return n.value}var o=e;return"string"==typeof e&&"color"===t.type&&(o=ye.parse(e)),{kind:"constant",evaluate:function(){return o}}},ZoomConstantExpression:gn,ZoomDependentExpression:mn,StylePropertyFunction:yn},Ao={convertFunction:vn,createFunction:rn,isFunction:nn};fo.parsed=fo,fo.latest=fo}).call(this,n(28),n(105).Buffer)},function(e){e.exports=JSON.parse('{"name":"geoportal-extensions","description":"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries","version":"3.0.4","date":"05/06/2024","leafletExtName":"French Geoportal Extension for Leaflet","leafletExtVersion":"2.4.0","olExtName":"French Geoportal Extension for OpenLayers","olExtVersion":"3.4.4","itownsExtName":"French Geoportal Extension for Itowns","itownsExtVersion":"2.5.1","main":"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js","types":"dist/leaflet/index.d.ts, dist/openlayers/index.d.ts, dist/itowns/index.d.ts","module":"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js","directories":{},"scripts":{"setup":"npm install","clean":"echo \\"Warning: target not yet implemented!\\" && exit 0","eslint":"eslint src/","test":"npm run test:serve","test:serve":"cd test && webpack-dev-server --hot --config webpack.test.serve.js","sample":"npm run sample:serve","sample:serve":"npm run sample:ol:serve","sample:itowns:serve":"webpack-dev-server --config build/webpack/webpack.config.itowns --mode=development --https --open-page samples/index-itowns-map.html --content-base . --output-public-path \'/dist/itowns/\' --port 9001 --open","sample:leaflet:serve":"webpack-dev-server --config build/webpack/webpack.config.leaflet --mode=development --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path \'/dist/leaflet/\' --port 9001 --open","sample:ol:serve":"webpack-dev-server --config build/webpack/webpack.config.openlayers --mode=development --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path \'/dist/openlayers/\' --port 9001 --open","generate-types:ol":"npx tsc -p build/types/tsconfig-openlayers.json","generate-types:leaflet":"npx tsc -p build/types/tsconfig-leaflet.json","generate-types:itowns":"npx tsc -p build/types/tsconfig-itowns.json","generate-jsdoc:ol":"jsdoc -c build/jsdoc/jsdoc-openlayers.json","generate-jsdoc:leaflet":"jsdoc -c build/jsdoc/jsdoc-leaflet.json","generate-jsdoc:itowns":"jsdoc -c build/jsdoc/jsdoc-itowns.json","doc":"npm run doc:serve","doc:serve":"npm run doc:ol:serve","doc:itowns:serve":"webpack-dev-server --hot --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open","doc:leaflet:serve":"webpack-dev-server --hot --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open","doc:ol:serve":"webpack-dev-server --hot --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open","build:dev":"npm-run-all --print-label --print-name build:*:dev","build:prod":"npm-run-all --print-label --print-name build:*:prod","build:src":"npm-run-all --print-label --print-name build:*:src","build":"npm-run-all --print-label --print-name build:*:*","build:itowns":"npm-run-all --print-label --print-name build:itowns:*","build:itowns:dev":"webpack --config build/webpack/webpack.config.itowns --mode=development","build:itowns:prod":"webpack --config build/webpack/webpack.config.itowns --mode=production","build:itowns:src":"webpack --config build/webpack/webpack.config.itowns --mode=none","build:ol":"npm-run-all --print-label --print-name build:ol:*","build:ol:dev":"webpack --config build/webpack/webpack.config.openlayers --mode=development","build:ol:prod":"webpack --config build/webpack/webpack.config.openlayers --mode=production","build:ol:src":"webpack --config build/webpack/webpack.config.openlayers --mode=none","build:leaflet":"npm-run-all --print-label --print-name build:leaflet:*","build:leaflet:dev":"webpack --config build/webpack/webpack.config.leaflet --mode=development","build:leaflet:prod":"webpack --config build/webpack/webpack.config.leaflet --mode=production","build:leaflet:src":"webpack --config build/webpack/webpack.config.leaflet --mode=none"},"repository":{"type":"git","url":"https://github.com/IGNF/geoportal-extensions.git"},"author":"IGNF","keywords":["geoportail","geoplateforme","javascript","OpenLayers","Leaflet","Itowns","3D"],"license":"CECILL-B","bugs":{"url":"https://github.com/IGNF/geoportal-extensions/issues"},"homepage":"https://github.com/IGNF/geoportal-extensions#readme","dependencies":{"@mapbox/mapbox-gl-style-spec":"13.20.1","eventbusjs":"0.2.0","geoportal-access-lib":"3.4.2","itowns":"2.38.2","leaflet":"1.7.1","leaflet-draw":"1.0.4","loglevel":"^1.6.7","markdown-toc":"^1.2.0","ol":"6.9.0","ol-mapbox-style":"6.7.0","proj4":"2.7.5","proj4leaflet":"1.0.2","sortablejs":"1.14.0","three":"0.137.5","typescript":"^4.5.5","whatwg-fetch":"3.0.0"},"devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-transform-template-literals":"^7.7.4","@babel/preset-env":"^7.4.4","babel-loader":"^8.0.5","chai":"^4.2.0","chalk":"^4.0.0","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.0.3","core-js":"^3.6.4","css-loader":"^3.4.2","eslint":"^6.8.0","eslint-config-standard":"^14.1.1","eslint-loader":"^4.0.0","eslint-plugin-import":"^2.17.2","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.1.1","eslint-plugin-standard":"^4.0.0","exports-loader":"^0.7.0","expose-loader":"^0.7.5","fs-extra":"^9.0.0","handlebars":"^4.7.5","handlebars-layouts":"^3.1.4","html-webpack-plugin":"^4.0.4","jsdoc-webpack-plugin":"^0.3.0","mini-css-extract-plugin":"^0.9.0","mocha":"^7.1.1","mocha-loader":"^5.0.0","npm-run-all":"^4.1.5","optimize-css-assets-webpack-plugin":"^5.0.1","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","requirejs":"^2.3.6","responsive-loader":"^1.2.0","speed-measure-webpack-plugin":"^1.3.0","string-template":"^1.0.0","style-loader":"^1.1.3","terser-webpack-plugin":"^2.0.0","url-loader":"^4.0.0","webpack":"^4.30.0","webpack-cli":"^3.3.1","webpack-dev-server":"^3.3.1","webpack-node-externals":"^1.7.2"}}')},function(e,t,n){var o,i;!function(r,a){"use strict";void 0===(i="function"==typeof(o=function(){var e=function(){},t="undefined"!=typeof window&&void 0!==window.navigator&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"],o={},i=null;function r(e,t){var n=e[t];if("function"==typeof n.bind)return n.bind(e);try{return Function.prototype.bind.call(n,e)}catch(t){return function(){return Function.prototype.apply.apply(n,[e,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function s(n){return"debug"===n&&(n="log"),"undefined"!=typeof console&&("trace"===n&&t?a:void 0!==console[n]?r(console,n):void 0!==console.log?r(console,"log"):e)}function l(){for(var t=this.getLevel(),o=0;o=0&&t<=c.levels.SILENT)return t;throw new TypeError("log.setLevel() called with invalid level: "+e)}"string"==typeof e?d+=":"+e:"symbol"==typeof e&&(d=void 0),c.name=e,c.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},c.methodFactory=t||u,c.getLevel=function(){return null!=s?s:null!=a?a:r},c.setLevel=function(e,t){return s=h(e),!1!==t&&function(e){var t=(n[e]||"silent").toUpperCase();if("undefined"!=typeof window&&d){try{return void(window.localStorage[d]=t)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"="+t+";"}catch(e){}}}(s),l.call(c)},c.setDefaultLevel=function(e){a=h(e),p()||c.setLevel(e,!1)},c.resetLevel=function(){s=null,function(){if("undefined"!=typeof window&&d){try{window.localStorage.removeItem(d)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch(e){}}}(),l.call(c)},c.enableAll=function(e){c.setLevel(c.levels.TRACE,e)},c.disableAll=function(e){c.setLevel(c.levels.SILENT,e)},c.rebuild=function(){if(i!==c&&(r=h(i.getLevel())),l.call(c),i===c)for(var e in o)o[e].rebuild()},r=h(i?i.getLevel():"WARN");var g=p();null!=g&&(s=h(g)),l.call(c)}(i=new d).getLogger=function(e){if("symbol"!=typeof e&&"string"!=typeof e||""===e)throw new TypeError("You must supply a name when creating a logger.");var t=o[e];return t||(t=o[e]=new d(e,i.methodFactory)),t};var p="undefined"!=typeof window?window.log:void 0;return i.noConflict=function(){return"undefined"!=typeof window&&window.log===i&&(window.log=p),i},i.getLoggers=function(){return o},i.default=i,i})?o.call(t,n,t,e):o)||(e.exports=i)}()},function(e,t,n){(function(t){e.exports=t.proj4=n(109)}).call(this,n(28))},function(e,t){e.exports=ol.layer.Tile},function(e,t){e.exports=ol.extent},function(e,t){e.exports=ol.layer.VectorTile},function(e,t){e.exports=ol.Collection},function(e,t){e.exports=ol.source.TileJSON},function(e,t){e.exports=ol.format.MVT},function(e,t){e.exports=ol.events.condition},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){e.exports=ol.source.TileWMS},function(e,t){e.exports=ol.source.WMTS},function(e){e.exports=JSON.parse('{"_from":"geoportal-access-lib@3.4.2","_id":"geoportal-access-lib@3.4.2","_inBundle":false,"_integrity":"sha512-dg7lW+4jhlMQzWp95ejqJLVDYgBQeTY7/ypP7qo3GS2ci4KghdgaFeFftUFbEbOSKQ6cn7FUbBTXAKB6uUADlw==","_location":"/geoportal-access-lib","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"geoportal-access-lib@3.4.2","name":"geoportal-access-lib","escapedName":"geoportal-access-lib","rawSpec":"3.4.2","saveSpec":null,"fetchSpec":"3.4.2"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/geoportal-access-lib/-/geoportal-access-lib-3.4.2.tgz","_shasum":"8f92a231104f195dbd098add811ae1367877ef7d","_spec":"geoportal-access-lib@3.4.2","_where":"/home/runner/work/geoportal-extensions/geoportal-extensions","author":{"name":"IGNF"},"bugs":{"url":"https://github.com/IGNF/geoportal-access-lib/issues"},"bundleDependencies":false,"date":"14/05/2024","dependencies":{"@xmldom/xmldom":"^0.8.10","es6-promise":"^4.2.4","node-fetch":"^2.6.1"},"deprecated":false,"description":"French Geoportal resources access library","devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-transform-template-literals":"^7.12.1","@babel/preset-env":"^7.12.11","babel-loader":"^8.2.2","chai":"^4.1.2","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.1.2","eslint":"^7.18.0","eslint-config-standard":"^16.0.2","eslint-loader":"^4.0.2","eslint-plugin-import":"^2.22.1","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.2.1","eslint-plugin-standard":"^5.0.0","glob":"^7.1.2","handlebars-layouts":"^3.1.4","handlebars-webpack-plugin":"^1.4.1","html-webpack-plugin":"^4.5.1","istanbul-instrumenter-loader":"^3.0.1","jsdoc-webpack-plugin":"^0.3.0","loglevel":"^1.6.1","mocha":"^7.2.0","mocha-loader":"^5.1.5","mocha-webpack":"^2.0.0-beta.0","mochawesome":"^6.2.1","nyc":"^15.1.0","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","sinon":"^9.2.4","sinon-es6":"0.0.3","speed-measure-webpack-plugin":"^1.4.2","string-template":"^1.0.0","terser-webpack-plugin":"^2.3.8","webpack":"^4.46.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.2","webpack-node-externals":"^2.5.2","webpack-shell-plugin":"^0.5.0"},"homepage":"https://github.com/IGNF/geoportal-access-lib#readme","keywords":["geoplateforme","geoportail","webservice","javascript","es6"],"license":"CECILL-B","main":"dist/GpServices-src.js","module":"src/Gp.js","name":"geoportal-access-lib","nyc":{"include":["src/**/*.js"],"instrument":false,"sourceMap":false},"optionalDependencies":{},"peerDependencies":{},"repository":{"type":"git","url":"git+https://github.com/IGNF/geoportal-access-lib.git"},"scripts":{"build":"webpack --mode=none","build:dev":"webpack --mode=development","build:prod":"webpack --mode=production","clean":"echo \\"Warning: no yet implemented!\\" && exit 0","cover":"nyc --reporter=lcov --reporter=text npm run test","doc":"npm run doc:serve","doc:serve":"webpack-dev-server --content-base jsdoc --port 9001 --open","eslint":"eslint src/","sample":"npm run sample:serve","sample:serve":"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:dev":"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:prod":"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","setup":"npm install","test":"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\"test_*.js\\" test/spec/","test:end-to-end:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js","test:end-to-end:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js","test:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js","test:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js"},"version":"3.4.2"}')},function(e,t){e.exports=ol.style.Circle},function(e,t){e.exports=ol.style.Icon},function(e,t){e.exports=ol.style.Text},function(e,t,n){"use strict";function o(e,t){return void 0===t&&(t=Object),t&&"function"==typeof t.freeze?t.freeze(e):e}var i=o({HTML:"text/html",isHTML:function(e){return e===i.HTML},XML_APPLICATION:"application/xml",XML_TEXT:"text/xml",XML_XHTML_APPLICATION:"application/xhtml+xml",XML_SVG_IMAGE:"image/svg+xml"}),r=o({HTML:"http://www.w3.org/1999/xhtml",isHTML:function(e){return e===r.HTML},SVG:"http://www.w3.org/2000/svg",XML:"http://www.w3.org/XML/1998/namespace",XMLNS:"http://www.w3.org/2000/xmlns/"});t.assign=function(e,t){if(null===e||"object"!=typeof e)throw new TypeError("target is not an object");for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},t.find=function(e,t,n){if(void 0===n&&(n=Array.prototype),e&&"function"==typeof n.find)return n.find.call(e,t);for(var o=0;o1?g[g.length-2].toLowerCase():"";if(m==f||m==f.replace("-","")||y+"-"+m==f){c=s?c:n[f],g.pop(),y&&f.startsWith(y)&&g.pop();break}}s||"number"!=typeof m||(c=m,s=!0);var A=g.join(" ").replace("Klokantech Noto Sans","Noto Sans");-1!==A.indexOf(" ")&&(A='"'+A+'"'),d.push(A)}a=i[e]=[u,c,d]}return a[0]+" "+a[1]+" "+t+"px"+(r?"/"+r:"")+" "+a[2]}},function(e,t){e.exports=ol.Map},function(e,t){e.exports=ol.tilegrid.TileGrid},function(e,t){e.exports=ol.render.canvas},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t){e.exports=void 0},function(e,t,n){var o=n(61);t.DOMImplementation=o.DOMImplementation,t.XMLSerializer=o.XMLSerializer,t.DOMParser=n(102).DOMParser},function(e,t,n){var o=n(35),i=o.find,r=o.NAMESPACE;function a(e){return""!==e}function s(e,t){return e.hasOwnProperty(t)||(e[t]=!0),e}function l(e){if(!e)return[];var t=function(e){return e?e.split(/[\t\n\f\r ]+/).filter(a):[]}(e);return Object.keys(t.reduce(s,{}))}function c(e,t){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])}function u(e,t){var n=e.prototype;if(!(n instanceof t)){function o(){}o.prototype=t.prototype,c(n,o=new o),e.prototype=n=o}n.constructor!=e&&("function"!=typeof e&&console.error("unknown Class:"+e),n.constructor=e)}var d={},p=d.ELEMENT_NODE=1,h=d.ATTRIBUTE_NODE=2,g=d.TEXT_NODE=3,m=d.CDATA_SECTION_NODE=4,f=d.ENTITY_REFERENCE_NODE=5,y=d.ENTITY_NODE=6,A=d.PROCESSING_INSTRUCTION_NODE=7,v=d.COMMENT_NODE=8,C=d.DOCUMENT_NODE=9,I=d.DOCUMENT_TYPE_NODE=10,b=d.DOCUMENT_FRAGMENT_NODE=11,w=d.NOTATION_NODE=12,E={},_={},S=(E.INDEX_SIZE_ERR=(_[1]="Index size error",1),E.DOMSTRING_SIZE_ERR=(_[2]="DOMString size error",2),E.HIERARCHY_REQUEST_ERR=(_[3]="Hierarchy request error",3)),M=(E.WRONG_DOCUMENT_ERR=(_[4]="Wrong document",4),E.INVALID_CHARACTER_ERR=(_[5]="Invalid character",5),E.NO_DATA_ALLOWED_ERR=(_[6]="No data allowed",6),E.NO_MODIFICATION_ALLOWED_ERR=(_[7]="No modification allowed",7),E.NOT_FOUND_ERR=(_[8]="Not found",8)),P=(E.NOT_SUPPORTED_ERR=(_[9]="Not supported",9),E.INUSE_ATTRIBUTE_ERR=(_[10]="Attribute in use",10));E.INVALID_STATE_ERR=(_[11]="Invalid state",11),E.SYNTAX_ERR=(_[12]="Syntax error",12),E.INVALID_MODIFICATION_ERR=(_[13]="Invalid modification",13),E.NAMESPACE_ERR=(_[14]="Invalid namespace",14),E.INVALID_ACCESS_ERR=(_[15]="Invalid access",15);function x(e,t){if(t instanceof Error)var n=t;else n=this,Error.call(this,_[e]),this.message=_[e],Error.captureStackTrace&&Error.captureStackTrace(this,x);return n.code=e,t&&(this.message=this.message+": "+t),n}function k(){}function G(e,t){this._node=e,this._refresh=t,R(this)}function R(e){var t=e._node._inc||e._node.ownerDocument._inc;if(e._inc!==t){var n=e._refresh(e._node);if(ye(e,"length",n.length),!e.$$length||n.length=0))throw new x(M,new Error(e.tagName+"@"+n));for(var i=t.length-1;o"==e&&">")||"&"==e&&"&"||'"'==e&&"""||"&#"+e.charCodeAt()+";"}function B(e,t){if(t(e))return!0;if(e=e.firstChild)do{if(B(e,t))return!0}while(e=e.nextSibling)}function F(){this.ownerDocument=this}function z(e,t,n,o){e&&e._inc++,n.namespaceURI===r.XMLNS&&delete t._nsMap[n.prefix?n.localName:""]}function V(e,t,n){if(e&&e._inc){e._inc++;var o=t.childNodes;if(n)o[o.length++]=n;else{for(var i=t.firstChild,r=0;i;)o[r++]=i,i=i.nextSibling;o.length=r,delete o[o.length]}}}function q(e,t){var n=t.previousSibling,o=t.nextSibling;return n?n.nextSibling=o:e.firstChild=o,o?o.previousSibling=n:e.lastChild=n,t.parentNode=null,t.previousSibling=null,t.nextSibling=null,V(e.ownerDocument,e),t}function W(e){return e&&e.nodeType===j.DOCUMENT_TYPE_NODE}function H(e){return e&&e.nodeType===j.ELEMENT_NODE}function Y(e){return e&&e.nodeType===j.TEXT_NODE}function J(e,t){var n=e.childNodes||[];if(i(n,H)||W(t))return!1;var o=i(n,W);return!(t&&o&&n.indexOf(o)>n.indexOf(t))}function Z(e,t){var n=e.childNodes||[];if(i(n,(function(e){return H(e)&&e!==t})))return!1;var o=i(n,W);return!(t&&o&&n.indexOf(o)>n.indexOf(t))}function K(e,t,n){if(!function(e){return e&&(e.nodeType===j.DOCUMENT_NODE||e.nodeType===j.DOCUMENT_FRAGMENT_NODE||e.nodeType===j.ELEMENT_NODE)}(e))throw new x(S,"Unexpected parent node type "+e.nodeType);if(n&&n.parentNode!==e)throw new x(M,"child not in parent");if(!function(e){return e&&(H(e)||Y(e)||W(e)||e.nodeType===j.DOCUMENT_FRAGMENT_NODE||e.nodeType===j.COMMENT_NODE||e.nodeType===j.PROCESSING_INSTRUCTION_NODE)}(t)||W(t)&&e.nodeType!==j.DOCUMENT_NODE)throw new x(S,"Unexpected node type "+t.nodeType+" for parent node type "+e.nodeType)}function X(e,t,n){var o=e.childNodes||[],r=t.childNodes||[];if(t.nodeType===j.DOCUMENT_FRAGMENT_NODE){var a=r.filter(H);if(a.length>1||i(r,Y))throw new x(S,"More than one element or text in fragment");if(1===a.length&&!J(e,n))throw new x(S,"Element in fragment can not be inserted before doctype")}if(H(t)&&!J(e,n))throw new x(S,"Only one element can be added and only after doctype");if(W(t)){if(i(o,W))throw new x(S,"Only one doctype is allowed");var s=i(o,H);if(n&&o.indexOf(s)1||i(r,Y))throw new x(S,"More than one element or text in fragment");if(1===a.length&&!Z(e,n))throw new x(S,"Element in fragment can not be inserted before doctype")}if(H(t)&&!Z(e,n))throw new x(S,"Only one element can be added and only after doctype");if(W(t)){if(i(o,(function(e){return W(e)&&e!==n})))throw new x(S,"Only one doctype is allowed");var s=i(o,H);if(n&&o.indexOf(s)=0;w--){if(""===(E=i[w]).prefix&&E.namespace===e.namespaceURI){d=E.namespace;break}}if(d!==e.namespaceURI)for(w=i.length-1;w>=0;w--){var E;if((E=i[w]).namespace===e.namespaceURI){E.prefix&&(u=E.prefix+":"+c);break}}}t.push("<",u);for(var _=0;_"),n&&/^script$/i.test(c))for(;l;)l.data?t.push(l.data):fe(l,t,n,o,i.slice()),l=l.nextSibling;else for(;l;)fe(l,t,n,o,i.slice()),l=l.nextSibling;t.push("")}else t.push("/>");return;case C:case b:for(l=e.firstChild;l;)fe(l,t,n,o,i.slice()),l=l.nextSibling;return;case h:return me(t,e.name,e.value);case g:return t.push(e.data.replace(/[<&>]/g,U));case m:return t.push("");case v:return t.push("\x3c!--",e.data,"--\x3e");case I:var x=e.publicId,k=e.systemId;if(t.push("");else if(k&&"."!=k)t.push(" SYSTEM ",k,">");else{var G=e.internalSubset;G&&t.push(" [",G,"]"),t.push(">")}return;case A:return t.push("");case f:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function ye(e,t,n){e[t]=n}x.prototype=Error.prototype,c(E,x),k.prototype={length:0,item:function(e){return e>=0&&e0},lookupPrefix:function(e){for(var t=this;t;){var n=t._nsMap;if(n)for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o)&&n[o]===e)return o;t=t.nodeType==h?t.ownerDocument:t.parentNode}return null},lookupNamespaceURI:function(e){for(var t=this;t;){var n=t._nsMap;if(n&&Object.prototype.hasOwnProperty.call(n,e))return n[e];t=t.nodeType==h?t.ownerDocument:t.parentNode}return null},isDefaultNamespace:function(e){return null==this.lookupPrefix(e)}},c(d,j),c(d,j.prototype),F.prototype={nodeName:"#document",nodeType:C,doctype:null,documentElement:null,_inc:1,insertBefore:function(e,t){if(e.nodeType==b){for(var n=e.firstChild;n;){var o=n.nextSibling;this.insertBefore(n,t),n=o}return e}return $(this,e,t),e.ownerDocument=this,null===this.documentElement&&e.nodeType===p&&(this.documentElement=e),e},removeChild:function(e){return this.documentElement==e&&(this.documentElement=null),q(this,e)},replaceChild:function(e,t){$(this,e,t,Q),e.ownerDocument=this,t&&this.removeChild(t),H(e)&&(this.documentElement=e)},importNode:function(e,t){return function e(t,n,o){var i;switch(n.nodeType){case p:(i=n.cloneNode(!1)).ownerDocument=t;case b:break;case h:o=!0}i||(i=n.cloneNode(!1));if(i.ownerDocument=t,i.parentNode=null,o)for(var r=n.firstChild;r;)i.appendChild(e(t,r,o)),r=r.nextSibling;return i}(this,e,t)},getElementById:function(e){var t=null;return B(this.documentElement,(function(n){if(n.nodeType==p&&n.getAttribute("id")==e)return t=n,!0})),t},getElementsByClassName:function(e){var t=l(e);return new G(this,(function(n){var o=[];return t.length>0&&B(n.documentElement,(function(i){if(i!==n&&i.nodeType===p){var r=i.getAttribute("class");if(r){var a=e===r;if(!a){var s=l(r);a=t.every((c=s,function(e){return c&&-1!==c.indexOf(e)}))}a&&o.push(i)}}var c})),o}))},createElement:function(e){var t=new ee;return t.ownerDocument=this,t.nodeName=e,t.tagName=e,t.localName=e,t.childNodes=new k,(t.attributes=new T)._ownerElement=t,t},createDocumentFragment:function(){var e=new ue;return e.ownerDocument=this,e.childNodes=new k,e},createTextNode:function(e){var t=new oe;return t.ownerDocument=this,t.appendData(e),t},createComment:function(e){var t=new ie;return t.ownerDocument=this,t.appendData(e),t},createCDATASection:function(e){var t=new re;return t.ownerDocument=this,t.appendData(e),t},createProcessingInstruction:function(e,t){var n=new de;return n.ownerDocument=this,n.tagName=n.nodeName=n.target=e,n.nodeValue=n.data=t,n},createAttribute:function(e){var t=new te;return t.ownerDocument=this,t.name=e,t.nodeName=e,t.localName=e,t.specified=!0,t},createEntityReference:function(e){var t=new ce;return t.ownerDocument=this,t.nodeName=e,t},createElementNS:function(e,t){var n=new ee,o=t.split(":"),i=n.attributes=new T;return n.childNodes=new k,n.ownerDocument=this,n.nodeName=t,n.tagName=t,n.namespaceURI=e,2==o.length?(n.prefix=o[0],n.localName=o[1]):n.localName=t,i._ownerElement=n,n},createAttributeNS:function(e,t){var n=new te,o=t.split(":");return n.ownerDocument=this,n.nodeName=t,n.name=t,n.namespaceURI=e,n.specified=!0,2==o.length?(n.prefix=o[0],n.localName=o[1]):n.localName=t,n}},u(F,j),ee.prototype={nodeType:p,hasAttribute:function(e){return null!=this.getAttributeNode(e)},getAttribute:function(e){var t=this.getAttributeNode(e);return t&&t.value||""},getAttributeNode:function(e){return this.attributes.getNamedItem(e)},setAttribute:function(e,t){var n=this.ownerDocument.createAttribute(e);n.value=n.nodeValue=""+t,this.setAttributeNode(n)},removeAttribute:function(e){var t=this.getAttributeNode(e);t&&this.removeAttributeNode(t)},appendChild:function(e){return e.nodeType===b?this.insertBefore(e,null):function(e,t){return t.parentNode&&t.parentNode.removeChild(t),t.parentNode=e,t.previousSibling=e.lastChild,t.nextSibling=null,t.previousSibling?t.previousSibling.nextSibling=t:e.firstChild=t,e.lastChild=t,V(e.ownerDocument,e,t),t}(this,e)},setAttributeNode:function(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);n&&this.removeAttributeNode(n)},hasAttributeNS:function(e,t){return null!=this.getAttributeNodeNS(e,t)},getAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);return n&&n.value||""},setAttributeNS:function(e,t,n){var o=this.ownerDocument.createAttributeNS(e,t);o.value=o.nodeValue=""+n,this.setAttributeNode(o)},getAttributeNodeNS:function(e,t){return this.attributes.getNamedItemNS(e,t)},getElementsByTagName:function(e){return new G(this,(function(t){var n=[];return B(t,(function(o){o===t||o.nodeType!=p||"*"!==e&&o.tagName!=e||n.push(o)})),n}))},getElementsByTagNameNS:function(e,t){return new G(this,(function(n){var o=[];return B(n,(function(i){i===n||i.nodeType!==p||"*"!==e&&i.namespaceURI!==e||"*"!==t&&i.localName!=t||o.push(i)})),o}))}},F.prototype.getElementsByTagName=ee.prototype.getElementsByTagName,F.prototype.getElementsByTagNameNS=ee.prototype.getElementsByTagNameNS,u(ee,j),te.prototype.nodeType=h,u(te,j),ne.prototype={data:"",substringData:function(e,t){return this.data.substring(e,e+t)},appendData:function(e){e=this.data+e,this.nodeValue=this.data=e,this.length=e.length},insertData:function(e,t){this.replaceData(e,0,t)},appendChild:function(e){throw new Error(_[S])},deleteData:function(e,t){this.replaceData(e,t,"")},replaceData:function(e,t,n){n=this.data.substring(0,e)+n+this.data.substring(e+t),this.nodeValue=this.data=n,this.length=n.length}},u(ne,j),oe.prototype={nodeName:"#text",nodeType:g,splitText:function(e){var t=this.data,n=t.substring(e);t=t.substring(0,e),this.data=this.nodeValue=t,this.length=t.length;var o=this.ownerDocument.createTextNode(n);return this.parentNode&&this.parentNode.insertBefore(o,this.nextSibling),o}},u(oe,ne),ie.prototype={nodeName:"#comment",nodeType:v},u(ie,ne),re.prototype={nodeName:"#cdata-section",nodeType:m},u(re,ne),ae.prototype.nodeType=I,u(ae,j),se.prototype.nodeType=w,u(se,j),le.prototype.nodeType=y,u(le,j),ce.prototype.nodeType=f,u(ce,j),ue.prototype.nodeName="#document-fragment",ue.prototype.nodeType=b,u(ue,j),de.prototype.nodeType=A,u(de,j),pe.prototype.serializeToString=function(e,t,n){return he.call(e,t,n)},j.prototype.toString=he;try{if(Object.defineProperty){Object.defineProperty(G.prototype,"length",{get:function(){return R(this),this.$$length}}),Object.defineProperty(j.prototype,"textContent",{get:function(){return function e(t){switch(t.nodeType){case p:case b:var n=[];for(t=t.firstChild;t;)7!==t.nodeType&&8!==t.nodeType&&n.push(e(t)),t=t.nextSibling;return n.join("");default:return t.nodeValue}}(this)},set:function(e){switch(this.nodeType){case p:case b:for(;this.firstChild;)this.removeChild(this.firstChild);(e||String(e))&&this.appendChild(this.ownerDocument.createTextNode(e));break;default:this.data=e,this.value=e,this.nodeValue=e}}}),ye=function(e,t,n){e["$$"+t]=n}}}catch(e){}t.DocumentType=ae,t.DOMException=x,t.DOMImplementation=N,t.Element=ee,t.Node=j,t.NodeList=k,t.XMLSerializer=pe},function(e,t){e.exports=void 0},function(e,t){e.exports=ol.source.ImageWMS},function(e,t,n){(function(t,n){ /*! * @overview es6-promise - a tiny implementation of Promises/A+. * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) @@ -105,11 +105,11 @@ var Gp=function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o] */ var o=n(106),i=n(107),r=n(108);function a(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(a()=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function g(e,t){if(l.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var o=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return B(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return F(e).length;default:if(o)return B(e).length;t=(""+t).toLowerCase(),o=!0}}function m(e,t,n){var o=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return x(this,t,n);case"utf8":case"utf-8":return S(this,t,n);case"ascii":return M(this,t,n);case"latin1":case"binary":return P(this,t,n);case"base64":return _(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return k(this,t,n);default:if(o)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),o=!0}}function f(e,t,n){var o=e[t];e[t]=e[n],e[n]=o}function y(e,t,n,o,i){if(0===e.length)return-1;if("string"==typeof n?(o=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=l.from(t,o)),l.isBuffer(t))return 0===t.length?-1:A(e,t,n,o,i);if("number"==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):A(e,[t],n,o,i);throw new TypeError("val must be string, number or Buffer")}function A(e,t,n,o,i){var r,a=1,s=e.length,l=t.length;if(void 0!==o&&("ucs2"===(o=String(o).toLowerCase())||"ucs-2"===o||"utf16le"===o||"utf-16le"===o)){if(e.length<2||t.length<2)return-1;a=2,s/=2,l/=2,n/=2}function c(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(i){var u=-1;for(r=n;rs&&(n=s-l),r=n;r>=0;r--){for(var d=!0,p=0;pi&&(o=i):o=i;var r=t.length;if(r%2!=0)throw new TypeError("Invalid hex string");o>r/2&&(o=r/2);for(var a=0;a>8,i=n%256,r.push(i),r.push(o);return r}(t,e.length-n),e,n,o)}function _(e,t,n){return 0===t&&n===e.length?o.fromByteArray(e):o.fromByteArray(e.slice(t,n))}function S(e,t,n){n=Math.min(e.length,n);for(var o=[],i=t;i239?4:c>223?3:c>191?2:1;if(i+d<=n)switch(d){case 1:c<128&&(u=c);break;case 2:128==(192&(r=e[i+1]))&&(l=(31&c)<<6|63&r)>127&&(u=l);break;case 3:r=e[i+1],a=e[i+2],128==(192&r)&&128==(192&a)&&(l=(15&c)<<12|(63&r)<<6|63&a)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:r=e[i+1],a=e[i+2],s=e[i+3],128==(192&r)&&128==(192&a)&&128==(192&s)&&(l=(15&c)<<18|(63&r)<<12|(63&a)<<6|63&s)>65535&&l<1114112&&(u=l)}null===u?(u=65533,d=1):u>65535&&(u-=65536,o.push(u>>>10&1023|55296),u=56320|1023&u),o.push(u),i+=d}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var n="",o=0;for(;o0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},l.prototype.compare=function(e,t,n,o,i){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===o&&(o=0),void 0===i&&(i=this.length),t<0||n>e.length||o<0||i>this.length)throw new RangeError("out of range index");if(o>=i&&t>=n)return 0;if(o>=i)return-1;if(t>=n)return 1;if(this===e)return 0;for(var r=(i>>>=0)-(o>>>=0),a=(n>>>=0)-(t>>>=0),s=Math.min(r,a),c=this.slice(o,i),u=e.slice(t,n),d=0;di)&&(n=i),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");for(var r=!1;;)switch(o){case"hex":return v(this,e,t,n);case"utf8":case"utf-8":return C(this,e,t,n);case"ascii":return I(this,e,t,n);case"latin1":case"binary":return b(this,e,t,n);case"base64":return w(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,e,t,n);default:if(r)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),r=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function M(e,t,n){var o="";n=Math.min(e.length,n);for(var i=t;io)&&(n=o);for(var i="",r=t;rn)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,o,i,r){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function T(e,t,n,o){t<0&&(t=65535+t+1);for(var i=0,r=Math.min(e.length-n,2);i>>8*(o?i:1-i)}function O(e,t,n,o){t<0&&(t=4294967295+t+1);for(var i=0,r=Math.min(e.length-n,4);i>>8*(o?i:3-i)&255}function L(e,t,n,o,i,r){if(n+o>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,o,r){return r||L(e,0,n,4),i.write(e,t,n,o,23,4),n+4}function N(e,t,n,o,r){return r||L(e,0,n,8),i.write(e,t,n,o,52,8),n+8}l.prototype.slice=function(e,t){var n,o=this.length;if((e=~~e)<0?(e+=o)<0&&(e=0):e>o&&(e=o),(t=void 0===t?o:~~t)<0?(t+=o)<0&&(t=0):t>o&&(t=o),t0&&(i*=256);)o+=this[e+--t]*i;return o},l.prototype.readUInt8=function(e,t){return t||G(e,1,this.length),this[e]},l.prototype.readUInt16LE=function(e,t){return t||G(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUInt16BE=function(e,t){return t||G(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUInt32LE=function(e,t){return t||G(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUInt32BE=function(e,t){return t||G(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||G(e,t,this.length);for(var o=this[e],i=1,r=0;++r=(i*=128)&&(o-=Math.pow(2,8*t)),o},l.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||G(e,t,this.length);for(var o=t,i=1,r=this[e+--o];o>0&&(i*=256);)r+=this[e+--o]*i;return r>=(i*=128)&&(r-=Math.pow(2,8*t)),r},l.prototype.readInt8=function(e,t){return t||G(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){t||G(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt16BE=function(e,t){t||G(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt32LE=function(e,t){return t||G(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return t||G(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readFloatLE=function(e,t){return t||G(e,4,this.length),i.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return t||G(e,4,this.length),i.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return t||G(e,8,this.length),i.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return t||G(e,8,this.length),i.read(this,e,!1,52,8)},l.prototype.writeUIntLE=function(e,t,n,o){(e=+e,t|=0,n|=0,o)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var i=1,r=0;for(this[t]=255&e;++r=0&&(r*=256);)this[t+i]=e/r&255;return t+n},l.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},l.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):T(this,e,t,!0),t+2},l.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):T(this,e,t,!1),t+2},l.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):O(this,e,t,!0),t+4},l.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):O(this,e,t,!1),t+4},l.prototype.writeIntLE=function(e,t,n,o){if(e=+e,t|=0,!o){var i=Math.pow(2,8*n-1);R(this,e,t,n,i-1,-i)}var r=0,a=1,s=0;for(this[t]=255&e;++r>0)-s&255;return t+n},l.prototype.writeIntBE=function(e,t,n,o){if(e=+e,t|=0,!o){var i=Math.pow(2,8*n-1);R(this,e,t,n,i-1,-i)}var r=n-1,a=1,s=0;for(this[t+r]=255&e;--r>=0&&(a*=256);)e<0&&0===s&&0!==this[t+r+1]&&(s=1),this[t+r]=(e/a>>0)-s&255;return t+n},l.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):T(this,e,t,!0),t+2},l.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):T(this,e,t,!1),t+2},l.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):O(this,e,t,!0),t+4},l.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):O(this,e,t,!1),t+4},l.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},l.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},l.prototype.writeDoubleLE=function(e,t,n){return N(this,e,t,!0,n)},l.prototype.writeDoubleBE=function(e,t,n){return N(this,e,t,!1,n)},l.prototype.copy=function(e,t,n,o){if(n||(n=0),o||0===o||(o=this.length),t>=e.length&&(t=e.length),t||(t=0),o>0&&o=this.length)throw new RangeError("sourceStart out of bounds");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),e.length-t=0;--i)e[i+t]=this[i+n];else if(r<1e3||!l.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r55295&&n<57344){if(!i){if(n>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(a+1===o){(t-=3)>-1&&r.push(239,191,189);continue}i=n;continue}if(n<56320){(t-=3)>-1&&r.push(239,191,189),i=n;continue}n=65536+(i-55296<<10|n-56320)}else i&&(t-=3)>-1&&r.push(239,191,189);if(i=null,n<128){if((t-=1)<0)break;r.push(n)}else if(n<2048){if((t-=2)<0)break;r.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function F(e){return o.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(j,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function z(e,t,n,o){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}}).call(this,n(28))},function(e,t,n){"use strict";t.byteLength=function(e){var t=c(e),n=t[0],o=t[1];return 3*(n+o)/4-o},t.toByteArray=function(e){var t,n,o=c(e),a=o[0],s=o[1],l=new r(function(e,t,n){return 3*(t+n)/4-n}(0,a,s)),u=0,d=s>0?a-4:a;for(n=0;n>16&255,l[u++]=t>>8&255,l[u++]=255&t;2===s&&(t=i[e.charCodeAt(n)]<<2|i[e.charCodeAt(n+1)]>>4,l[u++]=255&t);1===s&&(t=i[e.charCodeAt(n)]<<10|i[e.charCodeAt(n+1)]<<4|i[e.charCodeAt(n+2)]>>2,l[u++]=t>>8&255,l[u++]=255&t);return l},t.fromByteArray=function(e){for(var t,n=e.length,i=n%3,r=[],a=0,s=n-i;as?s:a+16383));1===i?(t=e[n-1],r.push(o[t>>2]+o[t<<4&63]+"==")):2===i&&(t=(e[n-2]<<8)+e[n-1],r.push(o[t>>10]+o[t>>4&63]+o[t<<2&63]+"="));return r.join("")};for(var o=[],i=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,l=a.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function u(e,t,n){for(var i,r,a=[],s=t;s>18&63]+o[r>>12&63]+o[r>>6&63]+o[63&r]);return a.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ -t.read=function(e,t,n,o,i){var r,a,s=8*i-o-1,l=(1<>1,u=-7,d=n?i-1:0,p=n?-1:1,h=e[t+d];for(d+=p,r=h&(1<<-u)-1,h>>=-u,u+=s;u>0;r=256*r+e[t+d],d+=p,u-=8);for(a=r&(1<<-u)-1,r>>=-u,u+=o;u>0;a=256*a+e[t+d],d+=p,u-=8);if(0===r)r=1-c;else{if(r===l)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,o),r-=c}return(h?-1:1)*a*Math.pow(2,r-o)},t.write=function(e,t,n,o,i,r){var a,s,l,c=8*r-i-1,u=(1<>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=o?0:r-1,g=o?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=u):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),(t+=a+d>=1?p/l:p*Math.pow(2,1-d))*l>=2&&(a++,l/=2),a+d>=u?(s=0,a=u):a+d>=1?(s=(t*l-1)*Math.pow(2,i),a+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,i),a=0));i>=8;e[n+h]=255&s,h+=g,s/=256,i-=8);for(a=a<0;e[n+h]=255&a,h+=g,a/=256,c-=8);e[n+h-g]|=128*m}},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},function(e,t,n){e.exports=function(){"use strict";var e=484813681109536e-20,t=Math.PI/2,n=.017453292519943295,o=57.29577951308232,i=Math.PI/4,r=2*Math.PI,a=3.14159265359,s={greenwich:0,lisbon:-9.131906111111,paris:2.337229166667,bogota:-74.080916666667,madrid:-3.687938888889,rome:12.452333333333,bern:7.439583333333,jakarta:106.807719444444,ferro:-17.666666666667,brussels:4.367975,stockholm:18.058277777778,athens:23.7163375,oslo:10.722916666667},l={ft:{to_meter:.3048},"us-ft":{to_meter:1200/3937}},c=/[\s_\-\/\(\)]/g;function u(e,t){if(e[t])return e[t];for(var n,o=Object.keys(e),i=t.toLowerCase().replace(c,""),r=-1;++r=this.text.length)return;e=this.text[this.place++]}switch(this.state){case 1:return this.neutral(e);case 2:return this.keyword(e);case 4:return this.quoted(e);case 5:return this.afterquote(e);case 3:return this.number(e);case-1:return}},y.prototype.afterquote=function(e){if('"'===e)return this.word+='"',void(this.state=4);if(m.test(e))return this.word=this.word.trim(),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in afterquote yet, index '+this.place)},y.prototype.afterItem=function(e){return","===e?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=1)):"]"===e?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=1,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},y.prototype.number=function(e){if(!f.test(e)){if(m.test(e))return this.word=parseFloat(this.word),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in number yet, index '+this.place)}this.word+=e},y.prototype.quoted=function(e){'"'!==e?this.word+=e:this.state=5},y.prototype.keyword=function(e){if(g.test(e))this.word+=e;else{if("["===e){var t=[];return t.push(this.word),this.level++,null===this.root?this.root=t:this.currentObject.push(t),this.stack.push(this.currentObject),this.currentObject=t,void(this.state=1)}if(!m.test(e))throw new Error("havn't handled \""+e+'" in keyword yet, index '+this.place);this.afterItem(e)}},y.prototype.neutral=function(e){if(h.test(e))return this.word=e,void(this.state=2);if('"'===e)return this.word="",void(this.state=4);if(f.test(e))return this.word=e,void(this.state=3);if(!m.test(e))throw new Error("havn't handled \""+e+'" in neutral yet, index '+this.place);this.afterItem(e)},y.prototype.output=function(){for(;this.place0?90:-90),e.lat_ts=e.lat1)}(i),i};function b(e){var t=this;if(2===arguments.length){var n=arguments[1];"string"==typeof n?"+"===n.charAt(0)?b[e]=d(arguments[1]):b[e]=I(arguments[1]):b[e]=n}else if(1===arguments.length){if(Array.isArray(e))return e.map((function(e){Array.isArray(e)?b.apply(t,e):b(e)}));if("string"==typeof e){if(e in b)return b[e]}else"EPSG"in e?b["EPSG:"+e.EPSG]=e:"ESRI"in e?b["ESRI:"+e.ESRI]=e:"IAU2000"in e?b["IAU2000:"+e.IAU2000]=e:console.log(e);return}}!function(e){e("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),e("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),e("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),e.WGS84=e["EPSG:4326"],e["EPSG:3785"]=e["EPSG:3857"],e.GOOGLE=e["EPSG:3857"],e["EPSG:900913"]=e["EPSG:3857"],e["EPSG:102113"]=e["EPSG:3857"]}(b);var w=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"],E=["3857","900913","3785","102113"];function _(e){if(!function(e){return"string"==typeof e}(e))return e;if(function(e){return e in b}(e))return b[e];if(function(e){return w.some((function(t){return e.indexOf(t)>-1}))}(e)){var t=I(e);if(function(e){var t=u(e,"authority");if(t){var n=u(t,"epsg");return n&&E.indexOf(n)>-1}}(t))return b["EPSG:3857"];var n=function(e){var t=u(e,"extension");if(t)return u(t,"proj4")}(t);return n?d(n):t}return function(e){return"+"===e[0]}(e)?d(e):void 0}var S=function(e,t){var n,o;if(e=e||{},!t)return e;for(o in t)void 0!==(n=t[o])&&(e[o]=n);return e},M=function(e,t,n){var o=e*t;return n/Math.sqrt(1-o*o)},P=function(e){return e<0?-1:1},x=function(e){return Math.abs(e)<=a?e:e-P(e)*r},k=function(e,n,o){var i=e*o,r=.5*e;return i=Math.pow((1-i)/(1+i),r),Math.tan(.5*(t-n))/i},G=function(e,n){for(var o,i,r=.5*e,a=t-2*Math.atan(n),s=0;s<=15;s++)if(o=e*Math.sin(a),a+=i=t-2*Math.atan(n*Math.pow((1-o)/(1+o),r))-a,Math.abs(i)<=1e-10)return a;return-9999};function R(e){return e}var T=[{init:function(){var e=this.b/this.a;this.es=1-e*e,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=M(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(e){var n,r,a=e.x,s=e.y;if(s*o>90&&s*o<-90&&a*o>180&&a*o<-180)return null;if(Math.abs(Math.abs(s)-t)<=1e-10)return null;if(this.sphere)n=this.x0+this.a*this.k0*x(a-this.long0),r=this.y0+this.a*this.k0*Math.log(Math.tan(i+.5*s));else{var l=Math.sin(s),c=k(this.e,s,l);n=this.x0+this.a*this.k0*x(a-this.long0),r=this.y0-this.a*this.k0*Math.log(c)}return e.x=n,e.y=r,e},inverse:function(e){var n,o,i=e.x-this.x0,r=e.y-this.y0;if(this.sphere)o=t-2*Math.atan(Math.exp(-r/(this.a*this.k0)));else{var a=Math.exp(-r/(this.a*this.k0));if(-9999===(o=G(this.e,a)))return null}return n=x(this.long0+i/(this.a*this.k0)),e.x=n,e.y=o,e},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:R,inverse:R,names:["longlat","identity"]}],O={},L=[];function D(e,t){var n=L.length;return e.names?(L[n]=e,e.names.forEach((function(e){O[e.toLowerCase()]=n})),this):(console.log(t),!0)}var N={start:function(){T.forEach(D)},add:D,get:function(e){if(!e)return!1;var t=e.toLowerCase();return void 0!==O[t]&&L[O[t]]?L[O[t]]:void 0}},j={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},U=j.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};j.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var B={wgs84:{towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},ch1903:{towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},ggrs87:{towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},nad83:{towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},nad27:{nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},potsdam:{towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},carthage:{towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},hermannskogel:{towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},osni52:{towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},ire65:{towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},rassadiran:{towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},nzgd49:{towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},osgb36:{towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},s_jtsk:{towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},beduaram:{towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},gunung_segara:{towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},rnb72:{towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},F={};function z(e){if(0===e.length)return null;var t="@"===e[0];return t&&(e=e.slice(1)),"null"===e?{name:"null",mandatory:!t,grid:null,isNull:!0}:{name:e,mandatory:!t,grid:F[e]||null,isNull:!1}}function V(e){return e/3600*Math.PI/180}function q(e,t,n){return String.fromCharCode.apply(null,new Uint8Array(e.buffer.slice(t,n)))}function W(e){return e.map((function(e){return[V(e.longitudeShift),V(e.latitudeShift)]}))}function H(e,t,n){return{name:q(e,t+8,t+16).trim(),parent:q(e,t+24,t+24+8).trim(),lowerLatitude:e.getFloat64(t+72,n),upperLatitude:e.getFloat64(t+88,n),lowerLongitude:e.getFloat64(t+104,n),upperLongitude:e.getFloat64(t+120,n),latitudeInterval:e.getFloat64(t+136,n),longitudeInterval:e.getFloat64(t+152,n),gridNodeCount:e.getInt32(t+168,n)}}function Y(e,t,n,o){for(var i=t+176,r=[],a=0;a3&&(0===l.datum_params[3]&&0===l.datum_params[4]&&0===l.datum_params[5]&&0===l.datum_params[6]||(l.datum_type=2,l.datum_params[3]*=e,l.datum_params[4]*=e,l.datum_params[5]*=e,l.datum_params[6]=l.datum_params[6]/1e6+1))),s&&(l.datum_type=3,l.grids=s),l.a=o,l.b=i,l.es=r,l.ep2=a,l}(o.datumCode,o.datum_params,g.a,g.b,m.es,m.ep2,f);S(this,o),S(this,i),this.a=g.a,this.b=g.b,this.rf=g.rf,this.sphere=g.sphere,this.es=m.es,this.e=m.e,this.ep2=m.ep2,this.datum=y,this.init(),n(null,this)}else n(t)}else n(t)}function Z(e,n,o){var i,r,a,s,l=e.x,c=e.y,u=e.z?e.z:0;if(c<-t&&c>-1.001*t)c=-t;else if(c>t&&c<1.001*t)c=t;else{if(c<-t)return{x:-1/0,y:-1/0,z:e.z};if(c>t)return{x:1/0,y:1/0,z:e.z}}return l>Math.PI&&(l-=2*Math.PI),r=Math.sin(c),s=Math.cos(c),a=r*r,{x:((i=o/Math.sqrt(1-n*a))+u)*s*Math.cos(l),y:(i+u)*s*Math.sin(l),z:(i*(1-n)+u)*r}}function K(e,t,n,o){var i,r,a,s,l,c,u,d,p,h,g,m,f,y,A,v=e.x,C=e.y,I=e.z?e.z:0;if(i=Math.sqrt(v*v+C*C),r=Math.sqrt(v*v+C*C+I*I),i/n<1e-12){if(y=0,r/n<1e-12)return A=-o,{x:e.x,y:e.y,z:e.z}}else y=Math.atan2(C,v);a=I/r,d=(s=i/r)*(1-t)*(l=1/Math.sqrt(1-t*(2-t)*s*s)),p=a*l,f=0;do{f++,c=t*(u=n/Math.sqrt(1-t*p*p))/(u+(A=i*d+I*p-u*(1-t*p*p))),m=(g=a*(l=1/Math.sqrt(1-c*(2-c)*s*s)))*d-(h=s*(1-c)*l)*p,d=h,p=g}while(m*m>1e-24&&f<30);return{x:y,y:Math.atan(g/Math.abs(h)),z:A}}function X(e){return 1===e||2===e}J.projections=N,J.projections.start();var Q=function(e,t,n){if(function(e,t){return e.datum_type===t.datum_type&&!(e.a!==t.a||Math.abs(e.es-t.es)>5e-11)&&(1===e.datum_type?e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]:2!==e.datum_type||e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]&&e.datum_params[3]===t.datum_params[3]&&e.datum_params[4]===t.datum_params[4]&&e.datum_params[5]===t.datum_params[5]&&e.datum_params[6]===t.datum_params[6])}(e,t))return n;if(5===e.datum_type||5===t.datum_type)return n;var o=e.a,i=e.es;if(3===e.datum_type){if(0!==$(e,!1,n))return;o=6378137,i=.0066943799901413165}var r=t.a,a=t.b,s=t.es;return 3===t.datum_type&&(r=6378137,a=6356752.314,s=.0066943799901413165),i!==s||o!==r||X(e.datum_type)||X(t.datum_type)?(n=Z(n,i,o),X(e.datum_type)&&(n=function(e,t,n){if(1===t)return{x:e.x+n[0],y:e.y+n[1],z:e.z+n[2]};if(2===t){var o=n[0],i=n[1],r=n[2],a=n[3],s=n[4],l=n[5],c=n[6];return{x:c*(e.x-l*e.y+s*e.z)+o,y:c*(l*e.x+e.y-a*e.z)+i,z:c*(-s*e.x+a*e.y+e.z)+r}}}(n,e.datum_type,e.datum_params)),X(t.datum_type)&&(n=function(e,t,n){if(1===t)return{x:e.x-n[0],y:e.y-n[1],z:e.z-n[2]};if(2===t){var o=n[0],i=n[1],r=n[2],a=n[3],s=n[4],l=n[5],c=n[6],u=(e.x-o)/c,d=(e.y-i)/c,p=(e.z-r)/c;return{x:u+l*d-s*p,y:-l*u+d+a*p,z:s*u-a*d+p}}}(n,t.datum_type,t.datum_params)),n=K(n,s,r,a),3!==t.datum_type||0===$(t,!0,n)?n:void 0):n};function $(e,t,n){if(null===e.grids||0===e.grids.length)return console.log("Grid shift grids not found"),-1;for(var i={x:-n.x,y:n.y},r={x:Number.NaN,y:Number.NaN},a=[],s=0;si.y||d>i.x||g1e-12&&Math.abs(a.y)>1e-12);if(l<0)return console.log("Inverse grid shift iterator failed to converge."),o;o.x=x(r.x+n.ll[0]),o.y=r.y+n.ll[1]}else isNaN(r.x)||(o.x=e.x+r.x,o.y=e.y+r.y);return o}function te(e,t){var n,o={x:e.x/t.del[0],y:e.y/t.del[1]},i=Math.floor(o.x),r=Math.floor(o.y),a=o.x-1*i,s=o.y-1*r,l={x:Number.NaN,y:Number.NaN};if(i<0||i>=t.lim[0])return l;if(r<0||r>=t.lim[1])return l;n=r*t.lim[0]+i;var c=t.cvs[n][0],u=t.cvs[n][1];n++;var d=t.cvs[n][0],p=t.cvs[n][1];n+=t.lim[0];var h=t.cvs[n][0],g=t.cvs[n][1];n--;var m=t.cvs[n][0],f=t.cvs[n][1],y=a*s,A=a*(1-s),v=(1-a)*(1-s),C=(1-a)*s;return l.x=v*c+A*d+C*m+y*h,l.y=v*u+A*p+C*f+y*g,l}var ne=function(e,t,n){var o,i,r,a=n.x,s=n.y,l=n.z||0,c={};for(r=0;r<3;r++)if(!t||2!==r||void 0!==n.z)switch(0===r?(o=a,i=-1!=="ew".indexOf(e.axis[r])?"x":"y"):1===r?(o=s,i=-1!=="ns".indexOf(e.axis[r])?"y":"x"):(o=l,i="z"),e.axis[r]){case"e":c[i]=o;break;case"w":c[i]=-o;break;case"n":c[i]=o;break;case"s":c[i]=-o;break;case"u":void 0!==n[i]&&(c.z=o);break;case"d":void 0!==n[i]&&(c.z=-o);break;default:return null}return c},oe=function(e){var t={x:e[0],y:e[1]};return e.length>2&&(t.z=e[2]),e.length>3&&(t.m=e[3]),t};function ie(e){if("function"==typeof Number.isFinite){if(Number.isFinite(e))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof e||e!=e||!isFinite(e))throw new TypeError("coordinates must be finite numbers")}function re(e,t,i,r){var a;if(Array.isArray(i)&&(i=oe(i)),function(e){ie(e.x),ie(e.y)}(i),e.datum&&t.datum&&function(e,t){return(1===e.datum.datum_type||2===e.datum.datum_type)&&"WGS84"!==t.datumCode||(1===t.datum.datum_type||2===t.datum.datum_type)&&"WGS84"!==e.datumCode}(e,t)&&(i=re(e,a=new J("WGS84"),i,r),e=a),r&&"enu"!==e.axis&&(i=ne(e,!1,i)),"longlat"===e.projName)i={x:i.x*n,y:i.y*n,z:i.z||0};else if(e.to_meter&&(i={x:i.x*e.to_meter,y:i.y*e.to_meter,z:i.z||0}),!(i=e.inverse(i)))return;if(e.from_greenwich&&(i.x+=e.from_greenwich),i=Q(e.datum,t.datum,i))return t.from_greenwich&&(i={x:i.x-t.from_greenwich,y:i.y,z:i.z||0}),"longlat"===t.projName?i={x:i.x*o,y:i.y*o,z:i.z||0}:(i=t.forward(i),t.to_meter&&(i={x:i.x/t.to_meter,y:i.y/t.to_meter,z:i.z||0})),r&&"enu"!==t.axis?ne(t,!0,i):i}var ae=J("WGS84");function se(e,t,n,o){var i,r,a;return Array.isArray(n)?(i=re(e,t,n,o)||{x:NaN,y:NaN},n.length>2?void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name?"number"==typeof i.z?[i.x,i.y,i.z].concat(n.splice(3)):[i.x,i.y,n[2]].concat(n.splice(3)):[i.x,i.y].concat(n.splice(2)):[i.x,i.y]):(r=re(e,t,n,o),2===(a=Object.keys(n)).length||a.forEach((function(o){if(void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name){if("x"===o||"y"===o||"z"===o)return}else if("x"===o||"y"===o)return;r[o]=n[o]})),r)}function le(e){return e instanceof J?e:e.oProj?e.oProj:J(e)}function ce(e,t,n){e=le(e);var o,i=!1;return void 0===t?(t=e,e=ae,i=!0):(void 0!==t.x||Array.isArray(t))&&(n=t,t=e,e=ae,i=!0),t=le(t),n?se(e,t,n):(o={forward:function(n,o){return se(e,t,n,o)},inverse:function(n,o){return se(t,e,n,o)}},i&&(o.oProj=t),o)}var ue=65,de=73,pe=79,he={forward:ge,inverse:function(e){var t=Ae(Ce(e.toUpperCase()));return t.lat&&t.lon?[t.lon,t.lat,t.lon,t.lat]:[t.left,t.bottom,t.right,t.top]},toPoint:me};function ge(e,t){return t=t||5,function(e,t){var n,o,i,r,a,s,l,c,u,d,p,h,g,m,f="00000"+e.easting,y="00000"+e.northing;return e.zoneNumber+e.zoneLetter+(u=e.easting,d=e.northing,p=e.zoneNumber,h=ve(p),g=Math.floor(u/1e5),m=Math.floor(d/1e5)%20,n=g,o=m,r="AJSAJS".charCodeAt(i=h-1),a="AFAFAF".charCodeAt(i),c=!1,(s=r+n-1)>90&&(s=s-90+ue-1,c=!0),(s===de||rde||(s>de||rpe||(s>pe||r90&&(s=s-90+ue-1),(l=a+o)>86?(l=l-86+ue-1,c=!0):c=!1,(l===de||ade||(l>de||ape||(l>pe||a86&&(l=l-86+ue-1),String.fromCharCode(s)+String.fromCharCode(l))+f.substr(f.length-5,t)+y.substr(y.length-5,t)}(function(e){var t,n,o,i,r,a,s,l=e.lat,c=e.lon,u=6378137,d=fe(l),p=fe(c);s=Math.floor((c+180)/6)+1,180===c&&(s=60),l>=56&&l<64&&c>=3&&c<12&&(s=32),l>=72&&l<84&&(c>=0&&c<9?s=31:c>=9&&c<21?s=33:c>=21&&c<33?s=35:c>=33&&c<42&&(s=37)),a=fe(6*(s-1)-180+3),t=u/Math.sqrt(1-.00669438*Math.sin(d)*Math.sin(d)),n=Math.tan(d)*Math.tan(d),o=.006739496752268451*Math.cos(d)*Math.cos(d),i=Math.cos(d)*(p-a),r=u*(.9983242984503243*d-.002514607064228144*Math.sin(2*d)+2639046602129982e-21*Math.sin(4*d)-3.418046101696858e-9*Math.sin(6*d));var h,g,m=.9996*t*(i+(1-n+o)*i*i*i/6+(5-18*n+n*n+72*o-.39089081163157013)*i*i*i*i*i/120)+5e5,f=.9996*(r+t*Math.tan(d)*(i*i/2+(5-n+9*o+4*o*o)*i*i*i*i/24+(61-58*n+n*n+600*o-2.2240339282485886)*i*i*i*i*i*i/720));return l<0&&(f+=1e7),{northing:Math.round(f),easting:Math.round(m),zoneNumber:s,zoneLetter:(h=l,g="Z",84>=h&&h>=72?g="X":72>h&&h>=64?g="W":64>h&&h>=56?g="V":56>h&&h>=48?g="U":48>h&&h>=40?g="T":40>h&&h>=32?g="S":32>h&&h>=24?g="R":24>h&&h>=16?g="Q":16>h&&h>=8?g="P":8>h&&h>=0?g="N":0>h&&h>=-8?g="M":-8>h&&h>=-16?g="L":-16>h&&h>=-24?g="K":-24>h&&h>=-32?g="J":-32>h&&h>=-40?g="H":-40>h&&h>=-48?g="G":-48>h&&h>=-56?g="F":-56>h&&h>=-64?g="E":-64>h&&h>=-72?g="D":-72>h&&h>=-80&&(g="C"),g)}}({lat:e[1],lon:e[0]}),t)}function me(e){var t=Ae(Ce(e.toUpperCase()));return t.lat&&t.lon?[t.lon,t.lat]:[(t.left+t.right)/2,(t.top+t.bottom)/2]}function fe(e){return e*(Math.PI/180)}function ye(e){return e/Math.PI*180}function Ae(e){var t=e.northing,n=e.easting,o=e.zoneLetter,i=e.zoneNumber;if(i<0||i>60)return null;var r,a,s,l,c,u,d,p,h=6378137,g=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),m=n-5e5,f=t;o<"N"&&(f-=1e7),u=6*(i-1)-180+3,p=(d=f/.9996/6367449.145945056)+(3*g/2-27*g*g*g/32)*Math.sin(2*d)+(21*g*g/16-55*g*g*g*g/32)*Math.sin(4*d)+151*g*g*g/96*Math.sin(6*d),r=h/Math.sqrt(1-.00669438*Math.sin(p)*Math.sin(p)),a=Math.tan(p)*Math.tan(p),s=.006739496752268451*Math.cos(p)*Math.cos(p),l=.99330562*h/Math.pow(1-.00669438*Math.sin(p)*Math.sin(p),1.5),c=m/(.9996*r);var y=p-r*Math.tan(p)/l*(c*c/2-(5+3*a+10*s-4*s*s-.06065547077041606)*c*c*c*c/24+(61+90*a+298*s+45*a*a-1.6983531815716497-3*s*s)*c*c*c*c*c*c/720);y=ye(y);var A,v=(c-(1+2*a+s)*c*c*c/6+(5-2*s+28*a-3*s*s+.05391597401814761+24*a*a)*c*c*c*c*c/120)/Math.cos(p);if(v=u+ye(v),e.accuracy){var C=Ae({northing:e.northing+e.accuracy,easting:e.easting+e.accuracy,zoneLetter:e.zoneLetter,zoneNumber:e.zoneNumber});A={top:C.lat,right:C.lon,bottom:y,left:v}}else A={lat:y,lon:v};return A}function ve(e){var t=e%6;return 0===t&&(t=6),t}function Ce(e){if(e&&0===e.length)throw"MGRSPoint coverting from nothing";for(var t,n=e.length,o=null,i="",r=0;!/[A-Z]/.test(t=e.charAt(r));){if(r>=2)throw"MGRSPoint bad conversion from: "+e;i+=t,r++}var a=parseInt(i,10);if(0===r||r+3>n)throw"MGRSPoint bad conversion from: "+e;var s=e.charAt(r++);if(s<="A"||"B"===s||"Y"===s||s>="Z"||"I"===s||"O"===s)throw"MGRSPoint zone letter "+s+" not handled: "+e;o=e.substring(r,r+=2);for(var l=ve(a),c=function(e,t){for(var n="AJSAJS".charCodeAt(t-1),o=1e5,i=!1;n!==e.charCodeAt(0);){if(++n===de&&n++,n===pe&&n++,n>90){if(i)throw"Bad character: "+e;n=ue,i=!0}o+=1e5}return o}(o.charAt(0),l),u=function(e,t){if(e>"V")throw"MGRSPoint given invalid Northing "+e;for(var n="AFAFAF".charCodeAt(t-1),o=0,i=!1;n!==e.charCodeAt(0);){if(++n===de&&n++,n===pe&&n++,n>86){if(i)throw"Bad character: "+e;n=ue,i=!0}o+=1e5}return o}(o.charAt(1),l);u0&&(p=1e5/Math.pow(10,m),h=e.substring(r,r+m),f=parseFloat(h)*p,g=e.substring(r+m),y=parseFloat(g)*p),{easting:f+c,northing:y+u,zoneLetter:s,zoneNumber:a,accuracy:p}}function Ie(e){var t;switch(e){case"C":t=11e5;break;case"D":t=2e6;break;case"E":t=28e5;break;case"F":t=37e5;break;case"G":t=46e5;break;case"H":t=55e5;break;case"J":t=64e5;break;case"K":t=73e5;break;case"L":t=82e5;break;case"M":t=91e5;break;case"N":t=0;break;case"P":t=8e5;break;case"Q":t=17e5;break;case"R":t=26e5;break;case"S":t=35e5;break;case"T":t=44e5;break;case"U":t=53e5;break;case"V":t=62e5;break;case"W":t=7e6;break;case"X":t=79e5;break;default:t=-1}if(t>=0)return t;throw"Invalid zone letter: "+e}function be(e,t,n){if(!(this instanceof be))return new be(e,t,n);if(Array.isArray(e))this.x=e[0],this.y=e[1],this.z=e[2]||0;else if("object"==typeof e)this.x=e.x,this.y=e.y,this.z=e.z||0;else if("string"==typeof e&&void 0===t){var o=e.split(",");this.x=parseFloat(o[0],10),this.y=parseFloat(o[1],10),this.z=parseFloat(o[2],10)||0}else this.x=e,this.y=t,this.z=n||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}be.fromMGRS=function(e){return new be(me(e))},be.prototype.toMGRS=function(e){return ge([this.x,this.y],e)};var we=.01068115234375,Ee=function(e){var t=[];t[0]=1-e*(.25+e*(.046875+e*(.01953125+e*we))),t[1]=e*(.75-e*(.046875+e*(.01953125+e*we)));var n=e*e;return t[2]=n*(.46875-e*(.013020833333333334+.007120768229166667*e)),n*=e,t[3]=n*(.3645833333333333-.005696614583333333*e),t[4]=n*e*.3076171875,t},_e=function(e,t,n,o){return n*=t,t*=t,o[0]*e-n*(o[1]+t*(o[2]+t*(o[3]+t*o[4])))},Se=function(e,t,n){for(var o=1/(1-t),i=e,r=20;r;--r){var a=Math.sin(i),s=1-t*a*a;if(i-=s=(_e(i,a,Math.cos(i),n)-e)*(s*Math.sqrt(s))*o,Math.abs(s)<1e-10)return i}return i},Me={init:function(){this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.es&&(this.en=Ee(this.es),this.ml0=_e(this.lat0,Math.sin(this.lat0),Math.cos(this.lat0),this.en))},forward:function(e){var t,n,o,i=e.x,r=e.y,a=x(i-this.long0),s=Math.sin(r),l=Math.cos(r);if(this.es){var c=l*a,u=Math.pow(c,2),d=this.ep2*Math.pow(l,2),p=Math.pow(d,2),h=Math.abs(l)>1e-10?Math.tan(r):0,g=Math.pow(h,2),m=Math.pow(g,2);t=1-this.es*Math.pow(s,2),c/=Math.sqrt(t);var f=_e(r,s,l,this.en);n=this.a*(this.k0*c*(1+u/6*(1-g+d+u/20*(5-18*g+m+14*d-58*g*d+u/42*(61+179*m-m*g-479*g)))))+this.x0,o=this.a*(this.k0*(f-this.ml0+s*a*c/2*(1+u/12*(5-g+9*d+4*p+u/30*(61+m-58*g+270*d-330*g*d+u/56*(1385+543*m-m*g-3111*g))))))+this.y0}else{var y=l*Math.sin(a);if(Math.abs(Math.abs(y)-1)<1e-10)return 93;if(n=.5*this.a*this.k0*Math.log((1+y)/(1-y))+this.x0,o=l*Math.cos(a)/Math.sqrt(1-Math.pow(y,2)),(y=Math.abs(o))>=1){if(y-1>1e-10)return 93;o=0}else o=Math.acos(o);r<0&&(o=-o),o=this.a*this.k0*(o-this.lat0)+this.y0}return e.x=n,e.y=o,e},inverse:function(e){var n,o,i,r,a=(e.x-this.x0)*(1/this.a),s=(e.y-this.y0)*(1/this.a);if(this.es)if(n=this.ml0+s/this.k0,o=Se(n,this.es,this.en),Math.abs(o)1e-10?Math.tan(o):0,d=this.ep2*Math.pow(c,2),p=Math.pow(d,2),h=Math.pow(u,2),g=Math.pow(h,2);n=1-this.es*Math.pow(l,2);var m=a*Math.sqrt(n)/this.k0,f=Math.pow(m,2);i=o-(n*=u)*f/(1-this.es)*.5*(1-f/12*(5+3*h-9*d*h+d-4*p-f/30*(61+90*h-252*d*h+45*g+46*d-f/56*(1385+3633*h+4095*g+1574*g*h)))),r=x(this.long0+m*(1-f/6*(1+2*h+d-f/20*(5+28*h+24*g+8*d*h+6*d-f/42*(61+662*h+1320*g+720*g*h))))/c)}else i=t*P(s),r=0;else{var y=Math.exp(a/this.k0),A=.5*(y-1/y),v=this.lat0+s/this.k0,C=Math.cos(v);n=Math.sqrt((1-Math.pow(C,2))/(1+Math.pow(A,2))),i=Math.asin(n),s<0&&(i=-i),r=0===A&&0===C?0:x(Math.atan2(A,C)+this.long0)}return e.x=r,e.y=i,e},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]},Pe=function(e){var t=Math.exp(e);return t=(t-1/t)/2},xe=function(e,t){e=Math.abs(e),t=Math.abs(t);var n=Math.max(e,t),o=Math.min(e,t)/(n||1);return n*Math.sqrt(1+Math.pow(o,2))},ke=function(e){var t=Math.abs(e);return t=function(e){var t=1+e,n=t-1;return 0===n?e:e*Math.log(t)/n}(t*(1+t/(xe(1,t)+1))),e<0?-t:t},Ge=function(e,t){for(var n,o=2*Math.cos(2*t),i=e.length-1,r=e[i],a=0;--i>=0;)n=o*r-a+e[i],a=r,r=n;return t+n*Math.sin(2*t)},Re=function(e,t,n){for(var o,i,r=Math.sin(t),a=Math.cos(t),s=Pe(n),l=function(e){var t=Math.exp(e);return t=(t+1/t)/2}(n),c=2*a*l,u=-2*r*s,d=e.length-1,p=e[d],h=0,g=0,m=0;--d>=0;)o=g,i=h,p=c*(g=p)-o-u*(h=m)+e[d],m=u*g-i+c*h;return[(c=r*l)*p-(u=a*s)*m,c*m+u*p]},Te={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(Me.init.apply(this),this.forward=Me.forward,this.inverse=Me.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var e=this.es/(1+Math.sqrt(1-this.es)),t=e/(2-e),n=t;this.cgb[0]=t*(2+t*(-2/3+t*(t*(116/45+t*(26/45+t*(-2854/675)))-2))),this.cbg[0]=t*(t*(2/3+t*(4/3+t*(-82/45+t*(32/45+t*(4642/4725)))))-2),n*=t,this.cgb[1]=n*(7/3+t*(t*(-227/45+t*(2704/315+t*(2323/945)))-1.6)),this.cbg[1]=n*(5/3+t*(-16/15+t*(-13/9+t*(904/315+t*(-1522/945))))),n*=t,this.cgb[2]=n*(56/15+t*(-136/35+t*(-1262/105+t*(73814/2835)))),this.cbg[2]=n*(-26/15+t*(34/21+t*(1.6+t*(-12686/2835)))),n*=t,this.cgb[3]=n*(4279/630+t*(-332/35+t*(-399572/14175))),this.cbg[3]=n*(1237/630+t*(t*(-24832/14175)-2.4)),n*=t,this.cgb[4]=n*(4174/315+t*(-144838/6237)),this.cbg[4]=n*(-734/315+t*(109598/31185)),n*=t,this.cgb[5]=n*(601676/22275),this.cbg[5]=n*(444337/155925),n=Math.pow(t,2),this.Qn=this.k0/(1+t)*(1+n*(1/4+n*(1/64+n/256))),this.utg[0]=t*(t*(2/3+t*(-37/96+t*(1/360+t*(81/512+t*(-96199/604800)))))-.5),this.gtu[0]=t*(.5+t*(-2/3+t*(5/16+t*(41/180+t*(-127/288+t*(7891/37800)))))),this.utg[1]=n*(-1/48+t*(-1/15+t*(437/1440+t*(-46/105+t*(1118711/3870720))))),this.gtu[1]=n*(13/48+t*(t*(557/1440+t*(281/630+t*(-1983433/1935360)))-.6)),n*=t,this.utg[2]=n*(-17/480+t*(37/840+t*(209/4480+t*(-5569/90720)))),this.gtu[2]=n*(61/240+t*(-103/140+t*(15061/26880+t*(167603/181440)))),n*=t,this.utg[3]=n*(-4397/161280+t*(11/504+t*(830251/7257600))),this.gtu[3]=n*(49561/161280+t*(-179/168+t*(6601661/7257600))),n*=t,this.utg[4]=n*(-4583/161280+t*(108847/3991680)),this.gtu[4]=n*(34729/80640+t*(-3418889/1995840)),n*=t,this.utg[5]=n*(-20648693/638668800),this.gtu[5]=.6650675310896665*n;var o=Ge(this.cbg,this.lat0);this.Zb=-this.Qn*(o+function(e,t){for(var n,o=2*Math.cos(t),i=e.length-1,r=e[i],a=0;--i>=0;)n=o*r-a+e[i],a=r,r=n;return Math.sin(t)*n}(this.gtu,2*o))},forward:function(e){var t=x(e.x-this.long0),n=e.y;n=Ge(this.cbg,n);var o=Math.sin(n),i=Math.cos(n),r=Math.sin(t),a=Math.cos(t);n=Math.atan2(o,a*i),t=Math.atan2(r*i,xe(o,i*a)),t=ke(Math.tan(t));var s,l,c=Re(this.gtu,2*n,2*t);return n+=c[0],t+=c[1],Math.abs(t)<=2.623395162778?(s=this.a*(this.Qn*t)+this.x0,l=this.a*(this.Qn*n+this.Zb)+this.y0):(s=1/0,l=1/0),e.x=s,e.y=l,e},inverse:function(e){var t,n,o=(e.x-this.x0)*(1/this.a),i=(e.y-this.y0)*(1/this.a);if(i=(i-this.Zb)/this.Qn,o/=this.Qn,Math.abs(o)<=2.623395162778){var r=Re(this.utg,2*i,2*o);i+=r[0],o+=r[1],o=Math.atan(Pe(o));var a=Math.sin(i),s=Math.cos(i),l=Math.sin(o),c=Math.cos(o);i=Math.atan2(a*c,xe(l,c*s)),o=Math.atan2(l,c*s),t=x(o+this.long0),n=Ge(this.cgb,i)}else t=1/0,n=1/0;return e.x=t,e.y=n,e},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]},Oe={init:function(){var e=function(e,t){if(void 0===e){if((e=Math.floor(30*(x(t)+Math.PI)/Math.PI)+1)<0)return 0;if(e>60)return 60}return e}(this.zone,this.long0);if(void 0===e)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(e)-183)*n,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,Te.init.apply(this),this.forward=Te.forward,this.inverse=Te.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"},Le=function(e,t){return Math.pow((1-e)/(1+e),t)},De={init:function(){var e=Math.sin(this.lat0),t=Math.cos(this.lat0);t*=t,this.rc=Math.sqrt(1-this.es)/(1-this.es*e*e),this.C=Math.sqrt(1+this.es*t*t/(1-this.es)),this.phic0=Math.asin(e/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+i)/(Math.pow(Math.tan(.5*this.lat0+i),this.C)*Le(this.e*e,this.ratexp))},forward:function(e){var n=e.x,o=e.y;return e.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*o+i),this.C)*Le(this.e*Math.sin(o),this.ratexp))-t,e.x=this.C*n,e},inverse:function(e){for(var n=e.x/this.C,o=e.y,r=Math.pow(Math.tan(.5*o+i)/this.K,1/this.C),a=20;a>0&&(o=2*Math.atan(r*Le(this.e*Math.sin(e.y),-.5*this.e))-t,!(Math.abs(o-e.y)<1e-14));--a)e.y=o;return a?(e.x=n,e.y=o,e):null},names:["gauss"]},Ne={init:function(){De.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(e){var t,n,o,i;return e.x=x(e.x-this.long0),De.forward.apply(this,[e]),t=Math.sin(e.y),n=Math.cos(e.y),o=Math.cos(e.x),i=this.k0*this.R2/(1+this.sinc0*t+this.cosc0*n*o),e.x=i*n*Math.sin(e.x),e.y=i*(this.cosc0*t-this.sinc0*n*o),e.x=this.a*e.x+this.x0,e.y=this.a*e.y+this.y0,e},inverse:function(e){var t,n,o,i,r;if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,r=Math.sqrt(e.x*e.x+e.y*e.y)){var a=2*Math.atan2(r,this.R2);t=Math.sin(a),n=Math.cos(a),i=Math.asin(n*this.sinc0+e.y*t*this.cosc0/r),o=Math.atan2(e.x*t,r*this.cosc0*n-e.y*this.sinc0*t)}else i=this.phic0,o=0;return e.x=o,e.y=i,De.inverse.apply(this,[e]),e.x=x(e.x+this.long0),e},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]},je={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=1e-10&&(this.k0=.5*(1+P(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=1e-10&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=1e-10&&(this.k0=.5*this.cons*M(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/k(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=M(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-t,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(e){var n,o,i,r,a,s,l=e.x,c=e.y,u=Math.sin(c),d=Math.cos(c),p=x(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=1e-10&&Math.abs(c+this.lat0)<=1e-10?(e.x=NaN,e.y=NaN,e):this.sphere?(n=2*this.k0/(1+this.sinlat0*u+this.coslat0*d*Math.cos(p)),e.x=this.a*n*d*Math.sin(p)+this.x0,e.y=this.a*n*(this.coslat0*u-this.sinlat0*d*Math.cos(p))+this.y0,e):(o=2*Math.atan(this.ssfn_(c,u,this.e))-t,r=Math.cos(o),i=Math.sin(o),Math.abs(this.coslat0)<=1e-10?(a=k(this.e,c*this.con,this.con*u),s=2*this.a*this.k0*a/this.cons,e.x=this.x0+s*Math.sin(l-this.long0),e.y=this.y0-this.con*s*Math.cos(l-this.long0),e):(Math.abs(this.sinlat0)<1e-10?(n=2*this.a*this.k0/(1+r*Math.cos(p)),e.y=n*i):(n=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*i+this.cosX0*r*Math.cos(p))),e.y=n*(this.cosX0*i-this.sinX0*r*Math.cos(p))+this.y0),e.x=n*r*Math.sin(p)+this.x0,e))},inverse:function(e){var n,o,i,r,a;e.x-=this.x0,e.y-=this.y0;var s=Math.sqrt(e.x*e.x+e.y*e.y);if(this.sphere){var l=2*Math.atan(s/(2*this.a*this.k0));return n=this.long0,o=this.lat0,s<=1e-10?(e.x=n,e.y=o,e):(o=Math.asin(Math.cos(l)*this.sinlat0+e.y*Math.sin(l)*this.coslat0/s),n=Math.abs(this.coslat0)<1e-10?this.lat0>0?x(this.long0+Math.atan2(e.x,-1*e.y)):x(this.long0+Math.atan2(e.x,e.y)):x(this.long0+Math.atan2(e.x*Math.sin(l),s*this.coslat0*Math.cos(l)-e.y*this.sinlat0*Math.sin(l))),e.x=n,e.y=o,e)}if(Math.abs(this.coslat0)<=1e-10){if(s<=1e-10)return o=this.lat0,n=this.long0,e.x=n,e.y=o,e;e.x*=this.con,e.y*=this.con,i=s*this.cons/(2*this.a*this.k0),o=this.con*G(this.e,i),n=this.con*x(this.con*this.long0+Math.atan2(e.x,-1*e.y))}else r=2*Math.atan(s*this.cosX0/(2*this.a*this.k0*this.ms1)),n=this.long0,s<=1e-10?a=this.X0:(a=Math.asin(Math.cos(r)*this.sinX0+e.y*Math.sin(r)*this.cosX0/s),n=x(this.long0+Math.atan2(e.x*Math.sin(r),s*this.cosX0*Math.cos(r)-e.y*this.sinX0*Math.sin(r)))),o=-1*G(this.e,Math.tan(.5*(t+a)));return e.x=n,e.y=o,e},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(e,n,o){return n*=o,Math.tan(.5*(t+e))*Math.pow((1-n)/(1+n),.5*o)}},Ue={init:function(){var e=this.lat0;this.lambda0=this.long0;var t=Math.sin(e),n=this.a,o=1/this.rf,i=2*o-Math.pow(o,2),r=this.e=Math.sqrt(i);this.R=this.k0*n*Math.sqrt(1-i)/(1-i*Math.pow(t,2)),this.alpha=Math.sqrt(1+i/(1-i)*Math.pow(Math.cos(e),4)),this.b0=Math.asin(t/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),s=Math.log(Math.tan(Math.PI/4+e/2)),l=Math.log((1+r*t)/(1-r*t));this.K=a-this.alpha*s+this.alpha*r/2*l},forward:function(e){var t=Math.log(Math.tan(Math.PI/4-e.y/2)),n=this.e/2*Math.log((1+this.e*Math.sin(e.y))/(1-this.e*Math.sin(e.y))),o=-this.alpha*(t+n)+this.K,i=2*(Math.atan(Math.exp(o))-Math.PI/4),r=this.alpha*(e.x-this.lambda0),a=Math.atan(Math.sin(r)/(Math.sin(this.b0)*Math.tan(i)+Math.cos(this.b0)*Math.cos(r))),s=Math.asin(Math.cos(this.b0)*Math.sin(i)-Math.sin(this.b0)*Math.cos(i)*Math.cos(r));return e.y=this.R/2*Math.log((1+Math.sin(s))/(1-Math.sin(s)))+this.y0,e.x=this.R*a+this.x0,e},inverse:function(e){for(var t=e.x-this.x0,n=e.y-this.y0,o=t/this.R,i=2*(Math.atan(Math.exp(n/this.R))-Math.PI/4),r=Math.asin(Math.cos(this.b0)*Math.sin(i)+Math.sin(this.b0)*Math.cos(i)*Math.cos(o)),a=Math.atan(Math.sin(o)/(Math.cos(this.b0)*Math.cos(o)-Math.sin(this.b0)*Math.tan(i))),s=this.lambda0+a/this.alpha,l=0,c=r,u=-1e3,d=0;Math.abs(c-u)>1e-7;){if(++d>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+r/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(c))/2)),u=c,c=2*Math.atan(Math.exp(l))-Math.PI/2}return e.x=s,e.y=c,e},names:["somerc"]},Be={init:function(){var e,o,a,s,l,c,u,d,p,h,g,m,f,y=0,A=0,v=0,C=0,I=0,b=0,w=0;this.no_off=(f="object"==typeof(m=this).PROJECTION?Object.keys(m.PROJECTION)[0]:m.PROJECTION,"no_uoff"in m||"no_off"in m||-1!==["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"].indexOf(f)),this.no_rot="no_rot"in this;var E=!1;"alpha"in this&&(E=!0);var _=!1;if("rectified_grid_angle"in this&&(_=!0),E&&(w=this.alpha),_&&(y=this.rectified_grid_angle*n),E||_)A=this.longc;else if(v=this.long1,I=this.lat1,C=this.long2,b=this.lat2,Math.abs(I-b)<=1e-7||(e=Math.abs(I))<=1e-7||Math.abs(e-t)<=1e-7||Math.abs(Math.abs(this.lat0)-t)<=1e-7||Math.abs(Math.abs(b)-t)<=1e-7)throw new Error;var S=1-this.es;o=Math.sqrt(S),Math.abs(this.lat0)>1e-10?(d=Math.sin(this.lat0),a=Math.cos(this.lat0),e=1-this.es*d*d,this.B=a*a,this.B=Math.sqrt(1+this.es*this.B*this.B/S),this.A=this.B*this.k0*o/e,(l=(s=this.B*o/(a*Math.sqrt(e)))*s-1)<=0?l=0:(l=Math.sqrt(l),this.lat0<0&&(l=-l)),this.E=l+=s,this.E*=Math.pow(k(this.e,this.lat0,d),this.B)):(this.B=1/o,this.A=this.k0,this.E=s=l=1),E||_?(E?(g=Math.asin(Math.sin(w)/s),_||(y=w)):(g=y,w=Math.asin(s*Math.sin(g))),this.lam0=A-Math.asin(.5*(l-1/l)*Math.tan(g))/this.B):(c=Math.pow(k(this.e,I,Math.sin(I)),this.B),u=Math.pow(k(this.e,b,Math.sin(b)),this.B),l=this.E/c,p=(u-c)/(u+c),h=((h=this.E*this.E)-u*c)/(h+u*c),(e=v-C)<-Math.pi?C-=r:e>Math.pi&&(C+=r),this.lam0=x(.5*(v+C)-Math.atan(h*Math.tan(.5*this.B*(v-C))/p)/this.B),g=Math.atan(2*Math.sin(this.B*x(v-this.lam0))/(l-1/l)),y=w=Math.asin(s*Math.sin(g))),this.singam=Math.sin(g),this.cosgam=Math.cos(g),this.sinrot=Math.sin(y),this.cosrot=Math.cos(y),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(s*s-1)/Math.cos(w))),this.lat0<0&&(this.u_0=-this.u_0)),l=.5*g,this.v_pole_n=this.ArB*Math.log(Math.tan(i-l)),this.v_pole_s=this.ArB*Math.log(Math.tan(i+l))},forward:function(e){var n,o,i,r,a,s,l,c,u={};if(e.x=e.x-this.lam0,Math.abs(Math.abs(e.y)-t)>1e-10){if(n=.5*((a=this.E/Math.pow(k(this.e,e.y,Math.sin(e.y)),this.B))-(s=1/a)),o=.5*(a+s),r=Math.sin(this.B*e.x),i=(n*this.singam-r*this.cosgam)/o,Math.abs(Math.abs(i)-1)<1e-10)throw new Error;c=.5*this.ArB*Math.log((1-i)/(1+i)),s=Math.cos(this.B*e.x),l=Math.abs(s)<1e-7?this.A*e.x:this.ArB*Math.atan2(n*this.cosgam+r*this.singam,s)}else c=e.y>0?this.v_pole_n:this.v_pole_s,l=this.ArB*e.y;return this.no_rot?(u.x=l,u.y=c):(l-=this.u_0,u.x=c*this.cosrot+l*this.sinrot,u.y=l*this.cosrot-c*this.sinrot),u.x=this.a*u.x+this.x0,u.y=this.a*u.y+this.y0,u},inverse:function(e){var n,o,i,r,a,s,l,c={};if(e.x=(e.x-this.x0)*(1/this.a),e.y=(e.y-this.y0)*(1/this.a),this.no_rot?(o=e.y,n=e.x):(o=e.x*this.cosrot-e.y*this.sinrot,n=e.y*this.cosrot+e.x*this.sinrot+this.u_0),r=.5*((i=Math.exp(-this.BrA*o))-1/i),a=.5*(i+1/i),l=((s=Math.sin(this.BrA*n))*this.cosgam+r*this.singam)/a,Math.abs(Math.abs(l)-1)<1e-10)c.x=0,c.y=l<0?-t:t;else{if(c.y=this.E/Math.sqrt((1+l)/(1-l)),c.y=G(this.e,Math.pow(c.y,1/this.B)),c.y===1/0)throw new Error;c.x=-this.rB*Math.atan2(r*this.cosgam-s*this.singam,Math.cos(this.BrA*n))}return c.x+=this.lam0,c},names:["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Two_Point_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","Oblique_Mercator","omerc"]},Fe={init:function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<1e-10)){var e=this.b/this.a;this.e=Math.sqrt(1-e*e);var t=Math.sin(this.lat1),n=Math.cos(this.lat1),o=M(this.e,t,n),i=k(this.e,this.lat1,t),r=Math.sin(this.lat2),a=Math.cos(this.lat2),s=M(this.e,r,a),l=k(this.e,this.lat2,r),c=k(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>1e-10?this.ns=Math.log(o/s)/Math.log(i/l):this.ns=t,isNaN(this.ns)&&(this.ns=t),this.f0=o/(this.ns*Math.pow(i,this.ns)),this.rh=this.a*this.f0*Math.pow(c,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(e){var n=e.x,o=e.y;Math.abs(2*Math.abs(o)-Math.PI)<=1e-10&&(o=P(o)*(t-2e-10));var i,r,a=Math.abs(Math.abs(o)-t);if(a>1e-10)i=k(this.e,o,Math.sin(o)),r=this.a*this.f0*Math.pow(i,this.ns);else{if((a=o*this.ns)<=0)return null;r=0}var s=this.ns*x(n-this.long0);return e.x=this.k0*(r*Math.sin(s))+this.x0,e.y=this.k0*(this.rh-r*Math.cos(s))+this.y0,e},inverse:function(e){var n,o,i,r,a,s=(e.x-this.x0)/this.k0,l=this.rh-(e.y-this.y0)/this.k0;this.ns>0?(n=Math.sqrt(s*s+l*l),o=1):(n=-Math.sqrt(s*s+l*l),o=-1);var c=0;if(0!==n&&(c=Math.atan2(o*s,o*l)),0!==n||this.ns>0){if(o=1/this.ns,i=Math.pow(n/(this.a*this.f0),o),-9999===(r=G(this.e,i)))return null}else r=-t;return a=x(c/this.ns+this.long0),e.x=a,e.y=r,e},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc"]},ze={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(e){var t,n,o,i,r,a,s,l=e.x,c=e.y,u=x(l-this.long0);return t=Math.pow((1+this.e*Math.sin(c))/(1-this.e*Math.sin(c)),this.alfa*this.e/2),n=2*(Math.atan(this.k*Math.pow(Math.tan(c/2+this.s45),this.alfa)/t)-this.s45),o=-u*this.alfa,i=Math.asin(Math.cos(this.ad)*Math.sin(n)+Math.sin(this.ad)*Math.cos(n)*Math.cos(o)),r=Math.asin(Math.cos(n)*Math.sin(o)/Math.cos(i)),a=this.n*r,s=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(i/2+this.s45),this.n),e.y=s*Math.cos(a)/1,e.x=s*Math.sin(a)/1,this.czech||(e.y*=-1,e.x*=-1),e},inverse:function(e){var t,n,o,i,r,a,s,l=e.x;e.x=e.y,e.y=l,this.czech||(e.y*=-1,e.x*=-1),r=Math.sqrt(e.x*e.x+e.y*e.y),i=Math.atan2(e.y,e.x)/Math.sin(this.s0),o=2*(Math.atan(Math.pow(this.ro0/r,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),t=Math.asin(Math.cos(this.ad)*Math.sin(o)-Math.sin(this.ad)*Math.cos(o)*Math.cos(i)),n=Math.asin(Math.cos(o)*Math.sin(i)/Math.cos(t)),e.x=this.long0-n/this.alfa,a=t,s=0;var c=0;do{e.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(t/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-e.y)<1e-10&&(s=1),a=e.y,c+=1}while(0===s&&c<15);return c>=15?null:e},names:["Krovak","krovak"]},Ve=function(e,t,n,o,i){return e*i-t*Math.sin(2*i)+n*Math.sin(4*i)-o*Math.sin(6*i)},qe=function(e){return 1-.25*e*(1+e/16*(3+1.25*e))},We=function(e){return.375*e*(1+.25*e*(1+.46875*e))},He=function(e){return.05859375*e*e*(1+.75*e)},Ye=function(e){return e*e*e*(35/3072)},Je=function(e,t,n){var o=t*n;return e/Math.sqrt(1-o*o)},Ze=function(e){return Math.abs(e)1e-7?(1-e*e)*(t/(1-(n=e*t)*n)-.5/e*Math.log((1-n)/(1+n))):2*t},$e={init:function(){var e,n=Math.abs(this.lat0);if(Math.abs(n-t)<1e-10?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(n)<1e-10?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0)switch(this.qp=Qe(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(e){var t,n=[];return n[0]=.3333333333333333*e,t=e*e,n[0]+=.17222222222222222*t,n[1]=.06388888888888888*t,t*=e,n[0]+=.10257936507936508*t,n[1]+=.0664021164021164*t,n[2]=.016415012942191543*t,n}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),e=Math.sin(this.lat0),this.sinb1=Qe(this.e,e)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*e*e)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(e){var n,o,r,a,s,l,c,u,d,p,h=e.x,g=e.y;if(h=x(h-this.long0),this.sphere){if(s=Math.sin(g),p=Math.cos(g),r=Math.cos(h),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((o=this.mode===this.EQUIT?1+p*r:1+this.sinph0*s+this.cosph0*p*r)<=1e-10)return null;n=(o=Math.sqrt(2/o))*p*Math.sin(h),o*=this.mode===this.EQUIT?s:this.cosph0*s-this.sinph0*p*r}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(r=-r),Math.abs(g+this.lat0)<1e-10)return null;o=i-.5*g,n=(o=2*(this.mode===this.S_POLE?Math.cos(o):Math.sin(o)))*Math.sin(h),o*=r}}else{switch(c=0,u=0,d=0,r=Math.cos(h),a=Math.sin(h),s=Math.sin(g),l=Qe(this.e,s),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(c=l/this.qp,u=Math.sqrt(1-c*c)),this.mode){case this.OBLIQ:d=1+this.sinb1*c+this.cosb1*u*r;break;case this.EQUIT:d=1+u*r;break;case this.N_POLE:d=t+g,l=this.qp-l;break;case this.S_POLE:d=g-t,l=this.qp+l}if(Math.abs(d)<1e-10)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:d=Math.sqrt(2/d),o=this.mode===this.OBLIQ?this.ymf*d*(this.cosb1*c-this.sinb1*u*r):(d=Math.sqrt(2/(1+u*r)))*c*this.ymf,n=this.xmf*d*u*a;break;case this.N_POLE:case this.S_POLE:l>=0?(n=(d=Math.sqrt(l))*a,o=r*(this.mode===this.S_POLE?d:-d)):n=o=0}}return e.x=this.a*n+this.x0,e.y=this.a*o+this.y0,e},inverse:function(e){e.x-=this.x0,e.y-=this.y0;var n,o,i,r,a,s,l,c,u,d,p=e.x/this.a,h=e.y/this.a;if(this.sphere){var g,m=0,f=0;if((o=.5*(g=Math.sqrt(p*p+h*h)))>1)return null;switch(o=2*Math.asin(o),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(f=Math.sin(o),m=Math.cos(o)),this.mode){case this.EQUIT:o=Math.abs(g)<=1e-10?0:Math.asin(h*f/g),p*=f,h=m*g;break;case this.OBLIQ:o=Math.abs(g)<=1e-10?this.lat0:Math.asin(m*this.sinph0+h*f*this.cosph0/g),p*=f*this.cosph0,h=(m-Math.sin(o)*this.sinph0)*g;break;case this.N_POLE:h=-h,o=t-o;break;case this.S_POLE:o-=t}n=0!==h||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(p,h):0}else{if(l=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(p/=this.dd,h*=this.dd,(s=Math.sqrt(p*p+h*h))<1e-10)return e.x=this.long0,e.y=this.lat0,e;r=2*Math.asin(.5*s/this.rq),i=Math.cos(r),p*=r=Math.sin(r),this.mode===this.OBLIQ?(l=i*this.sinb1+h*r*this.cosb1/s,a=this.qp*l,h=s*this.cosb1*i-h*this.sinb1*r):(l=h*r/s,a=this.qp*l,h=s*i)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(h=-h),!(a=p*p+h*h))return e.x=this.long0,e.y=this.lat0,e;l=1-a/this.qp,this.mode===this.S_POLE&&(l=-l)}n=Math.atan2(p,h),c=Math.asin(l),u=this.apa,d=c+c,o=c+u[0]*Math.sin(d)+u[1]*Math.sin(d+d)+u[2]*Math.sin(d+d+d)}return e.x=x(this.long0+n),e.y=o,e},names:["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"],S_POLE:1,N_POLE:2,EQUIT:3,OBLIQ:4},et=function(e){return Math.abs(e)>1&&(e=e>1?1:-1),Math.asin(e)},tt={init:function(){Math.abs(this.lat1+this.lat2)<1e-10||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=M(this.e3,this.sin_po,this.cos_po),this.qs1=Qe(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=M(this.e3,this.sin_po,this.cos_po),this.qs2=Qe(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=Qe(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>1e-10?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(e){var t=e.x,n=e.y;this.sin_phi=Math.sin(n),this.cos_phi=Math.cos(n);var o=Qe(this.e3,this.sin_phi,this.cos_phi),i=this.a*Math.sqrt(this.c-this.ns0*o)/this.ns0,r=this.ns0*x(t-this.long0),a=i*Math.sin(r)+this.x0,s=this.rh-i*Math.cos(r)+this.y0;return e.x=a,e.y=s,e},inverse:function(e){var t,n,o,i,r,a;return e.x-=this.x0,e.y=this.rh-e.y+this.y0,this.ns0>=0?(t=Math.sqrt(e.x*e.x+e.y*e.y),o=1):(t=-Math.sqrt(e.x*e.x+e.y*e.y),o=-1),i=0,0!==t&&(i=Math.atan2(o*e.x,o*e.y)),o=t*this.ns0/this.a,this.sphere?a=Math.asin((this.c-o*o)/(2*this.ns0)):(n=(this.c-o*o)/this.ns0,a=this.phi1z(this.e3,n)),r=x(i/this.ns0+this.long0),e.x=r,e.y=a,e},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(e,t){var n,o,i,r,a=et(.5*t);if(e<1e-10)return a;for(var s=e*e,l=1;l<=25;l++)if(a+=r=.5*(i=1-(o=e*(n=Math.sin(a)))*o)*i/Math.cos(a)*(t/(1-s)-n/i+.5/e*Math.log((1-o)/(1+o))),Math.abs(r)<=1e-7)return a;return null}},nt={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},forward:function(e){var t,n,o,i,r,a,s,l=e.x,c=e.y;return o=x(l-this.long0),t=Math.sin(c),n=Math.cos(c),i=Math.cos(o),(r=this.sin_p14*t+this.cos_p14*n*i)>0||Math.abs(r)<=1e-10?(a=this.x0+1*this.a*n*Math.sin(o)/r,s=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*n*i)/r):(a=this.x0+this.infinity_dist*n*Math.sin(o),s=this.y0+this.infinity_dist*(this.cos_p14*t-this.sin_p14*n*i)),e.x=a,e.y=s,e},inverse:function(e){var t,n,o,i,r,a;return e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,(t=Math.sqrt(e.x*e.x+e.y*e.y))?(i=Math.atan2(t,this.rc),n=Math.sin(i),o=Math.cos(i),a=et(o*this.sin_p14+e.y*n*this.cos_p14/t),r=Math.atan2(e.x*n,t*this.cos_p14*o-e.y*this.sin_p14*n),r=x(this.long0+r)):(a=this.phic0,r=0),e.x=r,e.y=a,e},names:["gnom"]},ot={init:function(){this.sphere||(this.k0=M(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(e){var t,n,o=e.x,i=e.y,r=x(o-this.long0);if(this.sphere)t=this.x0+this.a*r*Math.cos(this.lat_ts),n=this.y0+this.a*Math.sin(i)/Math.cos(this.lat_ts);else{var a=Qe(this.e,Math.sin(i));t=this.x0+this.a*this.k0*r,n=this.y0+this.a*a*.5/this.k0}return e.x=t,e.y=n,e},inverse:function(e){var n,o;return e.x-=this.x0,e.y-=this.y0,this.sphere?(n=x(this.long0+e.x/this.a/Math.cos(this.lat_ts)),o=Math.asin(e.y/this.a*Math.cos(this.lat_ts))):(o=function(e,n){var o=1-(1-e*e)/(2*e)*Math.log((1-e)/(1+e));if(Math.abs(Math.abs(n)-o)<1e-6)return n<0?-1*t:t;for(var i,r,a,s,l=Math.asin(.5*n),c=0;c<30;c++)if(r=Math.sin(l),a=Math.cos(l),s=e*r,l+=i=Math.pow(1-s*s,2)/(2*a)*(n/(1-e*e)-r/(1-s*s)+.5/e*Math.log((1-s)/(1+s))),Math.abs(i)<=1e-10)return l;return NaN}(this.e,2*e.y*this.k0/this.a),n=x(this.long0+e.x/(this.a*this.k0))),e.x=n,e.y=o,e},names:["cea"]},it={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(e){var t=e.x,n=e.y,o=x(t-this.long0),i=Ze(n-this.lat0);return e.x=this.x0+this.a*o*this.rc,e.y=this.y0+this.a*i,e},inverse:function(e){var t=e.x,n=e.y;return e.x=x(this.long0+(t-this.x0)/(this.a*this.rc)),e.y=Ze(this.lat0+(n-this.y0)/this.a),e},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},rt={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=qe(this.es),this.e1=We(this.es),this.e2=He(this.es),this.e3=Ye(this.es),this.ml0=this.a*Ve(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(e){var t,n,o,i=e.x,r=e.y,a=x(i-this.long0);if(o=a*Math.sin(r),this.sphere)Math.abs(r)<=1e-10?(t=this.a*a,n=-1*this.a*this.lat0):(t=this.a*Math.sin(o)/Math.tan(r),n=this.a*(Ze(r-this.lat0)+(1-Math.cos(o))/Math.tan(r)));else if(Math.abs(r)<=1e-10)t=this.a*a,n=-1*this.ml0;else{var s=Je(this.a,this.e,Math.sin(r))/Math.tan(r);t=s*Math.sin(o),n=this.a*Ve(this.e0,this.e1,this.e2,this.e3,r)-this.ml0+s*(1-Math.cos(o))}return e.x=t+this.x0,e.y=n+this.y0,e},inverse:function(e){var t,n,o,i,r,a,s,l,c;if(o=e.x-this.x0,i=e.y-this.y0,this.sphere)if(Math.abs(i+this.a*this.lat0)<=1e-10)t=x(o/this.a+this.long0),n=0;else{var u;for(a=this.lat0+i/this.a,s=o*o/this.a/this.a+a*a,l=a,r=20;r;--r)if(l+=c=-1*(a*(l*(u=Math.tan(l))+1)-l-.5*(l*l+s)*u)/((l-a)/u-1),Math.abs(c)<=1e-10){n=l;break}t=x(this.long0+Math.asin(o*Math.tan(l)/this.a)/Math.sin(n))}else if(Math.abs(i+this.ml0)<=1e-10)n=0,t=x(this.long0+o/this.a);else{var d,p,h,g,m;for(a=(this.ml0+i)/this.a,s=o*o/this.a/this.a+a*a,l=a,r=20;r;--r)if(m=this.e*Math.sin(l),d=Math.sqrt(1-m*m)*Math.tan(l),p=this.a*Ve(this.e0,this.e1,this.e2,this.e3,l),h=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),l-=c=(a*(d*(g=p/this.a)+1)-g-.5*d*(g*g+s))/(this.es*Math.sin(2*l)*(g*g+s-2*a*g)/(4*d)+(a-g)*(d*h-2/Math.sin(2*l))-h),Math.abs(c)<=1e-10){n=l;break}d=Math.sqrt(1-this.es*Math.pow(Math.sin(n),2))*Math.tan(n),t=x(this.long0+Math.asin(o*d/this.a)/Math.sin(n))}return e.x=t,e.y=n,e},names:["Polyconic","poly"]},at={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(t){var n,o=t.x,i=t.y-this.lat0,r=o-this.long0,a=i/e*1e-5,s=r,l=1,c=0;for(n=1;n<=10;n++)l*=a,c+=this.A[n]*l;var u,d=c,p=s,h=1,g=0,m=0,f=0;for(n=1;n<=6;n++)u=g*d+h*p,h=h*d-g*p,g=u,m=m+this.B_re[n]*h-this.B_im[n]*g,f=f+this.B_im[n]*h+this.B_re[n]*g;return t.x=f*this.a+this.x0,t.y=m*this.a+this.y0,t},inverse:function(t){var n,o,i=t.x,r=t.y,a=i-this.x0,s=(r-this.y0)/this.a,l=a/this.a,c=1,u=0,d=0,p=0;for(n=1;n<=6;n++)o=u*s+c*l,c=c*s-u*l,u=o,d=d+this.C_re[n]*c-this.C_im[n]*u,p=p+this.C_im[n]*c+this.C_re[n]*u;for(var h=0;h.999999999999&&(n=.999999999999),t=Math.asin(n);var o=x(this.long0+e.x/(.900316316158*this.a*Math.cos(t)));o<-Math.PI&&(o=-Math.PI),o>Math.PI&&(o=Math.PI),n=(2*t+Math.sin(2*t))/Math.PI,Math.abs(n)>1&&(n=1);var i=Math.asin(n);return e.x=o,e.y=i,e},names:["Mollweide","moll"]},ut={init:function(){Math.abs(this.lat1+this.lat2)<1e-10||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=qe(this.es),this.e1=We(this.es),this.e2=He(this.es),this.e3=Ye(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=M(this.e,this.sinphi,this.cosphi),this.ml1=Ve(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<1e-10?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=M(this.e,this.sinphi,this.cosphi),this.ml2=Ve(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=Ve(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},forward:function(e){var t,n=e.x,o=e.y;if(this.sphere)t=this.a*(this.g-o);else{var i=Ve(this.e0,this.e1,this.e2,this.e3,o);t=this.a*(this.g-i)}var r=this.ns*x(n-this.long0),a=this.x0+t*Math.sin(r),s=this.y0+this.rh-t*Math.cos(r);return e.x=a,e.y=s,e},inverse:function(e){var t,n,o,i;e.x-=this.x0,e.y=this.rh-e.y+this.y0,this.ns>=0?(n=Math.sqrt(e.x*e.x+e.y*e.y),t=1):(n=-Math.sqrt(e.x*e.x+e.y*e.y),t=-1);var r=0;if(0!==n&&(r=Math.atan2(t*e.x,t*e.y)),this.sphere)return i=x(this.long0+r/this.ns),o=Ze(this.g-n/this.a),e.x=i,e.y=o,e;var a=this.g-n/this.a;return o=Ke(a,this.e0,this.e1,this.e2,this.e3),i=x(this.long0+r/this.ns),e.x=i,e.y=o,e},names:["Equidistant_Conic","eqdc"]},dt={init:function(){this.R=this.a},forward:function(e){var n,o,i=e.x,r=e.y,a=x(i-this.long0);Math.abs(r)<=1e-10&&(n=this.x0+this.R*a,o=this.y0);var s=et(2*Math.abs(r/Math.PI));(Math.abs(a)<=1e-10||Math.abs(Math.abs(r)-t)<=1e-10)&&(n=this.x0,o=r>=0?this.y0+Math.PI*this.R*Math.tan(.5*s):this.y0+Math.PI*this.R*-Math.tan(.5*s));var l=.5*Math.abs(Math.PI/a-a/Math.PI),c=l*l,u=Math.sin(s),d=Math.cos(s),p=d/(u+d-1),h=p*p,g=p*(2/u-1),m=g*g,f=Math.PI*this.R*(l*(p-m)+Math.sqrt(c*(p-m)*(p-m)-(m+c)*(h-m)))/(m+c);a<0&&(f=-f),n=this.x0+f;var y=c+p;return f=Math.PI*this.R*(g*y-l*Math.sqrt((m+c)*(c+1)-y*y))/(m+c),o=r>=0?this.y0+f:this.y0-f,e.x=n,e.y=o,e},inverse:function(e){var t,n,o,i,r,a,s,l,c,u,d,p;return e.x-=this.x0,e.y-=this.y0,d=Math.PI*this.R,r=(o=e.x/d)*o+(i=e.y/d)*i,d=3*(i*i/(l=-2*(a=-Math.abs(i)*(1+r))+1+2*i*i+r*r)+(2*(s=a-2*i*i+o*o)*s*s/l/l/l-9*a*s/l/l)/27)/(c=(a-s*s/3/l)/l)/(u=2*Math.sqrt(-c/3)),Math.abs(d)>1&&(d=d>=0?1:-1),p=Math.acos(d)/3,n=e.y>=0?(-u*Math.cos(p+Math.PI/3)-s/3/l)*Math.PI:-(-u*Math.cos(p+Math.PI/3)-s/3/l)*Math.PI,t=Math.abs(o)<1e-10?this.long0:x(this.long0+Math.PI*(r-1+Math.sqrt(1+2*(o*o-i*i)+r*r))/2/o),e.x=t,e.y=n,e},names:["Van_der_Grinten_I","VanDerGrinten","vandg"]},pt={init:function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},forward:function(e){var n,o,i,r,a,s,l,c,u,d,p,h,g,m,f,y,A,v,C,I,b,w,E=e.x,_=e.y,S=Math.sin(e.y),M=Math.cos(e.y),P=x(E-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=1e-10?(e.x=this.x0+this.a*(t-_)*Math.sin(P),e.y=this.y0-this.a*(t-_)*Math.cos(P),e):Math.abs(this.sin_p12+1)<=1e-10?(e.x=this.x0+this.a*(t+_)*Math.sin(P),e.y=this.y0+this.a*(t+_)*Math.cos(P),e):(v=this.sin_p12*S+this.cos_p12*M*Math.cos(P),A=(y=Math.acos(v))?y/Math.sin(y):1,e.x=this.x0+this.a*A*M*Math.sin(P),e.y=this.y0+this.a*A*(this.cos_p12*S-this.sin_p12*M*Math.cos(P)),e):(n=qe(this.es),o=We(this.es),i=He(this.es),r=Ye(this.es),Math.abs(this.sin_p12-1)<=1e-10?(a=this.a*Ve(n,o,i,r,t),s=this.a*Ve(n,o,i,r,_),e.x=this.x0+(a-s)*Math.sin(P),e.y=this.y0-(a-s)*Math.cos(P),e):Math.abs(this.sin_p12+1)<=1e-10?(a=this.a*Ve(n,o,i,r,t),s=this.a*Ve(n,o,i,r,_),e.x=this.x0+(a+s)*Math.sin(P),e.y=this.y0+(a+s)*Math.cos(P),e):(l=S/M,c=Je(this.a,this.e,this.sin_p12),u=Je(this.a,this.e,S),d=Math.atan((1-this.es)*l+this.es*c*this.sin_p12/(u*M)),C=0===(p=Math.atan2(Math.sin(P),this.cos_p12*Math.tan(d)-this.sin_p12*Math.cos(P)))?Math.asin(this.cos_p12*Math.sin(d)-this.sin_p12*Math.cos(d)):Math.abs(Math.abs(p)-Math.PI)<=1e-10?-Math.asin(this.cos_p12*Math.sin(d)-this.sin_p12*Math.cos(d)):Math.asin(Math.sin(P)*Math.cos(d)/Math.sin(p)),h=this.e*this.sin_p12/Math.sqrt(1-this.es),y=c*C*(1-(I=C*C)*(f=(g=this.e*this.cos_p12*Math.cos(p)/Math.sqrt(1-this.es))*g)*(1-f)/6+(b=I*C)/8*(m=h*g)*(1-2*f)+(w=b*C)/120*(f*(4-7*f)-3*h*h*(1-7*f))-w*C/48*m),e.x=this.x0+y*Math.sin(p),e.y=this.y0+y*Math.cos(p),e))},inverse:function(e){var n,o,i,r,a,s,l,c,u,d,p,h,g,m,f,y,A,v,C,I,b,w,E;if(e.x-=this.x0,e.y-=this.y0,this.sphere){if((n=Math.sqrt(e.x*e.x+e.y*e.y))>2*t*this.a)return;return o=n/this.a,i=Math.sin(o),r=Math.cos(o),a=this.long0,Math.abs(n)<=1e-10?s=this.lat0:(s=et(r*this.sin_p12+e.y*i*this.cos_p12/n),l=Math.abs(this.lat0)-t,a=Math.abs(l)<=1e-10?this.lat0>=0?x(this.long0+Math.atan2(e.x,-e.y)):x(this.long0-Math.atan2(-e.x,e.y)):x(this.long0+Math.atan2(e.x*i,n*this.cos_p12*r-e.y*this.sin_p12*i))),e.x=a,e.y=s,e}return c=qe(this.es),u=We(this.es),d=He(this.es),p=Ye(this.es),Math.abs(this.sin_p12-1)<=1e-10?(h=this.a*Ve(c,u,d,p,t),n=Math.sqrt(e.x*e.x+e.y*e.y),s=Ke((h-n)/this.a,c,u,d,p),a=x(this.long0+Math.atan2(e.x,-1*e.y)),e.x=a,e.y=s,e):Math.abs(this.sin_p12+1)<=1e-10?(h=this.a*Ve(c,u,d,p,t),n=Math.sqrt(e.x*e.x+e.y*e.y),s=Ke((n-h)/this.a,c,u,d,p),a=x(this.long0+Math.atan2(e.x,e.y)),e.x=a,e.y=s,e):(n=Math.sqrt(e.x*e.x+e.y*e.y),f=Math.atan2(e.x,e.y),g=Je(this.a,this.e,this.sin_p12),y=Math.cos(f),v=-(A=this.e*this.cos_p12*y)*A/(1-this.es),C=3*this.es*(1-v)*this.sin_p12*this.cos_p12*y/(1-this.es),w=1-v*(b=(I=n/g)-v*(1+v)*Math.pow(I,3)/6-C*(1+3*v)*Math.pow(I,4)/24)*b/2-I*b*b*b/6,m=Math.asin(this.sin_p12*Math.cos(b)+this.cos_p12*Math.sin(b)*y),a=x(this.long0+Math.asin(Math.sin(f)*Math.sin(b)/Math.cos(m))),E=Math.sin(m),s=Math.atan2((E-this.es*w*this.sin_p12)*Math.tan(m),E*(1-this.es)),e.x=a,e.y=s,e)},names:["Azimuthal_Equidistant","aeqd"]},ht={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(e){var t,n,o,i,r,a,s,l=e.x,c=e.y;return o=x(l-this.long0),t=Math.sin(c),n=Math.cos(c),i=Math.cos(o),((r=this.sin_p14*t+this.cos_p14*n*i)>0||Math.abs(r)<=1e-10)&&(a=1*this.a*n*Math.sin(o),s=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*n*i)),e.x=a,e.y=s,e},inverse:function(e){var n,o,i,r,a,s,l;return e.x-=this.x0,e.y-=this.y0,n=Math.sqrt(e.x*e.x+e.y*e.y),o=et(n/this.a),i=Math.sin(o),r=Math.cos(o),s=this.long0,Math.abs(n)<=1e-10?(l=this.lat0,e.x=s,e.y=l,e):(l=et(r*this.sin_p14+e.y*i*this.cos_p14/n),a=Math.abs(this.lat0)-t,Math.abs(a)<=1e-10?(s=this.lat0>=0?x(this.long0+Math.atan2(e.x,-e.y)):x(this.long0-Math.atan2(-e.x,e.y)),e.x=s,e.y=l,e):(s=x(this.long0+Math.atan2(e.x*i,n*this.cos_p14*r-e.y*this.sin_p14*i)),e.x=s,e.y=l,e))},names:["ortho"]},gt=1,mt=2,ft=3,yt=4,At=5,vt=6,Ct=1,It=2,bt=3,wt=4;function Et(e,n,o,r){var s;return e<1e-10?(r.value=Ct,s=0):(s=Math.atan2(n,o),Math.abs(s)<=i?r.value=Ct:s>i&&s<=t+i?(r.value=It,s-=t):s>t+i||s<=-(t+i)?(r.value=bt,s=s>=0?s-a:s+a):(r.value=wt,s+=t)),s}function _t(e,t){var n=e+t;return n<-a?n+=r:n>+a&&(n-=r),n}var St,Mt={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=t-i/2?this.face=At:this.lat0<=-(t-i/2)?this.face=vt:Math.abs(this.long0)<=i?this.face=gt:Math.abs(this.long0)<=t+i?this.face=this.long0>0?mt:yt:this.face=ft,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(e){var n,o,r,s,l,c,u={x:0,y:0},d={value:0};if(e.x-=this.long0,n=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(e.y)):e.y,o=e.x,this.face===At)s=t-n,o>=i&&o<=t+i?(d.value=Ct,r=o-t):o>t+i||o<=-(t+i)?(d.value=It,r=o>0?o-a:o+a):o>-(t+i)&&o<=-i?(d.value=bt,r=o+t):(d.value=wt,r=o);else if(this.face===vt)s=t+n,o>=i&&o<=t+i?(d.value=Ct,r=-o+t):o=-i?(d.value=It,r=-o):o<-i&&o>=-(t+i)?(d.value=bt,r=-o-t):(d.value=wt,r=o>0?-o+a:-o-a);else{var p,h,g,m,f,y;this.face===mt?o=_t(o,+t):this.face===ft?o=_t(o,+a):this.face===yt&&(o=_t(o,-t)),m=Math.sin(n),f=Math.cos(n),y=Math.sin(o),p=f*Math.cos(o),h=f*y,g=m,this.face===gt?r=Et(s=Math.acos(p),g,h,d):this.face===mt?r=Et(s=Math.acos(h),g,-p,d):this.face===ft?r=Et(s=Math.acos(-p),g,-h,d):this.face===yt?r=Et(s=Math.acos(-h),g,p,d):(s=r=0,d.value=Ct)}return c=Math.atan(12/a*(r+Math.acos(Math.sin(r)*Math.cos(i))-t)),l=Math.sqrt((1-Math.cos(s))/(Math.cos(c)*Math.cos(c))/(1-Math.cos(Math.atan(1/Math.cos(r))))),d.value===It?c+=t:d.value===bt?c+=a:d.value===wt&&(c+=1.5*a),u.x=l*Math.cos(c),u.y=l*Math.sin(c),u.x=u.x*this.a+this.x0,u.y=u.y*this.a+this.y0,e.x=u.x,e.y=u.y,e},inverse:function(e){var n,o,i,r,s,l,c,u,d,p,h,g,m={lam:0,phi:0},f={value:0};if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,o=Math.atan(Math.sqrt(e.x*e.x+e.y*e.y)),n=Math.atan2(e.y,e.x),e.x>=0&&e.x>=Math.abs(e.y)?f.value=Ct:e.y>=0&&e.y>=Math.abs(e.x)?(f.value=It,n-=t):e.x<0&&-e.x>=Math.abs(e.y)?(f.value=bt,n=n<0?n+a:n-a):(f.value=wt,n+=t),d=a/12*Math.tan(n),s=Math.sin(d)/(Math.cos(d)-1/Math.sqrt(2)),l=Math.atan(s),(c=1-(i=Math.cos(n))*i*(r=Math.tan(o))*r*(1-Math.cos(Math.atan(1/Math.cos(l)))))<-1?c=-1:c>1&&(c=1),this.face===At)u=Math.acos(c),m.phi=t-u,f.value===Ct?m.lam=l+t:f.value===It?m.lam=l<0?l+a:l-a:f.value===bt?m.lam=l-t:m.lam=l;else if(this.face===vt)u=Math.acos(c),m.phi=u-t,f.value===Ct?m.lam=-l+t:f.value===It?m.lam=-l:f.value===bt?m.lam=-l-t:m.lam=l<0?-l-a:-l+a;else{var y,A,v;d=(y=c)*y,A=(d+=(v=d>=1?0:Math.sqrt(1-d)*Math.sin(l))*v)>=1?0:Math.sqrt(1-d),f.value===It?(d=A,A=-v,v=d):f.value===bt?(A=-A,v=-v):f.value===wt&&(d=A,A=v,v=-d),this.face===mt?(d=y,y=-A,A=d):this.face===ft?(y=-y,A=-A):this.face===yt&&(d=y,y=A,A=-d),m.phi=Math.acos(-v)-t,m.lam=Math.atan2(A,y),this.face===mt?m.lam=_t(m.lam,-t):this.face===ft?m.lam=_t(m.lam,-a):this.face===yt&&(m.lam=_t(m.lam,+t))}return 0!==this.es&&(p=m.phi<0?1:0,h=Math.tan(m.phi),g=this.b/Math.sqrt(h*h+this.one_minus_f_squared),m.phi=Math.atan(Math.sqrt(this.a*this.a-g*g)/(this.one_minus_f*g)),p&&(m.phi=-m.phi)),m.lam+=this.long0,e.x=m.lam,e.y=m.phi,e},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},Pt=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],xt=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],kt=o/5,Gt=function(e,t){return e[0]+t*(e[1]+t*(e[2]+t*e[3]))},Rt={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(e){var t=x(e.x-this.long0),n=Math.abs(e.y),i=Math.floor(n*kt);i<0?i=0:i>=18&&(i=17);var r={x:Gt(Pt[i],n=o*(n-.08726646259971647*i))*t,y:Gt(xt[i],n)};return e.y<0&&(r.y=-r.y),r.x=r.x*this.a*.8487+this.x0,r.y=r.y*this.a*1.3523+this.y0,r},inverse:function(e){var o={x:(e.x-this.x0)/(.8487*this.a),y:Math.abs(e.y-this.y0)/(1.3523*this.a)};if(o.y>=1)o.x/=Pt[18][0],o.y=e.y<0?-t:t;else{var i=Math.floor(18*o.y);for(i<0?i=0:i>=18&&(i=17);;)if(xt[i][0]>o.y)--i;else{if(!(xt[i+1][0]<=o.y))break;++i}var r=xt[i],a=5*(o.y-r[0])/(xt[i+1][0]-r[0]);a=function(e,t,n,o){for(var i=t;o;--o){var r=e(i);if(i-=r,Math.abs(r)1&&console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored");var r=function(e,t,n){for(var o=[],i=0;i3?o.splice(3,o.length-1):[],void 0!==this.listeners[e]?this.listeners[e].push({scope:n,callback:t,args:o}):this.listeners[e]=[{scope:n,callback:t,args:o}]},removeEventListener:function(e,t,n){if(void 0!==this.listeners[e]){for(var o=this.listeners[e].length,i=[],r=0;r0;for(var i=0;i2?o.splice(2,o.length-1):[],o=[n].concat(o),void 0!==this.listeners[e]){var a=this.listeners[e].slice(),s=a.length;for(r=0;r0?r.replace("%var%",i.join(" - ")):r.replace("%var%","%var% (not specified)")}catch(e){}return r}},I={normalyzeParameters:function(e){var t=null;if(e){var n=[];for(var o in e)if(e.hasOwnProperty(o)){var i=e[o];i||(i=""),n.push(o+"="+i)}t=n.join("&")}return t},normalyzeUrl:function(e,t,n){var o=e;if(e){if(e.split("?").length-1>=2){var i=e.search(/\?/)+1;o=e.substring(0,i)+e.slice(i).replace(/\?/g,"&")}var r=e.indexOf("?");-1===r&&(o+="?"),-1!==r&&r!==e.length-1&&(o+="&")}return t&&(o+="string"==typeof t?t=t.replace("?",""):this.normalyzeParameters(t)),n&&(o=encodeURIComponent(o)),o},indent:function(e,t){return new Array((e||0)+1).join("\t")+t}},b=n(64),w=n.n(b),E={call:function(e){var t=v.getLogger("XHR");if(t.trace("[XHR::call()]"),w.a.polyfill(),!e.url)throw new Error("missing parameter : url is not defined !");if(!e.method)throw new Error("missing parameter : method is not defined !");e.format||(e.format="text");var n={};switch(n.url=e.url,n.data=e.data?e.data:null,n.method=e.method,n.timeOut=e.timeOut||0,n.scope=e.scope||this,n.proxy=e.proxy||null,n.content=e.content||null,n.headers=e.headers||{referer:"http://localhost"},e.method){case"DELETE":case"GET":break;case"PUT":case"POST":n.content=e.content?e.content:"application/x-www-form-urlencoded",n.headers=e.headers?e.headers:{referer:"http://localhost"};break;case"HEAD":case"OPTIONS":throw new Error("HTTP method not yet supported !");default:throw new Error("HTTP method unknown !")}switch(e.format){case"text":this.__call(n).then((function(n){t.trace(n),e.onResponse.call(this,n)})).catch((function(t){e.onFailure.call(this,t)}));break;case"json":this.__callJSON(n).then((function(n){t.trace(n),e.onResponse.call(this,n)})).catch((function(t){e.onFailure.call(this,t)}));break;case"xml":this.__callXML(n).then((function(n){t.trace(n),e.onResponse.call(this,n)})).catch((function(t){e.onFailure.call(this,t)}));break;default:throw new Error("This output Format is not yet supported !")}},__call:function(e){var t=v.getLogger("XHR");return t.trace("[XHR::__call()]"),new Promise((function(o,i){var r="POST"===e.method||"PUT"===e.method?1:0;e.data&&("object"==typeof e.data&&Object.keys(e.data).length||"string"==typeof e.data&&e.data.length)&&!r&&(e.url=I.normalyzeUrl(e.url,e.data)),t.trace("URL = ",e.url);var a=null;if("undefined"==typeof window){var s=n(59),l={headers:{Referer:"https://localhost"}};return e.data&&"string"==typeof e.data&&r&&(l={method:e.method,body:e.data,headers:{"Content-Type":e.content,Referer:"https://localhost"}}),s(e.url,l).then((function(e){if(e.ok)o(e.text());else{var t="Errors Occured on Http Request (status : '"+e.statusText+"' | url : '"+e.url+"')",n=e.status;i({message:t,status:n})}})).catch((function(e){i({message:e,status:-1})}))}if(window.XMLHttpRequest){t.trace("XMLHttpRequest"),(a=new XMLHttpRequest).open(e.method,e.url,!0),a.overrideMimeType=e.content;var c=null;e.timeOut>0&&(t.trace("XHR - TimeOut actif !"),c=window.setTimeout((function(){i({message:"TimeOut Occured on Http Request with XMLHttpRequest !",status:-1})}),e.timeOut)),r&&(t.trace("data = ",e.data),a.setRequestHeader("Content-type",e.content)),a.onerror=function(e){console.log(e),i(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(e){console.log(e),i(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onreadystatechange=function(e){if(4===a.readyState)if(200===a.status)window.clearTimeout(c),o(a.response);else{var t="Errors Occured on Http Request (status : '"+e.target.statusText+"' | url : '"+e.target.responseURL+"' | response : '"+e.target.response+"')",n=e.target.status;i({message:t,status:n})}};var u=e.data&&r?e.data:null;a.send(u)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");t.trace("XDomainRequest"),(a=new XDomainRequest).open(e.method,e.url),a.overrideMimeType=e.content,e.timeOut>0&&(a.timeout=e.timeout,t.trace("XHR - TimeOut actif !")),r&&a.setRequestHeader("Content-type",e.content),a.onerror=function(){i(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(){i(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onload=function(e){if(200===a.status)o(a.responseText);else{var t="Errors Occured on Http Request (status : '"+e.target.statusText+"' | url : '"+e.target.responseURL+"')",n=e.target.status;i({message:t,status:n})}};var d=e.data&&r?e.data:null;a.send(d)}}))},__callJSON:function(e){return this.__call(e).then(JSON.parse).catch((function(t){console.log("_callJSON failed on : ",e.url,t)}))},__callXML:function(e){return this.__call(e).then((function(e){var t;"undefined"==typeof window?t=(new(0,n(60).DOMParser)).parseFromString(e,"text/xml"):window.DOMParser?t=(new window.DOMParser).parseFromString(e,"text/xml"):((t=new window.ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t})).catch((function(t){console.log("__callXML failed on : ",e.url,t)}))}},_={uuid:(o=Math.floor(Date.now()),function(){return o++}),call:function(e){var t=v.getLogger("JSONP");if(t.trace("[JSONP::call ()]"),!e)throw t.error("missing parameter : options !"),new Error("missing parameter : options !");if(!e.url)throw t.error("missing parameter : options.url !"),new Error("missing parameter : options.url !");if(e.timeOut||(t.info("setting 'options.timeOut' default value"),e.timeOut=0),!e.onResponse)throw t.error("missing parameter : options.onResponse !"),new Error("missing parameter : options.onResponse !");var n="string"==typeof e.callbackSuffix?e.callbackSuffix:this.uuid(),o=!1,i=!1,r=e.url.indexOf("callback=");if(-1!==r){o=!0;var a=e.url.indexOf("&",r);-1===a&&(a=e.url.length);var s=e.url.substring(r+9,a);s&&(i=!0,e.callbackName=s,t.info("setting 'options.callbackName' value ("+e.callbackName+") from 'options.url' parameter"))}if(!o){var l=e.url.indexOf("?");-1===l?e.url=e.url+"?callback=":l===e.url.length?e.url=e.url+"callback=":e.url=e.url+"&callback=",t.info("setting callback default key in 'options.url' : "+e.url)}var c=!!e.callbackName||i;if(i||(e.callbackName||(t.info("setting 'options.callbackName' default value"),e.callbackName="callback",(n||""===n)&&(e.callbackName+=n)),e.url=e.url.replace("callback=","callback="+e.callbackName),t.info("setting callback function name in 'options.url' : "+e.url)),e.onTimeOut||(t.info("setting 'options.onTimeOut' default value"),e.onTimeOut=function(){console.log("TimeOut while invoking url : "+e.url)}),!c){var u=this,d=null;e.timeOut>0&&(d=window.setTimeout((function(){window[e.callbackName]=function(){},e.onTimeOut(),u._deleteScript(n)}),e.timeOut)),window[e.callbackName]=function(t){window.clearTimeout(d),e.onResponse(t),u._deleteScript(n)}}this._createScript(n,e.url)},_createScript:function(e,t){var n,o=document.getElementById("results"+e);(n=document.createElement("script")).setAttribute("type","text/javascript"),n.setAttribute("src",t),n.setAttribute("charset","UTF-8"),n.setAttribute("id","results"+e),n.setAttribute("async","true");var i=document.documentElement||document.getElementsByTagName("head")[0];null===o?i.appendChild(n):i.replaceChild(n,o)},_deleteScript:function(e){var t=document.getElementById("results"+e);if(t){var n=t.parentNode||document.documentElement;if(!n)return;n.removeChild(t)}}},S={send:function(e){var t=e||{method:"GET",protocol:"XHR",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("undefined"!=typeof window||"JSONP"!==e.protocol){if("XHR"===e.protocol||"json"===e.format?t.wrap=!1:"JSONP"===e.protocol&&"xml"===e.format&&(t.wrap=!0),t.callback=null,t.output=t.wrap?"json":null,t.wrap){var n={};n.output=t.output,n.callback=t.callback,delete n.callback,t.url=I.normalyzeUrl(e.url,n)}switch(t.protocol){case"XHR":"GET"===e.method&&e.nocache&&(t.url=I.normalyzeUrl(t.url,{t:(new Date).getTime()})),E.call(t);break;case"JSONP":t.data&&(t.url=I.normalyzeUrl(t.url,t.data)),_.call(t);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}else console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS")}};function M(e){if(!(this instanceof M))throw new TypeError("ErrorService constructor cannot be called as a function.");var t=e;"string"==typeof e||e instanceof String?(this.message=e,this.status=-1,this.type=M.TYPE_UNKERR):(this.message=t.message||"undefined!?",this.type=t.type,this.status=t.status||-1),this.name="ErrorService",this.stack=(new Error).stack}M.TYPE_SRVERR="SERVICE_ERROR",M.TYPE_USEERR="USAGE_ERROR",M.TYPE_UNKERR="UNKNOWN_ERROR",M.prototype=Object.create(Error.prototype,{constructor:{value:M,writable:!0,configurable:!0}});var P=M,x=n(31);function k(e){if(!(this instanceof k))throw new TypeError(C.getMessage("CLASS_CONSTRUCTOR"));for(var t in this.logger=v.getLogger("CommonService"),this.logger.trace("[Constructeur CommonService (options)]"),this.options={protocol:"XHR",ssl:!0,proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(e){console.log("onSuccess - la reponse est la suivante : ",e)},onFailure:function(e){200!==e.status&&e.status?console.log("onFailure - Erreur (",e.status,") : ",e.message):console.log("onFailure : ",e.message)}},e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);if(this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(e){console.log("onSuccess - la réponse brute du service est la suivante : ",e)}),!!(null===this.options.onSuccess||"function"!=typeof this.options.onSuccess))throw new Error(C.getMessage("PARAM_MISSING","onSuccess()"));switch(this.options.httpMethod="string"==typeof e.httpMethod?e.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(C.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(C.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof e.protocol?e.protocol.toUpperCase():"XHR",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(C.getMessage("PARAM_UNKNOWN","protocol"))}if("undefined"==typeof window&&"JSONP"===this.options.protocol)throw new Error(C.getMessage("PARAM_NOT_SUPPORT_NODEJS","protocol=JSONP (instead use XHR)"));"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=e.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}k.prototype={constructor:k,call:function(){this.logger.trace("CommonService::call ()");var e=this;function t(t){this.logger.trace("CommonService::onBuildRequest : ",t),this.callService.call(e,i,n)}function n(t){this.logger.trace("CommonService::onCallService : ",t),this.analyzeResponse.call(e,i,o)}function o(e){if(this.logger.trace("CommonService::onAnalyzeResponse : ",e),!e)return i.call(this,new P("Analyse de la reponse en échec !?"));this.options.onSuccess.call(this,e)}function i(e){this.logger.trace("CommonService::onError()");var t=e;t instanceof P||(t=new P(e.message)),this.options.onFailure.call(this,t)}(function(){this.logger.trace("CommonService::run ()"),this.buildRequest.call(e,i,t)}).call(e)},buildRequest:function(e,t){this.logger.error("overwritten method !"),e&&e.call(this,"This method must be overwritten !"),t.call(this,"This method must be overwritten !")},callService:function(e,t){var n=null,o=this.request,i=!(!this.options.proxyURL||"XHR"!==this.options.protocol),r={"gp-access-lib":x.version};this.options.apiKey&&(r.apiKey=this.options.apiKey),this.options.serverUrl=I.normalyzeUrl(this.options.serverUrl,r,!1),i&&("GET"===this.options.httpMethod&&(n=this.options.proxyURL+I.normalyzeUrl(this.options.serverUrl,this.request,!0),o=null),"POST"===this.options.httpMethod&&(n=this.options.proxyURL+I.normalyzeUrl(this.options.serverUrl,null,!0),o=this.request));var a=this,s={url:n||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:o,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(n){a.logger.trace("callService::onResponse()");var o=null;if("XHR"===a.options.protocol&&(a.logger.trace("Response XHR",n),o=n),"JSONP"===a.options.protocol){if(a.logger.trace("Response JSON",n),!n)return void e.call(a,new P("Le contenu de la reponse est vide !?"));if(n.http){if(200!==n.http.status)return void e.call(a,new P({status:n.http.status,message:n.http.error,type:P.TYPE_SRVERR}));o=n.xml,a.options.rawResponse&&(o=n)}else o=n}if("function"==typeof a.options.onBeforeParse){var i=a.options.onBeforeParse(o);"string"==typeof i&&(o=i)}a.response=o,t.call(a,o)},onFailure:function(t){a.logger.trace("callService::onFailure()"),t.type=P.TYPE_SRVERR,e.call(a,new P(t))},onTimeOut:function(){a.logger.trace("callService::onTimeOut()"),e.call(a,new P("TimeOut!"))}};S.send(s)},analyzeResponse:function(e,t){this.logger.error("overwritten method !"),e&&e.call(this,"This method must be overwritten !"),t.call(this,"This method must be overwritten !")}};var G=k,R={ssl:!0,newUrl:function(e){return(!1===R.ssl?"http://":"https://")+"data.geopf.fr"+e},Alti:{new_key:{"elevation-json":"/altimetrie/1.0/calcul/alti/rest/elevation.json","elevation-xml":"/altimetrie/1.0/calcul/alti/rest/elevation.xml","profil-json":"/altimetrie/1.0/calcul/alti/rest/elevationLine.json","profil-xml":"/altimetrie/1.0/calcul/alti/rest/elevationLine.xml"},newUrl:function(){return{"elevation-json":R.newUrl(this.new_key["elevation-json"]),"elevation-xml":R.newUrl(this.new_key["elevation-xml"]),"profil-json":R.newUrl(this.new_key["profil-json"]),"profil-xml":R.newUrl(this.new_key["profil-xml"])}}},ProcessIsoCurve:{new_key:"/navigation/isochrone",newUrl:function(){return R.newUrl(this.new_key)}},Config:{_key:"https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/",url:function(e){Array.isArray(e)||(e=e.split(","));for(var t=[],n=0;no(e,{credentials:"same-origin"}).then(e=>{if(e.ok)return e.json().then(e=>e).catch(e=>{throw new Error("Exception Json : "+e)});throw new Error("Exception HTTP : "+e.status+" (status code) !")}).catch(e=>new Promise((t,n)=>{n(e)})),a=[];for(let e=0;e{if(!e)throw new Error("results config empty !?");e.forEach(e=>{this.listConfigResults.push(e)})}).then(()=>{t.call(this,this.listConfigResults)}).catch(t=>{e.call(this,t)})},j=function(e,t){this.listConfigResults=[];for(var n=0;nt||e__IDENTIFIER__\x3c!-- __DATAINPUTS__ --\x3e__RAWDATAOUTPUT__',input:"__KEY____DATA__"}},namespaceByDefault:function(){return['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'].join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){this.logger.trace("WPS::processRequestString ()");var e="";if("POST"===this.method)e=this.template.post.value;else{if("GET"!==this.method)return this.logger.error("No other method supported by the service !"),!1;e=this.template.get.value}return e=(e=(e=(e=(e=e.replace(/__SERVICE__/g,this.paramservice)).replace(/__VERSION__/g,this.paramversion)).replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput)).replace(/__IDENTIFIER__/g,this.paramidentifier)).replace(/__REQUEST__/g,this.paramrequest),"POST"===this.method&&(e=(e=e.replace(/__NAMESPACE__/g,this.namespaceByDefault)).replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),(e=e.replace(//g,this.__addDataInputs()))?(this.requestString=e,this.logger.trace("traduction tmpl",e),!0):(this.logger.warn("traduction tmpl : empty request !?"),!1)},__addDataInputs:function(){this.logger.trace("WPS::__addDataInputs ()");for(var e,t="GET"===this.method?this.template.get.input:this.template.post.input,n="GET"===this.method?";":"",o="",i=this,r=this.DataObject.getData(),a=0;a0)for(var a=o.getElementsByTagName("parsererror"),s=0;s0){var o=function(e){if(e.attributes.length>0){for(var t={},n=e.attributes,o=0;o0?t.index=t.filters.type[0]:t.index=t.filters.type),delete t.filters.type),t.filters.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),delete t.filters.bbox)),delete t.filterOptions),t.position&&(t.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),t.position.lon||(t.position.lon=t.position.x),delete t.position.x),t.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),t.position.lat||(t.position.lat=t.position.y),delete t.position.y)),t.returnFreeForm&&(this.logger.warn("The parameter 'returnFreeForm' is deprecated"),delete t.returnFreeForm),t.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete t.srs),t},_e.prototype.buildRequest=function(e,t){var n={httpMethod:this.options.httpMethod,geocodeMethod:"search",query:this.options.query,index:this.options.index,returnTrueGeometry:this.options.returnTrueGeometry,position:this.options.position,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=fe.build(n),this.request?t.call(this,this.request):e.call(this,new P(C.getMessage("SERVICE_REQUEST_BUILD")))},_e.prototype.analyzeResponse=function(e,t){if(this.response){var n={response:this.response,rawResponse:this.options.rawResponse,onError:e,onSuccess:t,scope:this};Ee.build(n)}else e.call(this,new P(C.getMessage("SERVICE_RESPONSE_EMPTY")))};var Se=_e;function Me(e){if(!(this instanceof Me))throw new TypeError(C.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));this.CLASSNAME="ReverseGeocode",this.logger=v.getLogger("Gp.Services.ReverseGeocode"),this.logger.trace("[Constructeur ReverseGeocode (options)]");var t=this.patchOptionConvertor(e);if(t.serverUrl||(t.serverUrl=T.ReverseGeocode.newUrl()),G.apply(this,[t]),t.searchGeometry)this.options.searchGeometry=t.searchGeometry;else if(!t.position)throw new Error(C.getMessage("PARAM_MISSING","searchGeometry"));if(t.index||(this.options.index=t.index="StreetAddress"),t.filters)for(var n=Object.keys(t.filters),o=0;o0?t.index=t.filterOptions.type[0]:t.index=t.filterOptions.type),delete t.filterOptions.type),t.filterOptions.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),t.searchGeometry||(t.searchGeometry=this.bbox2Json(t.filterOptions.bbox)),delete t.filterOptions.bbox),t.filterOptions.circle&&(this.logger.warn("The parameter 'filterOptions.circle' is deprecated"),t.searchGeometry||(t.searchGeometry=this.circle2Json(t.filterOptions.circle)),delete t.filterOptions.circle),t.filterOptions.polygon&&(this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"),t.searchGeometry||(t.searchGeometry=this.polygon2Json(t.filterOptions.polygon)),delete t.filterOptions.polygon),!t.filters&&Object.keys(t.filterOptions).length>0&&(t.filters=t.filterOptions),delete t.filterOptions),t.position&&(t.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),t.position.lon||(t.position.lon=t.position.x),delete t.position.x),t.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),t.position.lat||(t.position.lat=t.position.y),delete t.position.y)),t.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete t.srs),t},Me.prototype.buildRequest=function(e,t){var n={httpMethod:this.options.httpMethod,geocodeMethod:"reverse",searchGeometry:this.options.searchGeometry,index:this.options.index,position:this.options.position,returnTrueGeometry:this.options.returnTrueGeometry,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=fe.build(n),this.request?t.call(this,this.request):e.call(this,new P(C.getMessage("SERVICE_REQUEST_BUILD")))},Me.prototype.analyzeResponse=function(e,t){if(this.response){var n={response:this.response,rawResponse:this.options.rawResponse,onError:e,onSuccess:t,scope:this};Ee.build(n)}else e.call(this,new P(C.getMessage("SERVICE_RESPONSE_EMPTY")))},Me.prototype.bbox2Json=function(e){return{type:"Polygon",coordinates:[[[e.left,e.top],[e.right,e.top],[e.right,e.bottom],[e.left,e.bottom],[e.left,e.top]]]}},Me.prototype.circle2Json=function(e){return{type:"Circle",radius:e.radius,coordinates:[e.x,e.y]}},Me.prototype.polygon2Json=function(e){for(var t={type:"Polygon",coordinates:[[]]},n=0;n=5e4&&(this.distanceUnit="km",this.costValue/=1e3)):(this.costType="time",this.costValue=this.options.time)}Je.CLASSNAME="ProcessIsoCurveParam",Je.prototype={constructor:Je,getLocation:function(){return this.point.x+","+this.point.y},getDistanceUnit:function(){return"m"===this.distanceUnit?"meter":"km"===this.distanceUnit?"kilometer":""},getConstraints:function(){var e=[];if(0!==this.constraints.length)for(var t=0;t0)for(var o in t.noProxyDomains)if(n.trace("[ProxyUtils] proxifyUrl : analyzing "+t.noProxyDomains[o]),-1!==e.indexOf(t.noProxyDomains[o]))return n.info("[ProxyUtils] proxifyUrl : "+e+" found in noProxyDomains list ("+t.noProxyDomains[o]+")."),e;return t.proxyUrl+encodeURIComponent(e)}};function ut(e){return(ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var dt=lt.getLogger("GfiUtils"),pt={getLayerFormat:function(e){var t="function"==typeof e.getType?e.getType():null,n=e.getSource();if(t){if("VECTOR"===t||"VECTOR_TILE"===t)return"vector";if("TILE"===t)return n.tileGrid?"wmts":"wms";if("IMAGE"===t)return"wms"}else{if(n instanceof p.a||n instanceof f.a)return"wms";if(n instanceof g.a)return"wmts";if(n instanceof u.a||n instanceof l.a)return"vector"}return"unknown"},displayInfo:function(e,t,o,i,r){if(dt.trace("[GfiUtils] : displayInfo..."),i||(i="text/html"),null!==o){var s=null,l=o;l=(l=l.replace(/\n/g,"")).replace(/(>)\s*(<)/g,"$1$2");var c="undefined"!=typeof window?window:null;if("object"===("undefined"==typeof exports?"undefined":ut(exports))&&null===window)s=(new(0,n(62).DOMParser)).parseFromString(l,i);else if(c.DOMParser)s=(new c.DOMParser).parseFromString(l,i);else{if(!c.ActiveXObject)return dt.log("Incompatible environment for DOM Parser !"),!1;(s=new c.ActiveXObject("Microsoft.XMLDOM")).async=!1,s.loadXML(l)}var u=s.getElementsByTagName("body");if(u&&1===u.length&&!u[0].hasChildNodes())return!1;var d=document.createElement("div");d.className="gp-feature-info-div";var p=document.createElement("input");p.type="button",p.className="gp-styling-button closer",p.onclick=function(){return e.featuresOverlay&&(e.removeOverlay(e.featuresOverlay),e.featuresOverlay=null),!1};var h=document.createElement("div");return h.className="gp-features-content-div",h.innerHTML=o,d.appendChild(h),d.appendChild(p),e.featuresOverlay&&(e.removeOverlay(e.featuresOverlay),e.featuresOverlay=null),e.featuresOverlay=new a.a({element:d,autoPan:r.autoPan,autoPanAnimation:r.autoPanAnimation,autoPanMargin:r.autoPanMargin,positioning:"bottom-center",insertFirst:!1,stopEvent:!0}),e.addOverlay(e.featuresOverlay),e.featuresOverlay.setPosition(t),e.featuresOverlay.render(),!0}},features2html:function(e,t){var n=document.createElement("div");return t.forEach((function(e){var t=e.getProperties();if(t.hasOwnProperty("render"))n.insertAdjacentHTML("beforeend",t.render);else{if(t.hasOwnProperty("name")){var o=document.createElement("div");o.className="gp-att-name-div",o.insertAdjacentHTML("afterbegin",t.name),n.appendChild(o)}if(t.hasOwnProperty("description")){var i=document.createElement("div");i.className="gp-att-description-div",i.insertAdjacentHTML("afterbegin",t.description),n.appendChild(i)}var r=null,a=!1,s=null,l=null,c=null,u=["fill","fill-opacity","stroke","stroke-opacity","stroke-width","marker-symbol","marker-color","marker-size","geometry","value","name","description","styleUrl","extensionsNode_","icon"];for(r in t)if(void 0!==t[r]&&-1===u.indexOf(r)){a||((s=document.createElement("div")).className="gp-att-others-div",l=document.createElement("ul"),a=!0),c=document.createElement("li");var d=document.createElement("span");d.className="gp-attname-others-span",d.appendChild(document.createTextNode(r+" : ")),c.appendChild(d),c.appendChild(document.createTextNode(t[r])),l.appendChild(c)}l&&(s.appendChild(l),n.appendChild(s))}}),e),n.hasChildNodes()||(n=null),n},layerGetFeatureAtCoordinates:function(e,t,n){var o=e.getPixelFromCoordinate(n);return e.hasFeatureAtPixel(o,(function(e){return e===t}))},displayVectorFeatureInfo:function(e,t,n,o){var i=e.getPixelFromCoordinate(t),r=[];if(e.forEachFeatureAtPixel(i,(function(e,t){(!n||n.indexOf(t)>-1)&&r.push(e)})),0===r.length)return!1;var a=this.features2html(e,r);return null!==a&&(this.displayInfo(e,t,a.innerHTML,"text/html",o),!0)},displayFeatureInfo:function(e,t,n,o,i){for(var r={},a=0;ae.getResolution()&&(f=!1),f&&g.maxResolution&&g.maxResolution255)throw new Error("'"+e+"'' is greater than 255(0xff);");return("0"+Number(e).toString(16)).slice(-2)},num:function(e){return parseInt(e,16)},arrayToRgba:function(e){if(!Array.isArray(e))throw new Error("Not an array !");var t=e[0],n=e[1],o=e[2],i=e[3]||1;return"rgba("+t+", "+n+", "+o+", "+parseFloat(i)+")"},arrayToHex:function(e){if(!Array.isArray(e))throw new Error("Not an array !");var t=e[0],n=e[1],o=e[2],i=e[3],r=[this.hex(t),this.hex(n),this.hex(o)],a={};return a.hex="#"+r.join(""),i&&(a.opacity=parseFloat(i)),a},rgbaToHex:function(e){var t=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(0?.?\d+)\s*)?\)/.exec(e);if(!t)throw new Error("Invalid format: "+e);var n=t[1],o=t[2],i=t[3],r=t[4],a=[this.hex(n),this.hex(o),this.hex(i)],s={};return s.hex="#"+a.join(""),r&&(s.opacity=parseFloat(r)),s},hexToRgba:function(e,t){if(!e)throw new Error("Invalid format");e=e.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(function(e,t,n,o){return t+t+n+n+o+o}));var n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return(n=n?{r:parseInt(n[1],16),g:parseInt(n[2],16),b:parseInt(n[3],16)}:null)?"rgba("+n.r+", "+n.g+", "+n.b+", "+t+")":null},isHex:function(e){if(!e)return!1;if("#"!==e.charAt(0))return!1;return!!/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e)},isRGB:function(e){if(!e)return!1;return!!/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(0?.?\d+)\s*)?\)/.exec(e)}},At={lightOrange:"data:image/png;base64,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IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjkyYWVkNjM2LWY3MDMtNDAzOC1hNzM4LWZiYzYxYzZlMTljNCIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5NWMzZWI3NC0zYWRmLTRkYzUtOWZjZS1iODQ4NTc3Nzg4ODQiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0NjI3ZDg3NC1lZDIyLTRiZTUtYTlkNS00NDlmMzVhZDIxYzgiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE5Mjc4OTUzMDYiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphM2U3ZWQ1MS0xNTI4LTRhYjAtODVjOS0zNzNkNzgxZGM2ZmMiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjI1OjI3KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PofUkY4AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPGRuA4VZTAAAFcElEQVRYw82YW2xbVRaGv7XP8bHjXByHQkNhWigdVX1AikRBMBoQ8wASl4fRqPDAAxIPKAVxeRqQRohHBEVCaoGKUBCl4qHcNKCZVKMRRQxtgTaACLRKqlwB14NzM2ni2D2XvXjgBFXQOnFiA1uy/HB89u9/7bX+vf4l1HnpK57hTNCE0AzqAS5gAAuEID5KiWSiLPf4tp7YUjcSu4yLZzdi2IJyNXANcBlwAdAKzAHTwDhwDKEPywC+GZWHbPi7IKOvZIWguAnlr8BtwJ+AxDJeDYCPgF6Ed0hkh+Weov5mZLTHJMDeBjwYk0itYJtKTOpZML3SbYNfnYz2SBr0buARYENcFytdFvga2AGyT7p14Vcjoz3ShOgdKDuAi+pUewpMIDyCypvSreWGk9HdroOEV2F4A1hfTxGJCX2D5U7U/UzuD6NaXq49NRJhBsOjwMVLEtE4gaL4W5cV3IsxPEoizDT0ZLTHcSH6M/BWLLlVwpQKuPzhb+i8sRkv04Y/e5rvPigxtnM9trKU2k0D28A5LN3RsmXbrbFOU8DtQLpqfJqu97nh6TydmzvwWpOI8VDbxqbrkmz62yk+/Ps6yoe8KkeV/hHHfgrMNyrNEkBX1SAktgRs3T7ApV1rSWayiEkDLmLSJDNZLu1ay9btAyS2BEsEuWuZ99WKyRhgHeCcn8wGw/qbOnAS3jmfOwmP9Td1kNhQDduJcUwjyciS0RJXMMkWkPPUo/z4XFxZRhZII8mEwFCsT+f5xXTE7FAOteduItVaZodyhNPVZDeKccJGkxmsChIMOvTt6aRSzIP+7A9rRKWYp29PJ8GgsyqcVauZSADaj+IDTecWvBlD4e01HKjM07XtOOuuy+A2X0BYmib/8SxfvLWRYm8LdqZaCvkI/SDBci6nld0ze7KCLa4F3gSurR4MB5x1FnMhiCeor9hJiPKmWpbGp3EU2IbJFuTe5XfStbczLxgP7K0IPcCFDWhnJoFuMAek2/oNbWdku/WxHATejT1JPZcPvINysFYiK+gAFkXTK6H+MyhXADeseJ9fmrVDM6X080/+p1M2/yFsD1zjEIauEeMAqNpQE16oaKiqwfjYeLk+fuYl10HDq7DsBTavxs8o6FzFKez/dM3rLx9LjUyVxcb7yVkfzmpXFbACJURHIxgyxkyu1ml6qL0Z4YX4xl7Jfrrgm9Ov9bX/e++x1tHCgkQ11lgELGA4sBp3iHRbH5GDwJPAFLXo6KJnDmTh/aG2w2/3t47VSGQxs1zAE9U2s9pEjx3hXuBloCa7G1rxv8o3f/7SkUz/UFFWMqGRWMpHAqsDbl00KGotIXM7MawF7gKSS5oJJRospI7v+rD96Ikp8aV2EgrkVPW4OnIy6SVL9ZubvZgyaOVyYDfwl2oNqVWiXNEb231oTe+/BrzvK9Gy01MFyoiOKzIEmqsEfjGf/39U1yHgosJFUXhlFMl+z9E/nkvhVNHZsjux+9Caf77RnyzMBaJLmW4RrWAlB3Y4Uh13HLOA4wQjo6O2IRPNxVV4JuG5Et2SSelzjtFLzsZQ0NIZ8/2rx7K9+/paxqbKvyh4Bc4AFQxzau23Dow7FS+nHmfEUz05OqINH8+evXJPJVOuE93XkY4eSziaXcQpB2b+vZNt7+/8IPPl2OxPRMJ4dDsLzIho3hpzamJ6aqJ0ei6qtZAasmZ2OS1RyOMd6egBIzSFVoKj4y1Hnvhv+8cD02ZOkEmgIKITVnXKWDs1ksvNrgbTbRSZ46cypY50aWcllIsyKXvr8GTyi9f6WvePFGVQhO8EPW2NzI+OfV2pF2bDTgbg8D/aJeVUspd1BK3/G24u7/skO3+iYP3h3LdhI/B+AGodUpo8WKwoAAAAAElFTkSuQmCC",darkOrange:"data:image/png;base64,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czpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjIxNDZjMzUzLWIxZjItNGVjOC04NzQ3LTIwMGEyYWExM2ViMyIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2NGViNmI2Ni03Y2I2LTRkZGUtYTI3OS01MGY0ZWFiZGFhODAiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ODRhM2VjZC1kNGFmLTQ3NjItYjA1ZS04ODk2MGQ4ZTk0Y2MiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE5MDM3ODI2MTQiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxYzNjOGRkZi1kMjVkLTQ4YzQtYTAwYS0yMmU3ZDYwMzg1YjYiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjI1OjAzKzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PuhCAHgAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPGQOTjc4FAAAFdklEQVRYw82YW2gcZRTHf+eb2dlkc9lsrFYr2notfSgWxKKiog8VvIFI9UFQEaWtYPFJfREfRRSEeqlttViLD/WGisYXrShWpfWC1WpSN5eN3cZumkuTzWY3c/mOD9lI0WSTTXbVA8M8zMz3n//5zvl/5xyhxqb3ewYvaERpAvUAFzCABUIQH6GAHyvKa76tJbbUjMRW4+LbC7GsQbgCWA+sAs4AWoA8MAxkgEMo32LoxDO98oIN/xdk9IGUYEYvRrgduAW4Gogt4NMA+BroQHkfm+qW3aP6n5HRTSYG9hZga5lEwyKWKZVJvQCmQ3bZ4F8no5skAXov8BiwspwXizUL9APPgOyVXTr5r5HRzdKI1TsRngHOqlHuKTCI8hhG3padWqw7GX3IddDwcixvAefXUkTKhH7HcBfifi8vh1E1H1cfGkGYxPI4cM68RGw5zf3y3S7IuedgeZwgTNZ1Z3Sz46LRNcA7Zcmd25yGgPWP/M7q65toTLZSHBvn6OcFDm07n6g0n9oNAxsR54DsjBYs2251QWAbgFuBREX/tF3rc9+zA6xa3U5jSxwxHmpbueyqOOvvOM7rj67g1JfedFTNagngVtR+B0zUK8xiwLqKTmhcE3Dblk4uXbecRDKFmATgIiZBIpni0nXLuW1LJ41rgnmcvG6B59WiyRhgBeDM+UZipWHthnbcmDf7b8Y81m5oJ7GyErZTxjH1JCPzesu4ghtvBpkjH2X6uXFlAVEg9SMjhEAamFsyp4Yjcuks1s6uXdZacuksU8OVZDcC0mW8OpFRQqBruvqdwwpdDh+9cjaF0QHQv/2wRhRGB6afdzkVkKZxtDoyVaqZBKCHEXygcXafjhi63l3G9tIEGzYe4ZKrksSbzmCqMEz6mzE+eedC+juaiUYqhZCPchgkqKB4SzxntqQEO7oceBu4srIzHIitsMTOBOMJ1leCkxAMmEpRWt6Vg8BGTConOxZeSVdfzmwxHmpvRtkJnFmHcuYksBkxH8tO69e1nJEd1sdhP/BBuUippfnA+3jsr5ZI9TnzV33mFcB/DuEi4LpFr/PPZu3LkanES08fOltWnxe2Ba5xCEPXiHEAVG2oMS9UNFTVINOXKdamn3nQdSC8HMMeYPVS+hkFzQdObl9m2Zu7+xt6hkKx5fXktGumdNXyZQUKiPZGkDbGnFxqp+kh9kaUHeUTezHr6WRkxt/oa/toT39Lby6QqMoci4BJDB8vpTtEdlkflf3A08AQ1ejoTM8cyeRnudYD72Zb+qokMhNZLuCJaqtZaqDLLi0i7EHYDVTV7oZW/J9PNf3wanfycLoki5nQSFnKewKrnW5NNMhtKRDlt6EsB+4G4vM2/UrUNd5w5Pl028FfiuJL9SQUyKrqEXXkaNyLF2o3N9vUYKB0AbAduKFSQWqVKFv0+rYfXdbx4aB3qqQLDk8VKCKaUSQNmi0F/ujAwB9RTYeAMwoXabg2QvZ5jl4ym8Ip6FjgDm7/bdl7bw3Ec/lItEJyWyAS0RJWsmC7I9WM45hJHCfo6e21dZlozlju3pjnSnRT0tMXHdFzT8dQ0EJoTr2eSXXs7W/uG/pnwiswBZQw5NXaYw5knJKXVY8p8VSP9vZo3cezp1v2nniDK9FD7V70RMxoaganGJmJT0+0frbtt+RPfVN/EQnLo9sxYEREB6wxxweHhwYL4/mo2kSqi43c5zRH8GS7Fz1shMZQJTg41PzVU7+2fdNZNHlBTgI5ER20qkPG2qGebHZsSTpULzJH8slCe6ywrWTlrGTM3tw9Ef/xjUzLvp6idIlwQtBxa2Sit6+/VCvMuu0MwIE726RBSqlViaDli6Gm4t6e1MQveet3Z4+F9cD7Ewo4WRJBbaaSAAAAAElFTkSuQmCC",red:"data:image/png;base64,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293bv2fa/f0ASM5yljz/NiUAAA0aaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmI5YjA2YTAwLWZkOTQtNDc5MC1hNzIzLTlkMGUwNGRiNTRlNyIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1MTQ3ZGU5Yi1kOTA0LTRlNWYtYjIyYy0wZmMzOGRmMWI3ZGEiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4YzBjNTI2YS1lYTkyLTQxYWItODM5Yy05OWFhYTM0YjdlYzciCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE2NDAxNTU0MjYiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowMjQ4MDc5ZS1kMTYyLTQxZmItOGViYS1lMzY2NTRiNGRjMjYiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjIwOjQwKzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PkaovgIAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPFCiKn0kIAAAFfUlEQVRYw82YTWxc1RXHf+e+N2/GH+Px2IEEV02AgqIsIkwgoYS2ahepVGCBUOiCRRdsAAnECthErBBCICGFj4gqRQqBRSABUrVm1URtCSATJ5ASZCPHH0kGgx1/xJl5nvH7uIcFY4iIM/GzZyhHenqL994993/u+f/fOUeos+nNnkHCJoQWRD0UFzCARYhQCVB8NFWWTwNbT99SNxC3GZfIXg9sADYDWxCuRekEskARYQplFPgEOAr045ph6bXRzwKM3pEX5mduQLkHuAvYCqSW8GkIfAT0IBwknT8lH87o/w2M3mpSqL0LeLQKIrOMZSpVUC8hpkf6bPiTg9FbpBn0L8ATwLoqL5ZrFjgNPAeyV47p3E8GRjdLE6r3oTwHXF0n7ikwgfAEIvvlqJYbDkY3uw4a3YLyNrC2niJSBXQG4c+Ie0yORnGSj5OnRhzlUJ4ErrkikBAoAjPVe7ik4F6D8iRxlGvoyegmx4X4NwgHgM6a8fUyIfc8doZbf99Ca66N0uwF+v7tc3DnWoJK6gqep1C2g3NEjsdLlm03GXSbAe4GmmvGZ91vA3Y8P8aN6ztoyaYxxsPaNrbcnmbbvV/x9ONdnPnA+w71otaMcDfYPqDUmDQTUgjdNYPQsSHkgYf62di9mmwujzHNgIsxzWRzeTZ2r+aBh/rp2BDWDLLQjSzpf7VMMIpB6QKcy77Tuc6wdVsHbspbfJspj63bOuhcV8u3g9KFJtufWQbHakfLdQUv3YrI4qwQ+e65616Jr6mknE4KJgIGgctLZnEq5vRgAWsXLyKttZweLFCcqiW7cdVP1DgwQoQwUNPJxIDDG7vXMDszBvqjDWvM7MwYb+xew8SAUzNowgCSDEwyNVMJQU8AAdC06DvBtOG/76xirlLi3u0nufn2HJmWTir+FJ9+PMu7B66nr6eVYLpWCgUoJ0DCGoq3wv/MbXkhmlkN7Ad+XTMY4kBTl6XlKnA8IQ4U/xyUx8wlB3ZpKvcC23Hz49K79Ep6GeWM8VB7J8pfgasaUM6cAx5EzPvSZ4OGljNy1AYIh4C/L6lASWYBcBCHQ0mBJOfM94rk+WjwAsKvgN8te51LK7kPpm3zK89OrZH1v4zaQ9c4RJFrxDgAqjbSlBcpGqlqODoyWq5TP1OtnoU9wPqV9DMKWlRnfJ+/6q3XKpmhSRVbXU8uuhb6Hq1eVsBHdDiGQWPMuZV1mpuMB/aPCK8CXcsMjs6pufCm3/7PPZXs8LhKnJBjMTCH4f2VdIfIcRsgcgh4FpgkiY4u9Mwqc4fn2468M58dSQhkIbNcwBPVNrPSRJdjWgb2AK8BidrdSCX4PGw5/re53IlBK8uZ0EhVyodCq/1uXTTIzfrExZ0oq4H7gfQSmv54IMqcfNFv7/0ilkCSg1CgoKon1ZEv017ar9/cbEvGEFeuQ9mF8IdaBamFuBB7I7tKq3r+EXjnK0tPTxUoIzqqyCBooRIGM2NjX8d1HQIuKFys0cYY2eeJ3riYwinorHUndvmr3nt7Pj1eVNEa5LZALKIVrBTAnopVRx3HzOE44dDwsG3IRHPBxrtTnkv8p5yjLzvoLy72oaC+mvOvz+V79pZbRyYvJbwC80AFQ1GtPevAqFPxCuoxL57ql8ND2vDx7MVW2JTOuMQPdxDvSInmF/yU1ZT+Nd92eGcp97+RH4BE1XHHLDAtomPWmK8mpiYn/AvFOCmRGmLTm53WOOKpDhM/YqApQsLe+dYPnym1f9xvTVGQc8C4iE5Y1Ulj7eRQoTC7Ih1qFJiTQc7vwN9ZUbk6Z+ydp6L0Z2+Ws/uGrAyI8I2gF6yR0vDI6Uq9fDbsZACO3NQuGa3kr3XC7H+ClvJeP1/6IrbBqbNno0b4+xbMlmARngcRbAAAAABJRU5ErkJggg==",turquoiseBlue:"data:image/png;base64,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/MUi8H5G35QHBm+BvjV3bu1znD4AWZpV+gY4OARGS5S97vHu3u65/XunPb8fN2tyj8UDOK0AAA0aaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjEwNGNlNWFhLTE1YzctNGI4Yi1iOGU1LTFmYWQyNWFiYzBhZCIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkNDMyZTY1Zi0xOThhLTQxM2EtYWYyMy1jNzhlNzczNGRlN2QiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyNzExODVkMi03MWZiLTRhZDMtYTJmMi1iNjM3OWU3MDc1OTEiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE4NjYyMzgzMjQiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NGFiYzNkYS1lZWJiLTRlZjctYjdjNS04ZDRjODY5OGVjODMiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjI0OjI2KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pj0tlUwAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPGBru/VeEAAAABmJLR0QA/wD/AP+gvaeTAAAFO0lEQVRYw9WYe2xTVRzHTx97dYS5B1UHa+/tY12dDoOKWyIGlfgHkCkSNTHGwHxA3NiAP/A5x4CMKEzdYL29YyAyBxKQZbI+NvYIaowaH9Ogi2GRbGjcFrbBNrq2a2/9nq5LCFnbbfSOeZJPTs/t6Tm/7/39zu+cU0IiXc7WSImNX0BsZiVYAhigmah5tHklsZrjSYtJSuZtaeSiiJU3gHUwfC9oARfBIHBP1DzaPH1eRuzmp0E6aTgSNX9EWMwSvOkMGPgG+CpguG8a0H7nA78zkMYqye0V0lYXDSHrYUw7cE5TxM04/b+38+vJ+RPRt0eIjVeAAhhyCQizFDKJEBjndaCY49Di4+CRlzFxfwSE3Ciol9i4DSBujoRUy7HIszFxdwSF3CioBy8qm1g5ufhirHwyJqwHrrDGWTlg8hFL1URN2+EF0XFPkyYuSWwhUVgnT2CygXBG3dFcM7bz1/au1u7OK9/93eWidUlHe1dCc810EsUAsXOPQZCI3rGZ6Wb4EXAEM0SCUFnZduz6T/09l4bHXYOCz+f0+XxeWg+7XYM/4vnKtlqHJHSIOrAHlYMFYmawRNCKycaDGZLVfMRdf/nPDpfXM+abotDnpy93dtzXfNgdZg+im2uimJ6h66UTeIMZsrat1jvkdPRRb/imLt4hl6N3DfqFEIPvOMzDJYspJsWfbUKEyFNttcKoyzkKo4UgYoRRt3OE9guT1br984nsmQ7gCWbIipaj4xeu9v/hFQTPlG7B89+u9v9O+4UQQ8f/BSlaVM8kgBOhji4p9mpvwQ+Wfwddjp6bQw2u8g44HT3535/tTUa/0Eccvg4sFDE1m2PBZkx2LVRqVcLQvG/PDDX1/tVxze38x+UZH6O1He28b764qgwtxOcf327eBGLFE9NikiD3qzDZhVBJgCJH3KubDnkfbD4s5Jw74qM1bcvDnxq8/vHt1SrS9InIJ2m7OQ4UYsKhCB9lJqHj0gPsHJzPvsS9w8rRRPDptI40M8PlH9fOJ5M5K008rsZmIwi5gc4QN9Zja8zn+5epch9PTFepU1iGuVunVqeyS9g0iv8zy96l0WiSjIsXx28iJEJhaONkMGB5YP14bkmI1SzIz1T0pRa9VKnNzCjUMcwWUAS2BtgWYLJN+xTo1OyrOhW7xsAwqnSGkd3i+uGjkT5Xw6DLt3AdEKQNB4YXbdtwQpuVuRtG7pwhxWA7vJgRib0nDuSDvtkIkjYcHE3aVWjRLL9/zyyETPK2Vq3OidAaOhiPDLcbxo3MRIik0eReWPnO15pHHiqbpYhS6hkNw7wAz0To6GM5hAzH3wkDa6b7x4bEwnkUfMnP6idX7Nex7GxElIDNerV6hU6jSdbp9RHck2w0w/FaGGoJm7KtnCfmWNlF1fOrK3Q6bekMRFABO7QM8yxewFLUi+5JSxPpAmcxy0gjt1Rytir4NcHKCfJTH/al5j1j1hr0pWEML55YD+x2GP6cVqNZZjQYEvUsG4vP4v8jKju5L1p6qnytxGKa6qogyOorBpVbXvxMe69xdxABb9I0DAGvIIRWp7NsBsJIoWVZKfaXuf+jMKp2b6z8+Adb4aErNwpCCh5J2pnfoH0ga08g7invBfaQjXjjuQifhyEgLdNolJP5UqR17y+QnSwvk1i565OZK6F8RzubvWwvDH8LvKZnmHXY8HKws+sNLJtI5muJ/7hYElOzJ1V+fN9R7CVDClPJOVXuqo06vS4HQjTwgDKDZRXk/1JiD7wrieFLk6T1lczCXUVK7aPZinS9XrTw+Q+Tql7SUmvGuQAAAABJRU5ErkJggg==",defaultOffset:[-25.5,-32]},vt=n(12),Ct=n.n(vt),It=n(13),bt=n.n(It),wt=n(32),Et=n.n(wt),_t=n(33),St=n.n(_t),Mt=n(15),Pt=n.n(Mt),xt=n(16),kt=n.n(xt),Gt=n(34),Rt=n.n(Gt),Tt=n(66),Ot=n.n(Tt),Lt=n(67),Dt=n.n(Lt),Nt=lt.getLogger("styling");Ct.a.prototype.setPropertyFill=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=e.getFill();if(t){var n=t.getColor();if(Array.isArray(n)){var o="rgba(";o+=n[0]+",",o+=n[1]+",",o+=n[2]+",",n=o+=n[3]+")"}if(yt.isRGB(n)){var i=yt.rgbaToHex(n);this.set("fill",i.hex),this.set("fill-opacity",i.opacity)}else this.set("fill",n),this.set("fill-opacity",1)}}},Ct.a.prototype.setPropertyStroke=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=e.getStroke();if(t){var n=t.getColor();if(Array.isArray(n)){var o="rgba(";o+=n[0]+",",o+=n[1]+",",o+=n[2]+",",n=o+=n[3]+")"}if(yt.isRGB(n)){var i=yt.rgbaToHex(n);this.set("stroke",i.hex),this.set("stroke-opacity",i.opacity)}else this.set("stroke",n),this.set("stroke-opacity",1);this.set("stroke-width",t.getWidth())}}},Ct.a.prototype.setPropertyLabel=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=void 0!==this.get("name");if(e.getText()&&t){var n=e.getText().getFill();if(n){var o=n.getColor();if(Array.isArray(o)){var i="rgba(";i+=o[0]+",",i+=o[1]+",",i+=o[2]+",",o=i+=o[3]+")"}if(yt.isRGB(o)){var r=yt.rgbaToHex(o);this.set("label-fill",r.hex),this.set("label-fill-opacity",r.opacity)}else this.set("label-fill",o),this.set("label-fill-opacity",1)}var a=e.getText().getStroke();if(a){var s=a.getColor();if(Array.isArray(s)){var l="rgba(";l+=s[0]+",",l+=s[1]+",",l+=s[2]+",",s=l+=s[3]+")"}if(yt.isRGB(s)){var c=yt.rgbaToHex(s);this.set("label-stroke",c.hex),this.set("label-stroke-opacity",c.opacity)}else this.set("label-stroke",s),this.set("label-stroke-opacity",1);this.set("label-stroke-width",a.getWidth())}this.set("label-font",e.getText().getFont()||jt.DEFAULT_TEXT.font),this.set("label-textAlign",e.getText().getTextAlign()||jt.DEFAULT_TEXT.textAlign)}}},Ct.a.prototype.setPropertyMarker=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=e.getImage();if(t)if(t instanceof St.a){var n=t.getColor();if(Array.isArray(n)){var o="rgba(";o+=n[0]+",",o+=n[1]+",",o+=n[2]+",",n=o+=n[3]+")"}if(n){var i=yt.rgbaToHex(n);this.set("marker-color",i.hex)}var r=t.getScale();switch(Math.round(2*r)/2){case 0:case.5:this.set("marker-size","small");break;case 1:this.set("marker-size","medium");break;case 1.5:case 2:this.set("marker-size","large")}var a=t.getSrc();a&&this.set("marker-symbol",a),this.unset("circle-fill"),this.unset("circle-fill-opacity"),this.unset("circle-stroke"),this.unset("circle-stroke-width"),this.unset("circle-stroke-opacity"),this.unset("circle-radius")}else{var s=t.getFill();if(s){var l=s.getColor();if(Array.isArray(l)){var c="rgba(";c+=l[0]+",",c+=l[1]+",",c+=l[2]+",",l=c+=l[3]+")"}if(yt.isRGB(l)){var u=yt.rgbaToHex(l);this.set("circle-fill",u.hex),this.set("circle-fill-opacity",u.opacity)}else this.set("circle-fill",l),this.set("circle-fill-opacity",1)}var d=t.getStroke();if(d){var p=d.getColor();if(Array.isArray(p)){var h="rgba(";h+=p[0]+",",h+=p[1]+",",h+=p[2]+",",p=h+=p[3]+")"}if(yt.isRGB(p)){var g=yt.rgbaToHex(p);this.set("circle-stroke",g.hex),this.set("circle-stroke-opacity",g.opacity)}else this.set("circle-stroke",p),this.set("circle-stroke-opacity",1);this.set("circle-stroke-width",d.getWidth())}var m=t.getRadius();this.set("circle-radius",m)}}};var jt={APPLY_CONVERT_GEOM_GPX:!0,DEFAULT_ICON:{src:At.lightOrange,anchor:[.5,1],scale:1},DEFAULT_CIRCLE:{radius:10,fill:{opacity:1,color:[0,0,0,1]},stroke:{width:1,opacity:1,color:[0,0,0,1]}},DEFAULT_STROKE:{width:5,opacity:1,color:[250,250,250,1]},DEFAULT_FILL:{opacity:1,color:[0,0,0,1]},DEFAULT_TEXT:{font:"16px sans",textAlign:"left",stroke:{color:[250,250,250,1],width:5,opactity:1},fill:{opacity:1,color:[0,0,0,1]}},getListTags:function(){return["type","fill","fill-opacity","stroke","stroke-opacity","stroke-width","circle-fill","circle-fill-opacity","circle-stroke","circle-stroke-opacity","circle-stroke-width","circle-radius","marker-symbol","marker-color","marker-size","label-fill","label-fill-opacity","label-stroke","label-stroke-width","label-stroke-opacity","label-font","label-textAlign"]},defineStyleFromProperties:function(e){var t=null,n={},o=null;if(e.get("marker-color")||e.get("marker-size")||e.get("marker-symbol")){(o={}).src=this.DEFAULT_ICON.src,o.anchor=this.DEFAULT_ICON.anchor;var i=e.get("marker-symbol");i&&-1!==i.search("data:image/png;base64")&&(o.src=i);var r=e.get("marker-color");yt.isHex(r)&&(o.color=yt.hexToRgba(r,1));var a=e.get("marker-size");if(a)switch(a){case"small":o.scale=.5;break;case"medium":o.scale=1;break;case"large":o.scale=1.5;break;default:o.scale=this.DEFAULT_ICON.scale}}var s=null;(e.get("stroke")||e.get("stroke-opacity")||e.get("stroke-width"))&&((s={}).color=yt.hexToRgba(e.get("stroke"),+e.get("stroke-opacity")||this.DEFAULT_STROKE.opacity),s.width=+e.get("stroke-width")||this.DEFAULT_STROKE.width);var l=null;(e.get("fill")||e.get("fill-opacity"))&&((l={}).color=yt.hexToRgba(e.get("fill"),+e.get("fill-opacity")||this.DEFAULT_FILL.opacity));var c=null,u=null,d=""!==e.get("name");d&&((e.get("label-fill")||e.get("label-fill-opacity"))&&((u={}).color=yt.hexToRgba(e.get("label-fill"),+e.get("label-fill-opacity")||this.DEFAULT_TEXT.fill.opacity)),(e.get("label-stroke")||e.get("label-stroke-opacity")||e.get("label-stroke-width"))&&((c={}).color=yt.hexToRgba(e.get("label-stroke"),+e.get("label-stroke-opacity")||this.DEFAULT_TEXT.stroke.opacity),c.width=+e.get("label-stroke-width")||this.DEFAULT_TEXT.stroke.width));var p=e.get("circle-radius")||this.DEFAULT_CIRCLE.radius,h=null;(e.get("circle-stroke")||e.get("circle-stroke-opacity")||e.get("circle-stroke-width"))&&((h={}).color=yt.hexToRgba(e.get("circle-stroke"),+e.get("circle-stroke-opacity")||this.DEFAULT_CIRCLE.stroke.opacity),h.width=+e.get("circle-stroke-width")||this.DEFAULT_CIRCLE.stroke.width);var g=null;(e.get("circle-fill")||e.get("circle-fill-opacity"))&&((g={}).color=yt.hexToRgba(e.get("circle-fill"),+e.get("circle-fill-opacity")||this.DEFAULT_CIRCLE.fill.opacity));var m=e.getGeometry().getType();switch(m){case"Circle":case"Point":case"MultiPoint":var f=!1,y={};if(h&&(y.stroke=new kt.a(h)),g&&(y.fill=new Pt.a(g)),0!==Object.keys(y).length&&(f=!0,y.radius=+p,n.image=new Et.a(y)),o&&(n.image=new St.a(o)),d){var A={};if(c&&(A.stroke=new kt.a(c)),u&&(A.fill=new Pt.a(u)),0!==Object.keys(A).length)A.text=e.get("name"),A.textAlign=e.get("label-textAlign")||this.DEFAULT_TEXT.textAlign,A.font=e.get("label-font")||this.DEFAULT_TEXT.font,n.text=new Rt.a(Object.assign({},this.DEFAULT_TEXT,A));else if(o||f){var v=new Rt.a(Object.assign({},this.DEFAULT_TEXT,{fill:new Pt.a(this.DEFAULT_TEXT.fill),stroke:new kt.a(this.DEFAULT_TEXT.stroke)}));if(v){var C=v.clone();C.setText(e.get("name")),n.text=C}}}break;case"Polygon":case"MultiPolygon":s&&(n.stroke=new kt.a(s)),l&&(n.fill=new Pt.a(l));break;case"LineString":case"MultiLineString":if(s&&(n.stroke=new kt.a(s)),this.APPLY_CONVERT_GEOM_GPX&&l){var I=e.get("type");if(I&&("Polygon"===I||"MultiPolygon"===I)){n.fill=new Pt.a(l);var b=e.clone(),w="LineString"===m?Ot.a:Dt.a;e.setGeometry(new w([b.getGeometry().getCoordinates()]))}}}return 0!==Object.keys(n).length&&(t=new bt.a(n)),t},defineStyleFunctionByDefault:function(e){if(!e)return[];if(0===Object.keys(e).length)return[];return function(t,n){var o=null;switch(t.getGeometry().getType()){case"Point":case"MultiPoint":var i={};if(e.getImage()&&(i.image=e.getImage()),e.getText()&&t.get("name")){var r=e.getText().clone();r.setText(t.get("name")),i.text=r}o=new bt.a(i);break;case"Circle":var a={},s={};if(e.getFill()&&(s.fill=e.getFill()),e.getStroke()&&(s.stroke=e.getStroke()),e.getText()&&t.get("name")){var l=e.getText().clone();l.setText(t.get("name")),a.text=l}0!==Object.keys(s).length&&(s.radius=3,a.image=new Et.a(s)),o=new bt.a(a);break;case"Polygon":case"MultiPolygon":var c={};e.getFill()&&(c.fill=e.getFill()),e.getStroke()&&(c.stroke=e.getStroke()),o=new bt.a(c);break;case"LineString":case"LinearRing":case"MultiLineString":var u={};e.getStroke()&&(u.stroke=e.getStroke()),o=new bt.a(u)}return[o]}},definePropertiesFromStyleByType:function(e){switch(e.getGeometry().getType()){case"Point":case"MultiPoint":e.setPropertyMarker(),e.setPropertyLabel();break;case"LineString":case"MultiLineString":e.setPropertyStroke();break;case"Polygon":case"MultiPolygon":e.setPropertyStroke(),e.setPropertyFill()}},definePropertiesFromStyle:function(e){var t=e.getStyle()||e.getStyleFunction();if(t){if("function"==typeof t){var n=t.call(this,e,0);if(!n||0===n.length)return;t=Array.isArray(n)?n[0]:n,e.setStyle(t)}this.definePropertiesFromStyleByType(e)}},defineTagFromStyle:function(e,t){return Nt.trace("todo..."),null}},Ut=jt;function Bt(e){return(Bt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var Ft=lt.getLogger("parser"),zt={parse:function(e){var t=null,o="undefined"!=typeof window?window:null;"object"===("undefined"==typeof exports?"undefined":Bt(exports))&&null===window?t=(new(0,n(62).DOMParser)).parseFromString(e,"text/xml"):o.DOMParser?t=(new o.DOMParser).parseFromString(e,"text/xml"):o.ActiveXObject?((t=new o.ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e)):Ft.log("Incompatible environment for DOM Parser !");var i=t.querySelector("parsererror");return i?(console.error(i),null):(Ft.trace(t),t)},toString:function(e){var t=(new XMLSerializer).serializeToString(e);return Ft.trace(t),t},format:function(e){for(var t="",n=(e=e.replace(/(>)\s*(<)(\/*)/g,"$1\n$2$3").replace(/ *(.*) +\n/g,"$1\n").replace(/(<.+>)(.+\n)/g,"$1\n$2")).split("\n"),o=0,i="other",r={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0},a=0;a/)),c=Boolean(s.match(/<\/.+>/)),u=Boolean(s.match(/<[^!].*>/)),d=l?"single":c?"closing":u?"opening":"other",p=i+"->"+d;i=d;var h="";o+=r[p];for(var g=0;gclosing"===p?t=t.substr(0,t.length-1)+s+"\n":t+=h+s+"\n"}return Ft.trace(t),t}};function Vt(e){return(Vt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var qt={detectSupport:function(){var e=!0,t=window.navigator.userAgent.toLowerCase();return-1===t.indexOf("iphone")&&-1===t.indexOf("ipod")&&-1===t.indexOf("ipad")&&-1===t.indexOf("android")&&-1===t.indexOf("mobile")&&-1===t.indexOf("blackberry")&&-1===t.indexOf("tablet")&&-1===t.indexOf("phone")&&-1===t.indexOf("touch")||(e=!1),-1===t.indexOf("msie")&&-1===t.indexOf("trident")||(e=!0),e},assign:function(e,t){for(var n in e=e||{},t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},mergeParams:function(e,t,n){if(e&&t)for(var o in void 0===n&&(n=!0),t)t.hasOwnProperty(o)&&("object"===Vt(t[o])?e.hasOwnProperty(o)?this.mergeParams(e[o],t[o],n):e[o]=t[o]:e.hasOwnProperty(o)?n&&(e[o]=t[o]):e[o]=t[o])}},Wt=lt.getLogger("extended KML format"),Ht=function(e){function t(n){if(!(this instanceof t))throw new TypeError("ERROR CLASS_CONSTRUCTOR");n=n||{},this.source=null,this.extensions=n.extensions||null,n.defaultStyle&&!Array.isArray(n.defaultStyle)&&(n.defaultStyle=[n.defaultStyle]),null!==n.defaultStyle&&void 0!==n.defaultStyle||(n.defaultStyle=[]),e.call(this,n)}function n(e,t,n){for(var o="#document"===e.nodeName?e.childNodes[0].childNodes:e.childNodes,i=o,r=0;r)\s*(<)/g,"$1$2"),null===(i=zt.parse(a)))return r;function s(e){var t="";t+=e.substr(6,2),t+=e.substr(4,2),t+=e.substr(2,2);for(var n=parseInt(t,16).toString(16),o="",i=n.length||0,r=0;r<6-i;r++)o+="0";return n="#"+o+n}var l=function(e,t){if(Wt.trace("label with style :",t),e){for(var n=e.getProperties().name,o=s("ff000000"),i="#FFFFFF",r=0,a="Sans",l="16px",c=null,u=5,d="#000000",p="#ffffff",h=1,g=!1,m=!1,f=t.childNodes,y=0;yt&&(o=!1),o&&p&&pt?1:er&&(c-s)*(r-l)-(i-s)*(u-l)>0&&a++:u<=r&&(c-s)*(r-l)-(i-s)*(u-l)<0&&a--,s=c,l=u}return 0!==a}function Xn(e,t,n,o,i,r){if(0===n.length)return!1;if(!Kn(e,t,n[0],o,i,r))return!1;for(var a=1,s=n.length;aC&&Xn(e,t,n,o,c=(u+d)/2,g)&&(v=c,C=I),u=d}return isNaN(v)&&(v=i[r]),a?(a.push(v,g,C),a):[v,g,C]}var $n={RADIANS:"radians",DEGREES:"degrees",FEET:"ft",METERS:"m",PIXELS:"pixels",TILE_PIXELS:"tile-pixels",USFEET:"us-ft"};var eo={};eo[$n.RADIANS]=6370997/(2*Math.PI),eo[$n.DEGREES]=2*Math.PI*6370997/360,eo[$n.FEET]=.3048,eo[$n.METERS]=1,eo[$n.USFEET]=1200/3937;var to=$n,no=function(){function e(e){this.code_=e.code,this.units_=e.units,this.extent_=void 0!==e.extent?e.extent:null,this.worldExtent_=void 0!==e.worldExtent?e.worldExtent:null,this.axisOrientation_=void 0!==e.axisOrientation?e.axisOrientation:"enu",this.global_=void 0!==e.global&&e.global,this.canWrapX_=!(!this.global_||!this.extent_),this.getPointResolutionFunc_=e.getPointResolution,this.defaultTileGrid_=null,this.metersPerUnit_=e.metersPerUnit}return e.prototype.canWrapX=function(){return this.canWrapX_},e.prototype.getCode=function(){return this.code_},e.prototype.getExtent=function(){return this.extent_},e.prototype.getUnits=function(){return this.units_},e.prototype.getMetersPerUnit=function(){return this.metersPerUnit_||eo[this.units_]},e.prototype.getWorldExtent=function(){return this.worldExtent_},e.prototype.getAxisOrientation=function(){return this.axisOrientation_},e.prototype.isGlobal=function(){return this.global_},e.prototype.setGlobal=function(e){this.global_=e,this.canWrapX_=!(!e||!this.extent_)},e.prototype.getDefaultTileGrid=function(){return this.defaultTileGrid_},e.prototype.setDefaultTileGrid=function(e){this.defaultTileGrid_=e},e.prototype.setExtent=function(e){this.extent_=e,this.canWrapX_=!(!this.global_||!e)},e.prototype.setWorldExtent=function(e){this.worldExtent_=e},e.prototype.setGetPointResolution=function(e){this.getPointResolutionFunc_=e},e.prototype.getPointResolutionFunc=function(){return this.getPointResolutionFunc_},e}();var oo="cosh"in Math?Math.cosh:function(e){var t=Math.exp(e);return(t+1/t)/2};"log2"in Math&&Math.log2;function io(e,t,n){return e+n*(t-e)}var ro=function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function o(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new o)}}(),ao=6378137*Math.PI,so=[-ao,-ao,ao,ao],lo=[-180,-85,180,85],co=6378137*Math.log(Math.tan(Math.PI/2)),uo=function(e){function t(t){return e.call(this,{code:t,units:to.METERS,extent:so,global:!0,worldExtent:lo,getPointResolution:function(e,t){return e/oo(t[1]/6378137)}})||this}return ro(t,e),t}(no),po=[new uo("EPSG:3857"),new uo("EPSG:102100"),new uo("EPSG:102113"),new uo("EPSG:900913"),new uo("http://www.opengis.net/def/crs/EPSG/0/3857"),new uo("http://www.opengis.net/gml/srs/epsg.xml#3857")];function ho(e,t,n){var o=e.length,i=n>1?n:2,r=t;void 0===r&&(r=i>2?e.slice():new Array(o));for(var a=0;aco?s=co:s<-co&&(s=-co),r[a+1]=s}return r}function go(e,t,n){var o=e.length,i=n>1?n:2,r=t;void 0===r&&(r=i>2?e.slice():new Array(o));for(var a=0;a>1)],t))<0?a=o+1:(s=o,l=!i);return l?a:~a}(h,y);A<0?(l=(y-h[-A-2])/(h[-A-1]-h[-A-2]),s=t+(-A-2)*o):s=t+A*o}var v=a>1?a:2,C=r||new Array(v);for(g=0;g=.05){for(var n="",o=e.split("\n"),i=Vo.slice(0,Math.round(t/.1)),r=0,a=o.length;r0&&(n+="\n"),n+=o[r].split("").join(i);return n}return e}function Wo(){return zo||(zo=Fo(1,1).getContext("2d")),zo}function Ho(e,t){return Wo().measureText(e).width+(e.length-1)*t}var Yo={};No.labelCache&&jo(No.labelCache,"clear",(function(){Yo={}}));var Jo,Zo,Ko=Do.e.isFunction,Xo=Do.e.convertFunction,Qo=Do.c.isExpression,$o=Do.c.createPropertyExpression,ei={Point:1,MultiPoint:1,LineString:2,MultiLineString:2,Polygon:3,MultiPolygon:3},ti={center:[.5,.5],left:[0,.5],right:[1,.5],top:[.5,0],bottom:[.5,1],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]},ni={},oi={zoom:0};function ii(e,t,n,o,i,r){var a=e.id;r||(r={},console.warn("No functionCache provided to getValue()")),r[a]||(r[a]={});var s=r[a];if(!s[n]){var l=(e[t]||ni)[n],c=Do.f["".concat(t,"_").concat(e.type)][n];void 0===l&&(l=c.default);var u=Qo(l);if(!u&&Ko(l)&&(l=Xo(l,c),u=!0),u){var d=function(e,t){var n=$o(e,t);if("error"===n.result)throw new Error(n.value.map((function(e){return"".concat(e.key,": ").concat(e.message)})).join(", "));return n.value}(l,c);s[n]=d.evaluate.bind(d)}else"color"==c.type&&(l=Do.a.parse(l)),s[n]=function(){return l}}return oi.zoom=o,s[n](oi,i)}function ri(e,t){if(e){if(0===e.a||0===t)return;var n=e.a;return t=void 0===t?1:t,"rgba("+Math.round(255*e.r/n)+","+Math.round(255*e.g/n)+","+Math.round(255*e.b/n)+","+n*t+")"}return e}var ai=/^([^]*)\{(.*)\}([^]*)$/;function si(e,t){var n;do{if(n=e.match(ai)){var o=t[n[2]]||"";e=n[1]+o+n[3]}}while(n);return e}var li=!1;var ci=function(e,t,n,o,i,r,a){if(void 0===o&&(o=Bo),"string"==typeof t&&(t=JSON.parse(t)),8!=t.version)throw new Error("glStyle version 8 required.");var s,l;if(r)if("undefined"!=typeof Image){var c=new Image;c.crossOrigin="anonymous",c.onload=function(){s=c,l=[c.width,c.height],e.changed(),c.onload=null},c.src=r}else if("undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope){var u=self;u.postMessage({action:"loadImage",src:r}),u.addEventListener("message",(function(e){"imageLoaded"===e.data.action&&e.data.src===r&&(s=e.data.image,l=[s.width,s.height])}))}for(var d,p=Object(Do.b)(t.layers),h={},g=[],m={},f={},y={},A={},v=0,C=p.length;v=C.maxzoom)return"continue";var E=C.filter;if(!E||function(e,t,n,o,i){return i||console.warn("No filterCache provided to evaluateFilter()"),e in i||(i[e]=Object(Do.d)(t).filter),oi.zoom=o,i[e](oi,n)}(I,E,p,c,A)){u=C;var _=void 0,S=void 0,k=void 0,G=void 0,R=void 0,T=void 0,O=v.index;if(3==d&&("fill"==C.type||"fill-extrusion"==C.type))if(S=ii(C,"paint",C.type+"-opacity",c,p,y),C.type+"-pattern"in w){var L=ii(C,"paint",C.type+"-pattern",c,p,y);if(L){var D="string"==typeof L?si(L,n):L.toString();if(s&&i&&i[D]){++g,(T=x[g])&&T.getFill()&&!T.getStroke()&&!T.getText()||(T=new bt.a({fill:new Pt.a}),x[g]=T),k=T.getFill(),T.setZIndex(O);var N=f[he=D+"."+S];if(!N){var j=Fo((ge=i[D]).width,ge.height),U=j.getContext("2d");U.globalAlpha=S,U.drawImage(s,ge.x,ge.y,ge.width,ge.height,0,0,ge.width,ge.height),N=U.createPattern(j,"repeat"),f[he]=N}k.setColor(N)}}}else(_=ri(ii(C,"paint",C.type+"-color",c,p,y),S))&&(C.type+"-outline-color"in w&&(R=ri(ii(C,"paint",C.type+"-outline-color",c,p,y),S)),R||(R=_),++g,(T=x[g])&&T.getFill()&&T.getStroke()&&!T.getText()||(T=new bt.a({fill:new Pt.a,stroke:new kt.a}),x[g]=T),(k=T.getFill()).setColor(_),(G=T.getStroke()).setColor(R),G.setWidth(1),T.setZIndex(O));if(1!=d&&"line"==C.type){_=!("line-pattern"in w)&&"line-color"in w?ri(ii(C,"paint","line-color",c,p,y),ii(C,"paint","line-opacity",c,p,y)):void 0;var B=ii(C,"paint","line-width",c,p,y);_&&B>0&&(++g,(T=x[g])&&T.getStroke()&&!T.getFill()&&!T.getText()||(T=new bt.a({stroke:new kt.a}),x[g]=T),(G=T.getStroke()).setLineCap(ii(C,"layout","line-cap",c,p,y)),G.setLineJoin(ii(C,"layout","line-join",c,p,y)),G.setMiterLimit(ii(C,"layout","line-miter-limit",c,p,y)),G.setColor(_),G.setWidth(B),G.setLineDash(w["line-dasharray"]?ii(C,"paint","line-dasharray",c,p,y).map((function(e){return e*B})):null),T.setZIndex(O))}var F=!1,z=null,V=0,q=void 0,W=void 0,H=void 0;if((1==d||2==d)&&"icon-image"in b){var Y=ii(C,"layout","icon-image",c,p,y);if(Y){q="string"==typeof Y?si(Y,n):Y.toString();var J=void 0;if(s&&i&&i[q]){var Z=ii(C,"layout","icon-rotation-alignment",c,p,y);if(2==d){var K=e.getGeometry();if(K.getFlatMidpoint||K.getFlatMidpoints){var X=K.getExtent();if(Math.sqrt(Math.max(Math.pow((X[2]-X[0])/t,2),Math.pow((X[3]-X[1])/t,2)))>150){var Q="MultiLineString"===K.getType()?K.getFlatMidpoints():K.getFlatMidpoint();if(Zo||(Zo=new To("Point",Jo=[NaN,NaN],[],{},null)),J=Zo,Jo[0]=Q[0],Jo[1]=Q[1],"line"===(ke=ii(C,"layout","symbol-placement",c,p,y))&&"map"===Z)for(var $=K.getStride(),ee=K.getFlatCoordinates(),te=0,ne=ee.length-$;te=se&&Q[0]<=ce&&Q[1]>=le&&Q[1]<=ue){V=Math.atan2(ie-ae,re-oe);break}}}}}if(2!==d||J){var de=ii(C,"layout","icon-size",c,p,y),pe=void 0!==w["icon-color"]?ii(C,"paint","icon-color",c,p,y):null;if(!pe||0!==pe.a){var he=q+"."+de;if(null!==pe&&(he+="."+pe),!(W=m[he])){var ge=i[q];W=new St.a({color:pe?[255*pe.r,255*pe.g,255*pe.b,pe.a]:void 0,img:s,imgSize:l,size:[ge.width,ge.height],offset:[ge.x,ge.y],rotateWithView:"map"===Z,scale:de/ge.pixelRatio}),m[he]=W}}W&&(++g,(T=x[g])&&T.getImage()&&!T.getFill()&&!T.getStroke()||(T=new bt.a,x[g]=T),T.setGeometry(J),W.setRotation(V+Uo(ii(C,"layout","icon-rotate",c,p,y))),W.setOpacity(ii(C,"paint","icon-opacity",c,p,y)),W.setAnchor(ti[ii(C,"layout","icon-anchor",c,p,y)]),T.setImage(W),z=T.getText(),T.setText(void 0),T.setZIndex(O),F=!0,H=!1)}else H=!0}}}if(1==d&&"circle-radius"in w){++g,(T=x[g])&&T.getImage()&&!T.getFill()&&!T.getStroke()||(T=new bt.a,x[g]=T);var me=ii(C,"paint","circle-radius",c,p,y),fe=ri(ii(C,"paint","circle-stroke-color",c,p,y),ii(C,"paint","circle-stroke-opacity",c,p,y)),ye=ri(ii(C,"paint","circle-color",c,p,y),ii(C,"paint","circle-opacity",c,p,y)),Ae=ii(C,"paint","circle-stroke-width",c,p,y),ve=me+"."+fe+"."+ye+"."+Ae;(W=m[ve])||(W=new Et.a({radius:me,stroke:fe&&Ae>0?new kt.a({width:Ae,color:fe}):void 0,fill:ye?new Pt.a({color:ye}):void 0}),m[ve]=W),T.setImage(W),z=T.getText(),T.setText(void 0),T.setGeometry(void 0),T.setZIndex(O),F=!0}var Ce=void 0;if("text-field"in b)Ce=si(ii(C,"layout","text-field",c,p,y).toString(),n).trim(),S=ii(C,"paint","text-opacity",c,p,y);if(Ce&&S&&!H){F||(++g,(T=x[g])&&T.getText()&&!T.getFill()&&!T.getStroke()||(T=new bt.a,x[g]=T),T.setImage(void 0),T.setGeometry(void 0)),T.getText()||T.setText(z||new Rt.a({padding:[2,2,2,2]})),z=T.getText();var Ie=Math.round(ii(C,"layout","text-size",c,p,y)),be=ii(C,"layout","text-font",c,p,y),we=ii(C,"layout","text-line-height",c,p,y),Ee=Lo()(a?a(be):be,Ie,we),_e=b["text-transform"];"uppercase"==_e?Ce=Ce.toUpperCase():"lowercase"==_e&&(Ce=Ce.toLowerCase());var Se=ii(C,"layout","text-max-width",c,p,y),Me=ii(C,"layout","text-letter-spacing",c,p,y),Pe=2==d?qo(Ce,Me):function e(t,n,o,i){if(-1!==t.indexOf("\n")){for(var r=t.split("\n"),a=[],s=0,l=r.length;s1){var p=Wo();p.font=n;var h=p.measureText("M").width*o,g="";for(a=[],s=0,l=d.length;s1;++s){var y=a[s];if(Ho(y,i)<.35*h){var A=s>0?Ho(a[s-1],i):1/0,v=s.7*h&&Ho(I,i)<.6*h){var b=C.split(" "),w=b.pop();Ho(w,i)<.2*h&&(a[s]=b.join(" "),a[s+1]=w+" "+I),l-=1}}u=a.join("\n")}else u=t;u=qo(u,i),Yo[c]=u}return u}(Ce,Ee,Se,Me);z.setText(Pe),z.setFont(Ee),z.setRotation(Uo(ii(C,"layout","text-rotate",c,p,y)));var xe=ii(C,"layout","text-anchor",c,p,y),ke=F||1==d?"point":ii(C,"layout","symbol-placement",c,p,y);z.setPlacement(ke);var Ge=ii(C,"paint","text-halo-width",c,p,y),Re=ii(C,"layout","text-offset",c,p,y),Te=ii(C,"paint","text-translate",c,p,y),Oe=0,Le=0;if("point"==ke){var De="center";-1!==xe.indexOf("left")?(De="left",Le=Ge):-1!==xe.indexOf("right")&&(De="right",Le=-Ge),z.setTextAlign(De);var Ne=ii(C,"layout","text-rotation-alignment",c,p,y);z.setRotateWithView("map"==Ne)}else z.setMaxAngle(Uo(ii(C,"layout","text-max-angle",c,p,y))*Ce.length/Pe.length),z.setTextAlign(),z.setRotateWithView(!1);var je="middle";0==xe.indexOf("bottom")?(je="bottom",Oe=-Ge-.5*(we-1)*Ie):0==xe.indexOf("top")&&(je="top",Oe=Ge+.5*(we-1)*Ie),z.setTextBaseline(je),z.setOffsetX(Re[0]*Ie+Le+Te[0]),z.setOffsetY(Re[1]*Ie+Oe+Te[1]),P.setColor(ri(ii(C,"paint","text-color",c,p,y),S)),z.setFill(P);var Ue=ri(ii(C,"paint","text-halo-color",c,p,y),S);if(Ue){M.setColor(Ue),Ge*=2;var Be=.5*Ie;M.setWidth(Ge<=Be?Ge:Be),z.setStroke(M)}else z.setStroke(void 0);var Fe=ii(C,"layout","text-padding",c,p,y),ze=z.getPadding();Fe!==ze[0]&&(ze[0]=Fe,ze[1]=Fe,ze[2]=Fe,ze[3]=Fe),T.setZIndex(O)}}},C=0,I=r.length;C-1?(x.length=g+1,li&&("function"==typeof e.set?e.set("mapbox-layer",u):e.getProperties()["mapbox-layer"]=u),x):void 0}};return e.setStyle(k),e.set("mapbox-source",d),e.set("mapbox-layers",g),k},ui=n(72),di=n.n(ui);n(73);function pi(e){return(pi="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var hi,gi=/font-family: ?([^;]*);/,mi=/("|')/g;function fi(e){if(!hi){hi={};for(var t=document.styleSheets,n=0,o=t.length;n2?o[2]:""):e+n}function wi(e,t,n,o,i){return new Promise((function(r,a){if("object"!=pi(t)&&(t=JSON.parse(t)),8!=t.version)return a(new Error("glStyle version 8 required."));if(!(e instanceof Dn.a||e instanceof xn.a))return a(new Error("Can only apply to VectorLayer or VectorTileLayer"));var s,l,c;function u(){c||t.sprite&&!s?c?(e.setStyle(c),r()):a(new Error("Something went wrong trying to apply style.")):(c=ci(e,t,n,i,s,l,vi),e.getStyle()?r():a(new Error("Nothing to show for source [".concat(n,"]"))))}if(t.sprite){var d=.5==(window.devicePixelRatio>=1.5?.5:1)?"@2x":"",p=bi(t.sprite,o,d+".json");fetch(p,{credentials:"same-origin"}).then((function(e){return e.ok||""===d?e:(p=bi(t.sprite,o,".json"),fetch(p,{credentials:"same-origin"}))})).then((function(e){if(e.ok)return e.json();a(new Error("Problem fetching sprite from ".concat(p,": ").concat(e.statusText)))})).then((function(e){if(void 0===e)return a(new Error("No sprites found."));s=e,l=bi(t.sprite,o,d+".png"),u()})).catch((function(e){a(new Error("Sprites cannot be loaded: ".concat(p,": ").concat(e.message)))}))}else u()}))}new on.a;var Ei=function(e){function t(n,o){if(!(this instanceof t))throw new TypeError("ERROR CLASS_CONSTRUCTOR");if(!n.layer)throw new Error("ERROR PARAM_MISSING : layer");if("string"!=typeof n.layer)throw new Error("ERROR WRONG TYPE : layer");if(this.layerName=n.layer,this.styleName=n.style,this.sourceId=n.source,void 0===n.ssl&&(n.ssl=!0),this.protocol=!1===n.ssl?"http://":"https://",!hn.a.isConfigLoaded())throw new Error("ERROR : contract key configuration has to be loaded to load Geoportal layers.");var i=this.layerName+"$GEOPORTAIL:GPP:TMS",r=hn.a.configuration.getLayerConf(i);if(!r)throw new Error("ERROR : Layer ID not found into the catalogue !?");this.styleUrl=null,this.styleTitle="";for(var a=0;a>1,u=-7,d=n?i-1:0,p=n?-1:1,h=e[t+d];for(d+=p,r=h&(1<<-u)-1,h>>=-u,u+=s;u>0;r=256*r+e[t+d],d+=p,u-=8);for(a=r&(1<<-u)-1,r>>=-u,u+=o;u>0;a=256*a+e[t+d],d+=p,u-=8);if(0===r)r=1-c;else{if(r===l)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,o),r-=c}return(h?-1:1)*a*Math.pow(2,r-o)},t.write=function(e,t,n,o,i,r){var a,s,l,c=8*r-i-1,u=(1<>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=o?0:r-1,g=o?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=u):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),(t+=a+d>=1?p/l:p*Math.pow(2,1-d))*l>=2&&(a++,l/=2),a+d>=u?(s=0,a=u):a+d>=1?(s=(t*l-1)*Math.pow(2,i),a+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,i),a=0));i>=8;e[n+h]=255&s,h+=g,s/=256,i-=8);for(a=a<0;e[n+h]=255&a,h+=g,a/=256,c-=8);e[n+h-g]|=128*m}},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},function(e,t,n){e.exports=function(){"use strict";var e=484813681109536e-20,t=Math.PI/2,n=.017453292519943295,o=57.29577951308232,i=Math.PI/4,r=2*Math.PI,a=3.14159265359,s={greenwich:0,lisbon:-9.131906111111,paris:2.337229166667,bogota:-74.080916666667,madrid:-3.687938888889,rome:12.452333333333,bern:7.439583333333,jakarta:106.807719444444,ferro:-17.666666666667,brussels:4.367975,stockholm:18.058277777778,athens:23.7163375,oslo:10.722916666667},l={ft:{to_meter:.3048},"us-ft":{to_meter:1200/3937}},c=/[\s_\-\/\(\)]/g;function u(e,t){if(e[t])return e[t];for(var n,o=Object.keys(e),i=t.toLowerCase().replace(c,""),r=-1;++r=this.text.length)return;e=this.text[this.place++]}switch(this.state){case 1:return this.neutral(e);case 2:return this.keyword(e);case 4:return this.quoted(e);case 5:return this.afterquote(e);case 3:return this.number(e);case-1:return}},y.prototype.afterquote=function(e){if('"'===e)return this.word+='"',void(this.state=4);if(m.test(e))return this.word=this.word.trim(),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in afterquote yet, index '+this.place)},y.prototype.afterItem=function(e){return","===e?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=1)):"]"===e?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=1,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},y.prototype.number=function(e){if(!f.test(e)){if(m.test(e))return this.word=parseFloat(this.word),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in number yet, index '+this.place)}this.word+=e},y.prototype.quoted=function(e){'"'!==e?this.word+=e:this.state=5},y.prototype.keyword=function(e){if(g.test(e))this.word+=e;else{if("["===e){var t=[];return t.push(this.word),this.level++,null===this.root?this.root=t:this.currentObject.push(t),this.stack.push(this.currentObject),this.currentObject=t,void(this.state=1)}if(!m.test(e))throw new Error("havn't handled \""+e+'" in keyword yet, index '+this.place);this.afterItem(e)}},y.prototype.neutral=function(e){if(h.test(e))return this.word=e,void(this.state=2);if('"'===e)return this.word="",void(this.state=4);if(f.test(e))return this.word=e,void(this.state=3);if(!m.test(e))throw new Error("havn't handled \""+e+'" in neutral yet, index '+this.place);this.afterItem(e)},y.prototype.output=function(){for(;this.place0?90:-90),e.lat_ts=e.lat1)}(i),i};function b(e){var t=this;if(2===arguments.length){var n=arguments[1];"string"==typeof n?"+"===n.charAt(0)?b[e]=d(arguments[1]):b[e]=I(arguments[1]):b[e]=n}else if(1===arguments.length){if(Array.isArray(e))return e.map((function(e){Array.isArray(e)?b.apply(t,e):b(e)}));if("string"==typeof e){if(e in b)return b[e]}else"EPSG"in e?b["EPSG:"+e.EPSG]=e:"ESRI"in e?b["ESRI:"+e.ESRI]=e:"IAU2000"in e?b["IAU2000:"+e.IAU2000]=e:console.log(e);return}}!function(e){e("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),e("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),e("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),e.WGS84=e["EPSG:4326"],e["EPSG:3785"]=e["EPSG:3857"],e.GOOGLE=e["EPSG:3857"],e["EPSG:900913"]=e["EPSG:3857"],e["EPSG:102113"]=e["EPSG:3857"]}(b);var w=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"],E=["3857","900913","3785","102113"];function _(e){if(!function(e){return"string"==typeof e}(e))return e;if(function(e){return e in b}(e))return b[e];if(function(e){return w.some((function(t){return e.indexOf(t)>-1}))}(e)){var t=I(e);if(function(e){var t=u(e,"authority");if(t){var n=u(t,"epsg");return n&&E.indexOf(n)>-1}}(t))return b["EPSG:3857"];var n=function(e){var t=u(e,"extension");if(t)return u(t,"proj4")}(t);return n?d(n):t}return function(e){return"+"===e[0]}(e)?d(e):void 0}var S=function(e,t){var n,o;if(e=e||{},!t)return e;for(o in t)void 0!==(n=t[o])&&(e[o]=n);return e},M=function(e,t,n){var o=e*t;return n/Math.sqrt(1-o*o)},P=function(e){return e<0?-1:1},x=function(e){return Math.abs(e)<=a?e:e-P(e)*r},k=function(e,n,o){var i=e*o,r=.5*e;return i=Math.pow((1-i)/(1+i),r),Math.tan(.5*(t-n))/i},G=function(e,n){for(var o,i,r=.5*e,a=t-2*Math.atan(n),s=0;s<=15;s++)if(o=e*Math.sin(a),a+=i=t-2*Math.atan(n*Math.pow((1-o)/(1+o),r))-a,Math.abs(i)<=1e-10)return a;return-9999};function R(e){return e}var T=[{init:function(){var e=this.b/this.a;this.es=1-e*e,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=M(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(e){var n,r,a=e.x,s=e.y;if(s*o>90&&s*o<-90&&a*o>180&&a*o<-180)return null;if(Math.abs(Math.abs(s)-t)<=1e-10)return null;if(this.sphere)n=this.x0+this.a*this.k0*x(a-this.long0),r=this.y0+this.a*this.k0*Math.log(Math.tan(i+.5*s));else{var l=Math.sin(s),c=k(this.e,s,l);n=this.x0+this.a*this.k0*x(a-this.long0),r=this.y0-this.a*this.k0*Math.log(c)}return e.x=n,e.y=r,e},inverse:function(e){var n,o,i=e.x-this.x0,r=e.y-this.y0;if(this.sphere)o=t-2*Math.atan(Math.exp(-r/(this.a*this.k0)));else{var a=Math.exp(-r/(this.a*this.k0));if(-9999===(o=G(this.e,a)))return null}return n=x(this.long0+i/(this.a*this.k0)),e.x=n,e.y=o,e},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:R,inverse:R,names:["longlat","identity"]}],O={},L=[];function D(e,t){var n=L.length;return e.names?(L[n]=e,e.names.forEach((function(e){O[e.toLowerCase()]=n})),this):(console.log(t),!0)}var N={start:function(){T.forEach(D)},add:D,get:function(e){if(!e)return!1;var t=e.toLowerCase();return void 0!==O[t]&&L[O[t]]?L[O[t]]:void 0}},j={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},U=j.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};j.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var B={wgs84:{towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},ch1903:{towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},ggrs87:{towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},nad83:{towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},nad27:{nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},potsdam:{towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},carthage:{towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},hermannskogel:{towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},osni52:{towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},ire65:{towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},rassadiran:{towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},nzgd49:{towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},osgb36:{towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},s_jtsk:{towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},beduaram:{towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},gunung_segara:{towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},rnb72:{towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},F={};function z(e){if(0===e.length)return null;var t="@"===e[0];return t&&(e=e.slice(1)),"null"===e?{name:"null",mandatory:!t,grid:null,isNull:!0}:{name:e,mandatory:!t,grid:F[e]||null,isNull:!1}}function V(e){return e/3600*Math.PI/180}function q(e,t,n){return String.fromCharCode.apply(null,new Uint8Array(e.buffer.slice(t,n)))}function W(e){return e.map((function(e){return[V(e.longitudeShift),V(e.latitudeShift)]}))}function H(e,t,n){return{name:q(e,t+8,t+16).trim(),parent:q(e,t+24,t+24+8).trim(),lowerLatitude:e.getFloat64(t+72,n),upperLatitude:e.getFloat64(t+88,n),lowerLongitude:e.getFloat64(t+104,n),upperLongitude:e.getFloat64(t+120,n),latitudeInterval:e.getFloat64(t+136,n),longitudeInterval:e.getFloat64(t+152,n),gridNodeCount:e.getInt32(t+168,n)}}function Y(e,t,n,o){for(var i=t+176,r=[],a=0;a3&&(0===l.datum_params[3]&&0===l.datum_params[4]&&0===l.datum_params[5]&&0===l.datum_params[6]||(l.datum_type=2,l.datum_params[3]*=e,l.datum_params[4]*=e,l.datum_params[5]*=e,l.datum_params[6]=l.datum_params[6]/1e6+1))),s&&(l.datum_type=3,l.grids=s),l.a=o,l.b=i,l.es=r,l.ep2=a,l}(o.datumCode,o.datum_params,g.a,g.b,m.es,m.ep2,f);S(this,o),S(this,i),this.a=g.a,this.b=g.b,this.rf=g.rf,this.sphere=g.sphere,this.es=m.es,this.e=m.e,this.ep2=m.ep2,this.datum=y,this.init(),n(null,this)}else n(t)}else n(t)}function Z(e,n,o){var i,r,a,s,l=e.x,c=e.y,u=e.z?e.z:0;if(c<-t&&c>-1.001*t)c=-t;else if(c>t&&c<1.001*t)c=t;else{if(c<-t)return{x:-1/0,y:-1/0,z:e.z};if(c>t)return{x:1/0,y:1/0,z:e.z}}return l>Math.PI&&(l-=2*Math.PI),r=Math.sin(c),s=Math.cos(c),a=r*r,{x:((i=o/Math.sqrt(1-n*a))+u)*s*Math.cos(l),y:(i+u)*s*Math.sin(l),z:(i*(1-n)+u)*r}}function K(e,t,n,o){var i,r,a,s,l,c,u,d,p,h,g,m,f,y,A,v=e.x,C=e.y,I=e.z?e.z:0;if(i=Math.sqrt(v*v+C*C),r=Math.sqrt(v*v+C*C+I*I),i/n<1e-12){if(y=0,r/n<1e-12)return A=-o,{x:e.x,y:e.y,z:e.z}}else y=Math.atan2(C,v);a=I/r,d=(s=i/r)*(1-t)*(l=1/Math.sqrt(1-t*(2-t)*s*s)),p=a*l,f=0;do{f++,c=t*(u=n/Math.sqrt(1-t*p*p))/(u+(A=i*d+I*p-u*(1-t*p*p))),m=(g=a*(l=1/Math.sqrt(1-c*(2-c)*s*s)))*d-(h=s*(1-c)*l)*p,d=h,p=g}while(m*m>1e-24&&f<30);return{x:y,y:Math.atan(g/Math.abs(h)),z:A}}function X(e){return 1===e||2===e}J.projections=N,J.projections.start();var Q=function(e,t,n){if(function(e,t){return e.datum_type===t.datum_type&&!(e.a!==t.a||Math.abs(e.es-t.es)>5e-11)&&(1===e.datum_type?e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]:2!==e.datum_type||e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]&&e.datum_params[3]===t.datum_params[3]&&e.datum_params[4]===t.datum_params[4]&&e.datum_params[5]===t.datum_params[5]&&e.datum_params[6]===t.datum_params[6])}(e,t))return n;if(5===e.datum_type||5===t.datum_type)return n;var o=e.a,i=e.es;if(3===e.datum_type){if(0!==$(e,!1,n))return;o=6378137,i=.0066943799901413165}var r=t.a,a=t.b,s=t.es;return 3===t.datum_type&&(r=6378137,a=6356752.314,s=.0066943799901413165),i!==s||o!==r||X(e.datum_type)||X(t.datum_type)?(n=Z(n,i,o),X(e.datum_type)&&(n=function(e,t,n){if(1===t)return{x:e.x+n[0],y:e.y+n[1],z:e.z+n[2]};if(2===t){var o=n[0],i=n[1],r=n[2],a=n[3],s=n[4],l=n[5],c=n[6];return{x:c*(e.x-l*e.y+s*e.z)+o,y:c*(l*e.x+e.y-a*e.z)+i,z:c*(-s*e.x+a*e.y+e.z)+r}}}(n,e.datum_type,e.datum_params)),X(t.datum_type)&&(n=function(e,t,n){if(1===t)return{x:e.x-n[0],y:e.y-n[1],z:e.z-n[2]};if(2===t){var o=n[0],i=n[1],r=n[2],a=n[3],s=n[4],l=n[5],c=n[6],u=(e.x-o)/c,d=(e.y-i)/c,p=(e.z-r)/c;return{x:u+l*d-s*p,y:-l*u+d+a*p,z:s*u-a*d+p}}}(n,t.datum_type,t.datum_params)),n=K(n,s,r,a),3!==t.datum_type||0===$(t,!0,n)?n:void 0):n};function $(e,t,n){if(null===e.grids||0===e.grids.length)return console.log("Grid shift grids not found"),-1;for(var i={x:-n.x,y:n.y},r={x:Number.NaN,y:Number.NaN},a=[],s=0;si.y||d>i.x||g1e-12&&Math.abs(a.y)>1e-12);if(l<0)return console.log("Inverse grid shift iterator failed to converge."),o;o.x=x(r.x+n.ll[0]),o.y=r.y+n.ll[1]}else isNaN(r.x)||(o.x=e.x+r.x,o.y=e.y+r.y);return o}function te(e,t){var n,o={x:e.x/t.del[0],y:e.y/t.del[1]},i=Math.floor(o.x),r=Math.floor(o.y),a=o.x-1*i,s=o.y-1*r,l={x:Number.NaN,y:Number.NaN};if(i<0||i>=t.lim[0])return l;if(r<0||r>=t.lim[1])return l;n=r*t.lim[0]+i;var c=t.cvs[n][0],u=t.cvs[n][1];n++;var d=t.cvs[n][0],p=t.cvs[n][1];n+=t.lim[0];var h=t.cvs[n][0],g=t.cvs[n][1];n--;var m=t.cvs[n][0],f=t.cvs[n][1],y=a*s,A=a*(1-s),v=(1-a)*(1-s),C=(1-a)*s;return l.x=v*c+A*d+C*m+y*h,l.y=v*u+A*p+C*f+y*g,l}var ne=function(e,t,n){var o,i,r,a=n.x,s=n.y,l=n.z||0,c={};for(r=0;r<3;r++)if(!t||2!==r||void 0!==n.z)switch(0===r?(o=a,i=-1!=="ew".indexOf(e.axis[r])?"x":"y"):1===r?(o=s,i=-1!=="ns".indexOf(e.axis[r])?"y":"x"):(o=l,i="z"),e.axis[r]){case"e":c[i]=o;break;case"w":c[i]=-o;break;case"n":c[i]=o;break;case"s":c[i]=-o;break;case"u":void 0!==n[i]&&(c.z=o);break;case"d":void 0!==n[i]&&(c.z=-o);break;default:return null}return c},oe=function(e){var t={x:e[0],y:e[1]};return e.length>2&&(t.z=e[2]),e.length>3&&(t.m=e[3]),t};function ie(e){if("function"==typeof Number.isFinite){if(Number.isFinite(e))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof e||e!=e||!isFinite(e))throw new TypeError("coordinates must be finite numbers")}function re(e,t,i,r){var a;if(Array.isArray(i)&&(i=oe(i)),function(e){ie(e.x),ie(e.y)}(i),e.datum&&t.datum&&function(e,t){return(1===e.datum.datum_type||2===e.datum.datum_type)&&"WGS84"!==t.datumCode||(1===t.datum.datum_type||2===t.datum.datum_type)&&"WGS84"!==e.datumCode}(e,t)&&(i=re(e,a=new J("WGS84"),i,r),e=a),r&&"enu"!==e.axis&&(i=ne(e,!1,i)),"longlat"===e.projName)i={x:i.x*n,y:i.y*n,z:i.z||0};else if(e.to_meter&&(i={x:i.x*e.to_meter,y:i.y*e.to_meter,z:i.z||0}),!(i=e.inverse(i)))return;if(e.from_greenwich&&(i.x+=e.from_greenwich),i=Q(e.datum,t.datum,i))return t.from_greenwich&&(i={x:i.x-t.from_greenwich,y:i.y,z:i.z||0}),"longlat"===t.projName?i={x:i.x*o,y:i.y*o,z:i.z||0}:(i=t.forward(i),t.to_meter&&(i={x:i.x/t.to_meter,y:i.y/t.to_meter,z:i.z||0})),r&&"enu"!==t.axis?ne(t,!0,i):i}var ae=J("WGS84");function se(e,t,n,o){var i,r,a;return Array.isArray(n)?(i=re(e,t,n,o)||{x:NaN,y:NaN},n.length>2?void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name?"number"==typeof i.z?[i.x,i.y,i.z].concat(n.splice(3)):[i.x,i.y,n[2]].concat(n.splice(3)):[i.x,i.y].concat(n.splice(2)):[i.x,i.y]):(r=re(e,t,n,o),2===(a=Object.keys(n)).length||a.forEach((function(o){if(void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name){if("x"===o||"y"===o||"z"===o)return}else if("x"===o||"y"===o)return;r[o]=n[o]})),r)}function le(e){return e instanceof J?e:e.oProj?e.oProj:J(e)}function ce(e,t,n){e=le(e);var o,i=!1;return void 0===t?(t=e,e=ae,i=!0):(void 0!==t.x||Array.isArray(t))&&(n=t,t=e,e=ae,i=!0),t=le(t),n?se(e,t,n):(o={forward:function(n,o){return se(e,t,n,o)},inverse:function(n,o){return se(t,e,n,o)}},i&&(o.oProj=t),o)}var ue=65,de=73,pe=79,he={forward:ge,inverse:function(e){var t=Ae(Ce(e.toUpperCase()));return t.lat&&t.lon?[t.lon,t.lat,t.lon,t.lat]:[t.left,t.bottom,t.right,t.top]},toPoint:me};function ge(e,t){return t=t||5,function(e,t){var n,o,i,r,a,s,l,c,u,d,p,h,g,m,f="00000"+e.easting,y="00000"+e.northing;return e.zoneNumber+e.zoneLetter+(u=e.easting,d=e.northing,p=e.zoneNumber,h=ve(p),g=Math.floor(u/1e5),m=Math.floor(d/1e5)%20,n=g,o=m,r="AJSAJS".charCodeAt(i=h-1),a="AFAFAF".charCodeAt(i),c=!1,(s=r+n-1)>90&&(s=s-90+ue-1,c=!0),(s===de||rde||(s>de||rpe||(s>pe||r90&&(s=s-90+ue-1),(l=a+o)>86?(l=l-86+ue-1,c=!0):c=!1,(l===de||ade||(l>de||ape||(l>pe||a86&&(l=l-86+ue-1),String.fromCharCode(s)+String.fromCharCode(l))+f.substr(f.length-5,t)+y.substr(y.length-5,t)}(function(e){var t,n,o,i,r,a,s,l=e.lat,c=e.lon,u=6378137,d=fe(l),p=fe(c);s=Math.floor((c+180)/6)+1,180===c&&(s=60),l>=56&&l<64&&c>=3&&c<12&&(s=32),l>=72&&l<84&&(c>=0&&c<9?s=31:c>=9&&c<21?s=33:c>=21&&c<33?s=35:c>=33&&c<42&&(s=37)),a=fe(6*(s-1)-180+3),t=u/Math.sqrt(1-.00669438*Math.sin(d)*Math.sin(d)),n=Math.tan(d)*Math.tan(d),o=.006739496752268451*Math.cos(d)*Math.cos(d),i=Math.cos(d)*(p-a),r=u*(.9983242984503243*d-.002514607064228144*Math.sin(2*d)+2639046602129982e-21*Math.sin(4*d)-3.418046101696858e-9*Math.sin(6*d));var h,g,m=.9996*t*(i+(1-n+o)*i*i*i/6+(5-18*n+n*n+72*o-.39089081163157013)*i*i*i*i*i/120)+5e5,f=.9996*(r+t*Math.tan(d)*(i*i/2+(5-n+9*o+4*o*o)*i*i*i*i/24+(61-58*n+n*n+600*o-2.2240339282485886)*i*i*i*i*i*i/720));return l<0&&(f+=1e7),{northing:Math.round(f),easting:Math.round(m),zoneNumber:s,zoneLetter:(h=l,g="Z",84>=h&&h>=72?g="X":72>h&&h>=64?g="W":64>h&&h>=56?g="V":56>h&&h>=48?g="U":48>h&&h>=40?g="T":40>h&&h>=32?g="S":32>h&&h>=24?g="R":24>h&&h>=16?g="Q":16>h&&h>=8?g="P":8>h&&h>=0?g="N":0>h&&h>=-8?g="M":-8>h&&h>=-16?g="L":-16>h&&h>=-24?g="K":-24>h&&h>=-32?g="J":-32>h&&h>=-40?g="H":-40>h&&h>=-48?g="G":-48>h&&h>=-56?g="F":-56>h&&h>=-64?g="E":-64>h&&h>=-72?g="D":-72>h&&h>=-80&&(g="C"),g)}}({lat:e[1],lon:e[0]}),t)}function me(e){var t=Ae(Ce(e.toUpperCase()));return t.lat&&t.lon?[t.lon,t.lat]:[(t.left+t.right)/2,(t.top+t.bottom)/2]}function fe(e){return e*(Math.PI/180)}function ye(e){return e/Math.PI*180}function Ae(e){var t=e.northing,n=e.easting,o=e.zoneLetter,i=e.zoneNumber;if(i<0||i>60)return null;var r,a,s,l,c,u,d,p,h=6378137,g=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),m=n-5e5,f=t;o<"N"&&(f-=1e7),u=6*(i-1)-180+3,p=(d=f/.9996/6367449.145945056)+(3*g/2-27*g*g*g/32)*Math.sin(2*d)+(21*g*g/16-55*g*g*g*g/32)*Math.sin(4*d)+151*g*g*g/96*Math.sin(6*d),r=h/Math.sqrt(1-.00669438*Math.sin(p)*Math.sin(p)),a=Math.tan(p)*Math.tan(p),s=.006739496752268451*Math.cos(p)*Math.cos(p),l=.99330562*h/Math.pow(1-.00669438*Math.sin(p)*Math.sin(p),1.5),c=m/(.9996*r);var y=p-r*Math.tan(p)/l*(c*c/2-(5+3*a+10*s-4*s*s-.06065547077041606)*c*c*c*c/24+(61+90*a+298*s+45*a*a-1.6983531815716497-3*s*s)*c*c*c*c*c*c/720);y=ye(y);var A,v=(c-(1+2*a+s)*c*c*c/6+(5-2*s+28*a-3*s*s+.05391597401814761+24*a*a)*c*c*c*c*c/120)/Math.cos(p);if(v=u+ye(v),e.accuracy){var C=Ae({northing:e.northing+e.accuracy,easting:e.easting+e.accuracy,zoneLetter:e.zoneLetter,zoneNumber:e.zoneNumber});A={top:C.lat,right:C.lon,bottom:y,left:v}}else A={lat:y,lon:v};return A}function ve(e){var t=e%6;return 0===t&&(t=6),t}function Ce(e){if(e&&0===e.length)throw"MGRSPoint coverting from nothing";for(var t,n=e.length,o=null,i="",r=0;!/[A-Z]/.test(t=e.charAt(r));){if(r>=2)throw"MGRSPoint bad conversion from: "+e;i+=t,r++}var a=parseInt(i,10);if(0===r||r+3>n)throw"MGRSPoint bad conversion from: "+e;var s=e.charAt(r++);if(s<="A"||"B"===s||"Y"===s||s>="Z"||"I"===s||"O"===s)throw"MGRSPoint zone letter "+s+" not handled: "+e;o=e.substring(r,r+=2);for(var l=ve(a),c=function(e,t){for(var n="AJSAJS".charCodeAt(t-1),o=1e5,i=!1;n!==e.charCodeAt(0);){if(++n===de&&n++,n===pe&&n++,n>90){if(i)throw"Bad character: "+e;n=ue,i=!0}o+=1e5}return o}(o.charAt(0),l),u=function(e,t){if(e>"V")throw"MGRSPoint given invalid Northing "+e;for(var n="AFAFAF".charCodeAt(t-1),o=0,i=!1;n!==e.charCodeAt(0);){if(++n===de&&n++,n===pe&&n++,n>86){if(i)throw"Bad character: "+e;n=ue,i=!0}o+=1e5}return o}(o.charAt(1),l);u0&&(p=1e5/Math.pow(10,m),h=e.substring(r,r+m),f=parseFloat(h)*p,g=e.substring(r+m),y=parseFloat(g)*p),{easting:f+c,northing:y+u,zoneLetter:s,zoneNumber:a,accuracy:p}}function Ie(e){var t;switch(e){case"C":t=11e5;break;case"D":t=2e6;break;case"E":t=28e5;break;case"F":t=37e5;break;case"G":t=46e5;break;case"H":t=55e5;break;case"J":t=64e5;break;case"K":t=73e5;break;case"L":t=82e5;break;case"M":t=91e5;break;case"N":t=0;break;case"P":t=8e5;break;case"Q":t=17e5;break;case"R":t=26e5;break;case"S":t=35e5;break;case"T":t=44e5;break;case"U":t=53e5;break;case"V":t=62e5;break;case"W":t=7e6;break;case"X":t=79e5;break;default:t=-1}if(t>=0)return t;throw"Invalid zone letter: "+e}function be(e,t,n){if(!(this instanceof be))return new be(e,t,n);if(Array.isArray(e))this.x=e[0],this.y=e[1],this.z=e[2]||0;else if("object"==typeof e)this.x=e.x,this.y=e.y,this.z=e.z||0;else if("string"==typeof e&&void 0===t){var o=e.split(",");this.x=parseFloat(o[0],10),this.y=parseFloat(o[1],10),this.z=parseFloat(o[2],10)||0}else this.x=e,this.y=t,this.z=n||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}be.fromMGRS=function(e){return new be(me(e))},be.prototype.toMGRS=function(e){return ge([this.x,this.y],e)};var we=.01068115234375,Ee=function(e){var t=[];t[0]=1-e*(.25+e*(.046875+e*(.01953125+e*we))),t[1]=e*(.75-e*(.046875+e*(.01953125+e*we)));var n=e*e;return t[2]=n*(.46875-e*(.013020833333333334+.007120768229166667*e)),n*=e,t[3]=n*(.3645833333333333-.005696614583333333*e),t[4]=n*e*.3076171875,t},_e=function(e,t,n,o){return n*=t,t*=t,o[0]*e-n*(o[1]+t*(o[2]+t*(o[3]+t*o[4])))},Se=function(e,t,n){for(var o=1/(1-t),i=e,r=20;r;--r){var a=Math.sin(i),s=1-t*a*a;if(i-=s=(_e(i,a,Math.cos(i),n)-e)*(s*Math.sqrt(s))*o,Math.abs(s)<1e-10)return i}return i},Me={init:function(){this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.es&&(this.en=Ee(this.es),this.ml0=_e(this.lat0,Math.sin(this.lat0),Math.cos(this.lat0),this.en))},forward:function(e){var t,n,o,i=e.x,r=e.y,a=x(i-this.long0),s=Math.sin(r),l=Math.cos(r);if(this.es){var c=l*a,u=Math.pow(c,2),d=this.ep2*Math.pow(l,2),p=Math.pow(d,2),h=Math.abs(l)>1e-10?Math.tan(r):0,g=Math.pow(h,2),m=Math.pow(g,2);t=1-this.es*Math.pow(s,2),c/=Math.sqrt(t);var f=_e(r,s,l,this.en);n=this.a*(this.k0*c*(1+u/6*(1-g+d+u/20*(5-18*g+m+14*d-58*g*d+u/42*(61+179*m-m*g-479*g)))))+this.x0,o=this.a*(this.k0*(f-this.ml0+s*a*c/2*(1+u/12*(5-g+9*d+4*p+u/30*(61+m-58*g+270*d-330*g*d+u/56*(1385+543*m-m*g-3111*g))))))+this.y0}else{var y=l*Math.sin(a);if(Math.abs(Math.abs(y)-1)<1e-10)return 93;if(n=.5*this.a*this.k0*Math.log((1+y)/(1-y))+this.x0,o=l*Math.cos(a)/Math.sqrt(1-Math.pow(y,2)),(y=Math.abs(o))>=1){if(y-1>1e-10)return 93;o=0}else o=Math.acos(o);r<0&&(o=-o),o=this.a*this.k0*(o-this.lat0)+this.y0}return e.x=n,e.y=o,e},inverse:function(e){var n,o,i,r,a=(e.x-this.x0)*(1/this.a),s=(e.y-this.y0)*(1/this.a);if(this.es)if(n=this.ml0+s/this.k0,o=Se(n,this.es,this.en),Math.abs(o)1e-10?Math.tan(o):0,d=this.ep2*Math.pow(c,2),p=Math.pow(d,2),h=Math.pow(u,2),g=Math.pow(h,2);n=1-this.es*Math.pow(l,2);var m=a*Math.sqrt(n)/this.k0,f=Math.pow(m,2);i=o-(n*=u)*f/(1-this.es)*.5*(1-f/12*(5+3*h-9*d*h+d-4*p-f/30*(61+90*h-252*d*h+45*g+46*d-f/56*(1385+3633*h+4095*g+1574*g*h)))),r=x(this.long0+m*(1-f/6*(1+2*h+d-f/20*(5+28*h+24*g+8*d*h+6*d-f/42*(61+662*h+1320*g+720*g*h))))/c)}else i=t*P(s),r=0;else{var y=Math.exp(a/this.k0),A=.5*(y-1/y),v=this.lat0+s/this.k0,C=Math.cos(v);n=Math.sqrt((1-Math.pow(C,2))/(1+Math.pow(A,2))),i=Math.asin(n),s<0&&(i=-i),r=0===A&&0===C?0:x(Math.atan2(A,C)+this.long0)}return e.x=r,e.y=i,e},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]},Pe=function(e){var t=Math.exp(e);return t=(t-1/t)/2},xe=function(e,t){e=Math.abs(e),t=Math.abs(t);var n=Math.max(e,t),o=Math.min(e,t)/(n||1);return n*Math.sqrt(1+Math.pow(o,2))},ke=function(e){var t=Math.abs(e);return t=function(e){var t=1+e,n=t-1;return 0===n?e:e*Math.log(t)/n}(t*(1+t/(xe(1,t)+1))),e<0?-t:t},Ge=function(e,t){for(var n,o=2*Math.cos(2*t),i=e.length-1,r=e[i],a=0;--i>=0;)n=o*r-a+e[i],a=r,r=n;return t+n*Math.sin(2*t)},Re=function(e,t,n){for(var o,i,r=Math.sin(t),a=Math.cos(t),s=Pe(n),l=function(e){var t=Math.exp(e);return t=(t+1/t)/2}(n),c=2*a*l,u=-2*r*s,d=e.length-1,p=e[d],h=0,g=0,m=0;--d>=0;)o=g,i=h,p=c*(g=p)-o-u*(h=m)+e[d],m=u*g-i+c*h;return[(c=r*l)*p-(u=a*s)*m,c*m+u*p]},Te={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(Me.init.apply(this),this.forward=Me.forward,this.inverse=Me.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var e=this.es/(1+Math.sqrt(1-this.es)),t=e/(2-e),n=t;this.cgb[0]=t*(2+t*(-2/3+t*(t*(116/45+t*(26/45+t*(-2854/675)))-2))),this.cbg[0]=t*(t*(2/3+t*(4/3+t*(-82/45+t*(32/45+t*(4642/4725)))))-2),n*=t,this.cgb[1]=n*(7/3+t*(t*(-227/45+t*(2704/315+t*(2323/945)))-1.6)),this.cbg[1]=n*(5/3+t*(-16/15+t*(-13/9+t*(904/315+t*(-1522/945))))),n*=t,this.cgb[2]=n*(56/15+t*(-136/35+t*(-1262/105+t*(73814/2835)))),this.cbg[2]=n*(-26/15+t*(34/21+t*(1.6+t*(-12686/2835)))),n*=t,this.cgb[3]=n*(4279/630+t*(-332/35+t*(-399572/14175))),this.cbg[3]=n*(1237/630+t*(t*(-24832/14175)-2.4)),n*=t,this.cgb[4]=n*(4174/315+t*(-144838/6237)),this.cbg[4]=n*(-734/315+t*(109598/31185)),n*=t,this.cgb[5]=n*(601676/22275),this.cbg[5]=n*(444337/155925),n=Math.pow(t,2),this.Qn=this.k0/(1+t)*(1+n*(1/4+n*(1/64+n/256))),this.utg[0]=t*(t*(2/3+t*(-37/96+t*(1/360+t*(81/512+t*(-96199/604800)))))-.5),this.gtu[0]=t*(.5+t*(-2/3+t*(5/16+t*(41/180+t*(-127/288+t*(7891/37800)))))),this.utg[1]=n*(-1/48+t*(-1/15+t*(437/1440+t*(-46/105+t*(1118711/3870720))))),this.gtu[1]=n*(13/48+t*(t*(557/1440+t*(281/630+t*(-1983433/1935360)))-.6)),n*=t,this.utg[2]=n*(-17/480+t*(37/840+t*(209/4480+t*(-5569/90720)))),this.gtu[2]=n*(61/240+t*(-103/140+t*(15061/26880+t*(167603/181440)))),n*=t,this.utg[3]=n*(-4397/161280+t*(11/504+t*(830251/7257600))),this.gtu[3]=n*(49561/161280+t*(-179/168+t*(6601661/7257600))),n*=t,this.utg[4]=n*(-4583/161280+t*(108847/3991680)),this.gtu[4]=n*(34729/80640+t*(-3418889/1995840)),n*=t,this.utg[5]=n*(-20648693/638668800),this.gtu[5]=.6650675310896665*n;var o=Ge(this.cbg,this.lat0);this.Zb=-this.Qn*(o+function(e,t){for(var n,o=2*Math.cos(t),i=e.length-1,r=e[i],a=0;--i>=0;)n=o*r-a+e[i],a=r,r=n;return Math.sin(t)*n}(this.gtu,2*o))},forward:function(e){var t=x(e.x-this.long0),n=e.y;n=Ge(this.cbg,n);var o=Math.sin(n),i=Math.cos(n),r=Math.sin(t),a=Math.cos(t);n=Math.atan2(o,a*i),t=Math.atan2(r*i,xe(o,i*a)),t=ke(Math.tan(t));var s,l,c=Re(this.gtu,2*n,2*t);return n+=c[0],t+=c[1],Math.abs(t)<=2.623395162778?(s=this.a*(this.Qn*t)+this.x0,l=this.a*(this.Qn*n+this.Zb)+this.y0):(s=1/0,l=1/0),e.x=s,e.y=l,e},inverse:function(e){var t,n,o=(e.x-this.x0)*(1/this.a),i=(e.y-this.y0)*(1/this.a);if(i=(i-this.Zb)/this.Qn,o/=this.Qn,Math.abs(o)<=2.623395162778){var r=Re(this.utg,2*i,2*o);i+=r[0],o+=r[1],o=Math.atan(Pe(o));var a=Math.sin(i),s=Math.cos(i),l=Math.sin(o),c=Math.cos(o);i=Math.atan2(a*c,xe(l,c*s)),o=Math.atan2(l,c*s),t=x(o+this.long0),n=Ge(this.cgb,i)}else t=1/0,n=1/0;return e.x=t,e.y=n,e},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]},Oe={init:function(){var e=function(e,t){if(void 0===e){if((e=Math.floor(30*(x(t)+Math.PI)/Math.PI)+1)<0)return 0;if(e>60)return 60}return e}(this.zone,this.long0);if(void 0===e)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(e)-183)*n,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,Te.init.apply(this),this.forward=Te.forward,this.inverse=Te.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"},Le=function(e,t){return Math.pow((1-e)/(1+e),t)},De={init:function(){var e=Math.sin(this.lat0),t=Math.cos(this.lat0);t*=t,this.rc=Math.sqrt(1-this.es)/(1-this.es*e*e),this.C=Math.sqrt(1+this.es*t*t/(1-this.es)),this.phic0=Math.asin(e/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+i)/(Math.pow(Math.tan(.5*this.lat0+i),this.C)*Le(this.e*e,this.ratexp))},forward:function(e){var n=e.x,o=e.y;return e.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*o+i),this.C)*Le(this.e*Math.sin(o),this.ratexp))-t,e.x=this.C*n,e},inverse:function(e){for(var n=e.x/this.C,o=e.y,r=Math.pow(Math.tan(.5*o+i)/this.K,1/this.C),a=20;a>0&&(o=2*Math.atan(r*Le(this.e*Math.sin(e.y),-.5*this.e))-t,!(Math.abs(o-e.y)<1e-14));--a)e.y=o;return a?(e.x=n,e.y=o,e):null},names:["gauss"]},Ne={init:function(){De.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(e){var t,n,o,i;return e.x=x(e.x-this.long0),De.forward.apply(this,[e]),t=Math.sin(e.y),n=Math.cos(e.y),o=Math.cos(e.x),i=this.k0*this.R2/(1+this.sinc0*t+this.cosc0*n*o),e.x=i*n*Math.sin(e.x),e.y=i*(this.cosc0*t-this.sinc0*n*o),e.x=this.a*e.x+this.x0,e.y=this.a*e.y+this.y0,e},inverse:function(e){var t,n,o,i,r;if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,r=Math.sqrt(e.x*e.x+e.y*e.y)){var a=2*Math.atan2(r,this.R2);t=Math.sin(a),n=Math.cos(a),i=Math.asin(n*this.sinc0+e.y*t*this.cosc0/r),o=Math.atan2(e.x*t,r*this.cosc0*n-e.y*this.sinc0*t)}else i=this.phic0,o=0;return e.x=o,e.y=i,De.inverse.apply(this,[e]),e.x=x(e.x+this.long0),e},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]},je={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=1e-10&&(this.k0=.5*(1+P(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=1e-10&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=1e-10&&(this.k0=.5*this.cons*M(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/k(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=M(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-t,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(e){var n,o,i,r,a,s,l=e.x,c=e.y,u=Math.sin(c),d=Math.cos(c),p=x(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=1e-10&&Math.abs(c+this.lat0)<=1e-10?(e.x=NaN,e.y=NaN,e):this.sphere?(n=2*this.k0/(1+this.sinlat0*u+this.coslat0*d*Math.cos(p)),e.x=this.a*n*d*Math.sin(p)+this.x0,e.y=this.a*n*(this.coslat0*u-this.sinlat0*d*Math.cos(p))+this.y0,e):(o=2*Math.atan(this.ssfn_(c,u,this.e))-t,r=Math.cos(o),i=Math.sin(o),Math.abs(this.coslat0)<=1e-10?(a=k(this.e,c*this.con,this.con*u),s=2*this.a*this.k0*a/this.cons,e.x=this.x0+s*Math.sin(l-this.long0),e.y=this.y0-this.con*s*Math.cos(l-this.long0),e):(Math.abs(this.sinlat0)<1e-10?(n=2*this.a*this.k0/(1+r*Math.cos(p)),e.y=n*i):(n=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*i+this.cosX0*r*Math.cos(p))),e.y=n*(this.cosX0*i-this.sinX0*r*Math.cos(p))+this.y0),e.x=n*r*Math.sin(p)+this.x0,e))},inverse:function(e){var n,o,i,r,a;e.x-=this.x0,e.y-=this.y0;var s=Math.sqrt(e.x*e.x+e.y*e.y);if(this.sphere){var l=2*Math.atan(s/(2*this.a*this.k0));return n=this.long0,o=this.lat0,s<=1e-10?(e.x=n,e.y=o,e):(o=Math.asin(Math.cos(l)*this.sinlat0+e.y*Math.sin(l)*this.coslat0/s),n=Math.abs(this.coslat0)<1e-10?this.lat0>0?x(this.long0+Math.atan2(e.x,-1*e.y)):x(this.long0+Math.atan2(e.x,e.y)):x(this.long0+Math.atan2(e.x*Math.sin(l),s*this.coslat0*Math.cos(l)-e.y*this.sinlat0*Math.sin(l))),e.x=n,e.y=o,e)}if(Math.abs(this.coslat0)<=1e-10){if(s<=1e-10)return o=this.lat0,n=this.long0,e.x=n,e.y=o,e;e.x*=this.con,e.y*=this.con,i=s*this.cons/(2*this.a*this.k0),o=this.con*G(this.e,i),n=this.con*x(this.con*this.long0+Math.atan2(e.x,-1*e.y))}else r=2*Math.atan(s*this.cosX0/(2*this.a*this.k0*this.ms1)),n=this.long0,s<=1e-10?a=this.X0:(a=Math.asin(Math.cos(r)*this.sinX0+e.y*Math.sin(r)*this.cosX0/s),n=x(this.long0+Math.atan2(e.x*Math.sin(r),s*this.cosX0*Math.cos(r)-e.y*this.sinX0*Math.sin(r)))),o=-1*G(this.e,Math.tan(.5*(t+a)));return e.x=n,e.y=o,e},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(e,n,o){return n*=o,Math.tan(.5*(t+e))*Math.pow((1-n)/(1+n),.5*o)}},Ue={init:function(){var e=this.lat0;this.lambda0=this.long0;var t=Math.sin(e),n=this.a,o=1/this.rf,i=2*o-Math.pow(o,2),r=this.e=Math.sqrt(i);this.R=this.k0*n*Math.sqrt(1-i)/(1-i*Math.pow(t,2)),this.alpha=Math.sqrt(1+i/(1-i)*Math.pow(Math.cos(e),4)),this.b0=Math.asin(t/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),s=Math.log(Math.tan(Math.PI/4+e/2)),l=Math.log((1+r*t)/(1-r*t));this.K=a-this.alpha*s+this.alpha*r/2*l},forward:function(e){var t=Math.log(Math.tan(Math.PI/4-e.y/2)),n=this.e/2*Math.log((1+this.e*Math.sin(e.y))/(1-this.e*Math.sin(e.y))),o=-this.alpha*(t+n)+this.K,i=2*(Math.atan(Math.exp(o))-Math.PI/4),r=this.alpha*(e.x-this.lambda0),a=Math.atan(Math.sin(r)/(Math.sin(this.b0)*Math.tan(i)+Math.cos(this.b0)*Math.cos(r))),s=Math.asin(Math.cos(this.b0)*Math.sin(i)-Math.sin(this.b0)*Math.cos(i)*Math.cos(r));return e.y=this.R/2*Math.log((1+Math.sin(s))/(1-Math.sin(s)))+this.y0,e.x=this.R*a+this.x0,e},inverse:function(e){for(var t=e.x-this.x0,n=e.y-this.y0,o=t/this.R,i=2*(Math.atan(Math.exp(n/this.R))-Math.PI/4),r=Math.asin(Math.cos(this.b0)*Math.sin(i)+Math.sin(this.b0)*Math.cos(i)*Math.cos(o)),a=Math.atan(Math.sin(o)/(Math.cos(this.b0)*Math.cos(o)-Math.sin(this.b0)*Math.tan(i))),s=this.lambda0+a/this.alpha,l=0,c=r,u=-1e3,d=0;Math.abs(c-u)>1e-7;){if(++d>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+r/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(c))/2)),u=c,c=2*Math.atan(Math.exp(l))-Math.PI/2}return e.x=s,e.y=c,e},names:["somerc"]},Be={init:function(){var e,o,a,s,l,c,u,d,p,h,g,m,f,y=0,A=0,v=0,C=0,I=0,b=0,w=0;this.no_off=(f="object"==typeof(m=this).PROJECTION?Object.keys(m.PROJECTION)[0]:m.PROJECTION,"no_uoff"in m||"no_off"in m||-1!==["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"].indexOf(f)),this.no_rot="no_rot"in this;var E=!1;"alpha"in this&&(E=!0);var _=!1;if("rectified_grid_angle"in this&&(_=!0),E&&(w=this.alpha),_&&(y=this.rectified_grid_angle*n),E||_)A=this.longc;else if(v=this.long1,I=this.lat1,C=this.long2,b=this.lat2,Math.abs(I-b)<=1e-7||(e=Math.abs(I))<=1e-7||Math.abs(e-t)<=1e-7||Math.abs(Math.abs(this.lat0)-t)<=1e-7||Math.abs(Math.abs(b)-t)<=1e-7)throw new Error;var S=1-this.es;o=Math.sqrt(S),Math.abs(this.lat0)>1e-10?(d=Math.sin(this.lat0),a=Math.cos(this.lat0),e=1-this.es*d*d,this.B=a*a,this.B=Math.sqrt(1+this.es*this.B*this.B/S),this.A=this.B*this.k0*o/e,(l=(s=this.B*o/(a*Math.sqrt(e)))*s-1)<=0?l=0:(l=Math.sqrt(l),this.lat0<0&&(l=-l)),this.E=l+=s,this.E*=Math.pow(k(this.e,this.lat0,d),this.B)):(this.B=1/o,this.A=this.k0,this.E=s=l=1),E||_?(E?(g=Math.asin(Math.sin(w)/s),_||(y=w)):(g=y,w=Math.asin(s*Math.sin(g))),this.lam0=A-Math.asin(.5*(l-1/l)*Math.tan(g))/this.B):(c=Math.pow(k(this.e,I,Math.sin(I)),this.B),u=Math.pow(k(this.e,b,Math.sin(b)),this.B),l=this.E/c,p=(u-c)/(u+c),h=((h=this.E*this.E)-u*c)/(h+u*c),(e=v-C)<-Math.pi?C-=r:e>Math.pi&&(C+=r),this.lam0=x(.5*(v+C)-Math.atan(h*Math.tan(.5*this.B*(v-C))/p)/this.B),g=Math.atan(2*Math.sin(this.B*x(v-this.lam0))/(l-1/l)),y=w=Math.asin(s*Math.sin(g))),this.singam=Math.sin(g),this.cosgam=Math.cos(g),this.sinrot=Math.sin(y),this.cosrot=Math.cos(y),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(s*s-1)/Math.cos(w))),this.lat0<0&&(this.u_0=-this.u_0)),l=.5*g,this.v_pole_n=this.ArB*Math.log(Math.tan(i-l)),this.v_pole_s=this.ArB*Math.log(Math.tan(i+l))},forward:function(e){var n,o,i,r,a,s,l,c,u={};if(e.x=e.x-this.lam0,Math.abs(Math.abs(e.y)-t)>1e-10){if(n=.5*((a=this.E/Math.pow(k(this.e,e.y,Math.sin(e.y)),this.B))-(s=1/a)),o=.5*(a+s),r=Math.sin(this.B*e.x),i=(n*this.singam-r*this.cosgam)/o,Math.abs(Math.abs(i)-1)<1e-10)throw new Error;c=.5*this.ArB*Math.log((1-i)/(1+i)),s=Math.cos(this.B*e.x),l=Math.abs(s)<1e-7?this.A*e.x:this.ArB*Math.atan2(n*this.cosgam+r*this.singam,s)}else c=e.y>0?this.v_pole_n:this.v_pole_s,l=this.ArB*e.y;return this.no_rot?(u.x=l,u.y=c):(l-=this.u_0,u.x=c*this.cosrot+l*this.sinrot,u.y=l*this.cosrot-c*this.sinrot),u.x=this.a*u.x+this.x0,u.y=this.a*u.y+this.y0,u},inverse:function(e){var n,o,i,r,a,s,l,c={};if(e.x=(e.x-this.x0)*(1/this.a),e.y=(e.y-this.y0)*(1/this.a),this.no_rot?(o=e.y,n=e.x):(o=e.x*this.cosrot-e.y*this.sinrot,n=e.y*this.cosrot+e.x*this.sinrot+this.u_0),r=.5*((i=Math.exp(-this.BrA*o))-1/i),a=.5*(i+1/i),l=((s=Math.sin(this.BrA*n))*this.cosgam+r*this.singam)/a,Math.abs(Math.abs(l)-1)<1e-10)c.x=0,c.y=l<0?-t:t;else{if(c.y=this.E/Math.sqrt((1+l)/(1-l)),c.y=G(this.e,Math.pow(c.y,1/this.B)),c.y===1/0)throw new Error;c.x=-this.rB*Math.atan2(r*this.cosgam-s*this.singam,Math.cos(this.BrA*n))}return c.x+=this.lam0,c},names:["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Two_Point_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","Oblique_Mercator","omerc"]},Fe={init:function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<1e-10)){var e=this.b/this.a;this.e=Math.sqrt(1-e*e);var t=Math.sin(this.lat1),n=Math.cos(this.lat1),o=M(this.e,t,n),i=k(this.e,this.lat1,t),r=Math.sin(this.lat2),a=Math.cos(this.lat2),s=M(this.e,r,a),l=k(this.e,this.lat2,r),c=k(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>1e-10?this.ns=Math.log(o/s)/Math.log(i/l):this.ns=t,isNaN(this.ns)&&(this.ns=t),this.f0=o/(this.ns*Math.pow(i,this.ns)),this.rh=this.a*this.f0*Math.pow(c,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(e){var n=e.x,o=e.y;Math.abs(2*Math.abs(o)-Math.PI)<=1e-10&&(o=P(o)*(t-2e-10));var i,r,a=Math.abs(Math.abs(o)-t);if(a>1e-10)i=k(this.e,o,Math.sin(o)),r=this.a*this.f0*Math.pow(i,this.ns);else{if((a=o*this.ns)<=0)return null;r=0}var s=this.ns*x(n-this.long0);return e.x=this.k0*(r*Math.sin(s))+this.x0,e.y=this.k0*(this.rh-r*Math.cos(s))+this.y0,e},inverse:function(e){var n,o,i,r,a,s=(e.x-this.x0)/this.k0,l=this.rh-(e.y-this.y0)/this.k0;this.ns>0?(n=Math.sqrt(s*s+l*l),o=1):(n=-Math.sqrt(s*s+l*l),o=-1);var c=0;if(0!==n&&(c=Math.atan2(o*s,o*l)),0!==n||this.ns>0){if(o=1/this.ns,i=Math.pow(n/(this.a*this.f0),o),-9999===(r=G(this.e,i)))return null}else r=-t;return a=x(c/this.ns+this.long0),e.x=a,e.y=r,e},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc"]},ze={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(e){var t,n,o,i,r,a,s,l=e.x,c=e.y,u=x(l-this.long0);return t=Math.pow((1+this.e*Math.sin(c))/(1-this.e*Math.sin(c)),this.alfa*this.e/2),n=2*(Math.atan(this.k*Math.pow(Math.tan(c/2+this.s45),this.alfa)/t)-this.s45),o=-u*this.alfa,i=Math.asin(Math.cos(this.ad)*Math.sin(n)+Math.sin(this.ad)*Math.cos(n)*Math.cos(o)),r=Math.asin(Math.cos(n)*Math.sin(o)/Math.cos(i)),a=this.n*r,s=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(i/2+this.s45),this.n),e.y=s*Math.cos(a)/1,e.x=s*Math.sin(a)/1,this.czech||(e.y*=-1,e.x*=-1),e},inverse:function(e){var t,n,o,i,r,a,s,l=e.x;e.x=e.y,e.y=l,this.czech||(e.y*=-1,e.x*=-1),r=Math.sqrt(e.x*e.x+e.y*e.y),i=Math.atan2(e.y,e.x)/Math.sin(this.s0),o=2*(Math.atan(Math.pow(this.ro0/r,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),t=Math.asin(Math.cos(this.ad)*Math.sin(o)-Math.sin(this.ad)*Math.cos(o)*Math.cos(i)),n=Math.asin(Math.cos(o)*Math.sin(i)/Math.cos(t)),e.x=this.long0-n/this.alfa,a=t,s=0;var c=0;do{e.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(t/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-e.y)<1e-10&&(s=1),a=e.y,c+=1}while(0===s&&c<15);return c>=15?null:e},names:["Krovak","krovak"]},Ve=function(e,t,n,o,i){return e*i-t*Math.sin(2*i)+n*Math.sin(4*i)-o*Math.sin(6*i)},qe=function(e){return 1-.25*e*(1+e/16*(3+1.25*e))},We=function(e){return.375*e*(1+.25*e*(1+.46875*e))},He=function(e){return.05859375*e*e*(1+.75*e)},Ye=function(e){return e*e*e*(35/3072)},Je=function(e,t,n){var o=t*n;return e/Math.sqrt(1-o*o)},Ze=function(e){return Math.abs(e)1e-7?(1-e*e)*(t/(1-(n=e*t)*n)-.5/e*Math.log((1-n)/(1+n))):2*t},$e={init:function(){var e,n=Math.abs(this.lat0);if(Math.abs(n-t)<1e-10?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(n)<1e-10?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0)switch(this.qp=Qe(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(e){var t,n=[];return n[0]=.3333333333333333*e,t=e*e,n[0]+=.17222222222222222*t,n[1]=.06388888888888888*t,t*=e,n[0]+=.10257936507936508*t,n[1]+=.0664021164021164*t,n[2]=.016415012942191543*t,n}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),e=Math.sin(this.lat0),this.sinb1=Qe(this.e,e)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*e*e)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(e){var n,o,r,a,s,l,c,u,d,p,h=e.x,g=e.y;if(h=x(h-this.long0),this.sphere){if(s=Math.sin(g),p=Math.cos(g),r=Math.cos(h),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((o=this.mode===this.EQUIT?1+p*r:1+this.sinph0*s+this.cosph0*p*r)<=1e-10)return null;n=(o=Math.sqrt(2/o))*p*Math.sin(h),o*=this.mode===this.EQUIT?s:this.cosph0*s-this.sinph0*p*r}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(r=-r),Math.abs(g+this.lat0)<1e-10)return null;o=i-.5*g,n=(o=2*(this.mode===this.S_POLE?Math.cos(o):Math.sin(o)))*Math.sin(h),o*=r}}else{switch(c=0,u=0,d=0,r=Math.cos(h),a=Math.sin(h),s=Math.sin(g),l=Qe(this.e,s),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(c=l/this.qp,u=Math.sqrt(1-c*c)),this.mode){case this.OBLIQ:d=1+this.sinb1*c+this.cosb1*u*r;break;case this.EQUIT:d=1+u*r;break;case this.N_POLE:d=t+g,l=this.qp-l;break;case this.S_POLE:d=g-t,l=this.qp+l}if(Math.abs(d)<1e-10)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:d=Math.sqrt(2/d),o=this.mode===this.OBLIQ?this.ymf*d*(this.cosb1*c-this.sinb1*u*r):(d=Math.sqrt(2/(1+u*r)))*c*this.ymf,n=this.xmf*d*u*a;break;case this.N_POLE:case this.S_POLE:l>=0?(n=(d=Math.sqrt(l))*a,o=r*(this.mode===this.S_POLE?d:-d)):n=o=0}}return e.x=this.a*n+this.x0,e.y=this.a*o+this.y0,e},inverse:function(e){e.x-=this.x0,e.y-=this.y0;var n,o,i,r,a,s,l,c,u,d,p=e.x/this.a,h=e.y/this.a;if(this.sphere){var g,m=0,f=0;if((o=.5*(g=Math.sqrt(p*p+h*h)))>1)return null;switch(o=2*Math.asin(o),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(f=Math.sin(o),m=Math.cos(o)),this.mode){case this.EQUIT:o=Math.abs(g)<=1e-10?0:Math.asin(h*f/g),p*=f,h=m*g;break;case this.OBLIQ:o=Math.abs(g)<=1e-10?this.lat0:Math.asin(m*this.sinph0+h*f*this.cosph0/g),p*=f*this.cosph0,h=(m-Math.sin(o)*this.sinph0)*g;break;case this.N_POLE:h=-h,o=t-o;break;case this.S_POLE:o-=t}n=0!==h||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(p,h):0}else{if(l=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(p/=this.dd,h*=this.dd,(s=Math.sqrt(p*p+h*h))<1e-10)return e.x=this.long0,e.y=this.lat0,e;r=2*Math.asin(.5*s/this.rq),i=Math.cos(r),p*=r=Math.sin(r),this.mode===this.OBLIQ?(l=i*this.sinb1+h*r*this.cosb1/s,a=this.qp*l,h=s*this.cosb1*i-h*this.sinb1*r):(l=h*r/s,a=this.qp*l,h=s*i)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(h=-h),!(a=p*p+h*h))return e.x=this.long0,e.y=this.lat0,e;l=1-a/this.qp,this.mode===this.S_POLE&&(l=-l)}n=Math.atan2(p,h),c=Math.asin(l),u=this.apa,d=c+c,o=c+u[0]*Math.sin(d)+u[1]*Math.sin(d+d)+u[2]*Math.sin(d+d+d)}return e.x=x(this.long0+n),e.y=o,e},names:["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"],S_POLE:1,N_POLE:2,EQUIT:3,OBLIQ:4},et=function(e){return Math.abs(e)>1&&(e=e>1?1:-1),Math.asin(e)},tt={init:function(){Math.abs(this.lat1+this.lat2)<1e-10||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=M(this.e3,this.sin_po,this.cos_po),this.qs1=Qe(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=M(this.e3,this.sin_po,this.cos_po),this.qs2=Qe(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=Qe(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>1e-10?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(e){var t=e.x,n=e.y;this.sin_phi=Math.sin(n),this.cos_phi=Math.cos(n);var o=Qe(this.e3,this.sin_phi,this.cos_phi),i=this.a*Math.sqrt(this.c-this.ns0*o)/this.ns0,r=this.ns0*x(t-this.long0),a=i*Math.sin(r)+this.x0,s=this.rh-i*Math.cos(r)+this.y0;return e.x=a,e.y=s,e},inverse:function(e){var t,n,o,i,r,a;return e.x-=this.x0,e.y=this.rh-e.y+this.y0,this.ns0>=0?(t=Math.sqrt(e.x*e.x+e.y*e.y),o=1):(t=-Math.sqrt(e.x*e.x+e.y*e.y),o=-1),i=0,0!==t&&(i=Math.atan2(o*e.x,o*e.y)),o=t*this.ns0/this.a,this.sphere?a=Math.asin((this.c-o*o)/(2*this.ns0)):(n=(this.c-o*o)/this.ns0,a=this.phi1z(this.e3,n)),r=x(i/this.ns0+this.long0),e.x=r,e.y=a,e},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(e,t){var n,o,i,r,a=et(.5*t);if(e<1e-10)return a;for(var s=e*e,l=1;l<=25;l++)if(a+=r=.5*(i=1-(o=e*(n=Math.sin(a)))*o)*i/Math.cos(a)*(t/(1-s)-n/i+.5/e*Math.log((1-o)/(1+o))),Math.abs(r)<=1e-7)return a;return null}},nt={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},forward:function(e){var t,n,o,i,r,a,s,l=e.x,c=e.y;return o=x(l-this.long0),t=Math.sin(c),n=Math.cos(c),i=Math.cos(o),(r=this.sin_p14*t+this.cos_p14*n*i)>0||Math.abs(r)<=1e-10?(a=this.x0+1*this.a*n*Math.sin(o)/r,s=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*n*i)/r):(a=this.x0+this.infinity_dist*n*Math.sin(o),s=this.y0+this.infinity_dist*(this.cos_p14*t-this.sin_p14*n*i)),e.x=a,e.y=s,e},inverse:function(e){var t,n,o,i,r,a;return e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,(t=Math.sqrt(e.x*e.x+e.y*e.y))?(i=Math.atan2(t,this.rc),n=Math.sin(i),o=Math.cos(i),a=et(o*this.sin_p14+e.y*n*this.cos_p14/t),r=Math.atan2(e.x*n,t*this.cos_p14*o-e.y*this.sin_p14*n),r=x(this.long0+r)):(a=this.phic0,r=0),e.x=r,e.y=a,e},names:["gnom"]},ot={init:function(){this.sphere||(this.k0=M(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(e){var t,n,o=e.x,i=e.y,r=x(o-this.long0);if(this.sphere)t=this.x0+this.a*r*Math.cos(this.lat_ts),n=this.y0+this.a*Math.sin(i)/Math.cos(this.lat_ts);else{var a=Qe(this.e,Math.sin(i));t=this.x0+this.a*this.k0*r,n=this.y0+this.a*a*.5/this.k0}return e.x=t,e.y=n,e},inverse:function(e){var n,o;return e.x-=this.x0,e.y-=this.y0,this.sphere?(n=x(this.long0+e.x/this.a/Math.cos(this.lat_ts)),o=Math.asin(e.y/this.a*Math.cos(this.lat_ts))):(o=function(e,n){var o=1-(1-e*e)/(2*e)*Math.log((1-e)/(1+e));if(Math.abs(Math.abs(n)-o)<1e-6)return n<0?-1*t:t;for(var i,r,a,s,l=Math.asin(.5*n),c=0;c<30;c++)if(r=Math.sin(l),a=Math.cos(l),s=e*r,l+=i=Math.pow(1-s*s,2)/(2*a)*(n/(1-e*e)-r/(1-s*s)+.5/e*Math.log((1-s)/(1+s))),Math.abs(i)<=1e-10)return l;return NaN}(this.e,2*e.y*this.k0/this.a),n=x(this.long0+e.x/(this.a*this.k0))),e.x=n,e.y=o,e},names:["cea"]},it={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(e){var t=e.x,n=e.y,o=x(t-this.long0),i=Ze(n-this.lat0);return e.x=this.x0+this.a*o*this.rc,e.y=this.y0+this.a*i,e},inverse:function(e){var t=e.x,n=e.y;return e.x=x(this.long0+(t-this.x0)/(this.a*this.rc)),e.y=Ze(this.lat0+(n-this.y0)/this.a),e},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},rt={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=qe(this.es),this.e1=We(this.es),this.e2=He(this.es),this.e3=Ye(this.es),this.ml0=this.a*Ve(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(e){var t,n,o,i=e.x,r=e.y,a=x(i-this.long0);if(o=a*Math.sin(r),this.sphere)Math.abs(r)<=1e-10?(t=this.a*a,n=-1*this.a*this.lat0):(t=this.a*Math.sin(o)/Math.tan(r),n=this.a*(Ze(r-this.lat0)+(1-Math.cos(o))/Math.tan(r)));else if(Math.abs(r)<=1e-10)t=this.a*a,n=-1*this.ml0;else{var s=Je(this.a,this.e,Math.sin(r))/Math.tan(r);t=s*Math.sin(o),n=this.a*Ve(this.e0,this.e1,this.e2,this.e3,r)-this.ml0+s*(1-Math.cos(o))}return e.x=t+this.x0,e.y=n+this.y0,e},inverse:function(e){var t,n,o,i,r,a,s,l,c;if(o=e.x-this.x0,i=e.y-this.y0,this.sphere)if(Math.abs(i+this.a*this.lat0)<=1e-10)t=x(o/this.a+this.long0),n=0;else{var u;for(a=this.lat0+i/this.a,s=o*o/this.a/this.a+a*a,l=a,r=20;r;--r)if(l+=c=-1*(a*(l*(u=Math.tan(l))+1)-l-.5*(l*l+s)*u)/((l-a)/u-1),Math.abs(c)<=1e-10){n=l;break}t=x(this.long0+Math.asin(o*Math.tan(l)/this.a)/Math.sin(n))}else if(Math.abs(i+this.ml0)<=1e-10)n=0,t=x(this.long0+o/this.a);else{var d,p,h,g,m;for(a=(this.ml0+i)/this.a,s=o*o/this.a/this.a+a*a,l=a,r=20;r;--r)if(m=this.e*Math.sin(l),d=Math.sqrt(1-m*m)*Math.tan(l),p=this.a*Ve(this.e0,this.e1,this.e2,this.e3,l),h=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),l-=c=(a*(d*(g=p/this.a)+1)-g-.5*d*(g*g+s))/(this.es*Math.sin(2*l)*(g*g+s-2*a*g)/(4*d)+(a-g)*(d*h-2/Math.sin(2*l))-h),Math.abs(c)<=1e-10){n=l;break}d=Math.sqrt(1-this.es*Math.pow(Math.sin(n),2))*Math.tan(n),t=x(this.long0+Math.asin(o*d/this.a)/Math.sin(n))}return e.x=t,e.y=n,e},names:["Polyconic","poly"]},at={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(t){var n,o=t.x,i=t.y-this.lat0,r=o-this.long0,a=i/e*1e-5,s=r,l=1,c=0;for(n=1;n<=10;n++)l*=a,c+=this.A[n]*l;var u,d=c,p=s,h=1,g=0,m=0,f=0;for(n=1;n<=6;n++)u=g*d+h*p,h=h*d-g*p,g=u,m=m+this.B_re[n]*h-this.B_im[n]*g,f=f+this.B_im[n]*h+this.B_re[n]*g;return t.x=f*this.a+this.x0,t.y=m*this.a+this.y0,t},inverse:function(t){var n,o,i=t.x,r=t.y,a=i-this.x0,s=(r-this.y0)/this.a,l=a/this.a,c=1,u=0,d=0,p=0;for(n=1;n<=6;n++)o=u*s+c*l,c=c*s-u*l,u=o,d=d+this.C_re[n]*c-this.C_im[n]*u,p=p+this.C_im[n]*c+this.C_re[n]*u;for(var h=0;h.999999999999&&(n=.999999999999),t=Math.asin(n);var o=x(this.long0+e.x/(.900316316158*this.a*Math.cos(t)));o<-Math.PI&&(o=-Math.PI),o>Math.PI&&(o=Math.PI),n=(2*t+Math.sin(2*t))/Math.PI,Math.abs(n)>1&&(n=1);var i=Math.asin(n);return e.x=o,e.y=i,e},names:["Mollweide","moll"]},ut={init:function(){Math.abs(this.lat1+this.lat2)<1e-10||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=qe(this.es),this.e1=We(this.es),this.e2=He(this.es),this.e3=Ye(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=M(this.e,this.sinphi,this.cosphi),this.ml1=Ve(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<1e-10?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=M(this.e,this.sinphi,this.cosphi),this.ml2=Ve(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=Ve(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},forward:function(e){var t,n=e.x,o=e.y;if(this.sphere)t=this.a*(this.g-o);else{var i=Ve(this.e0,this.e1,this.e2,this.e3,o);t=this.a*(this.g-i)}var r=this.ns*x(n-this.long0),a=this.x0+t*Math.sin(r),s=this.y0+this.rh-t*Math.cos(r);return e.x=a,e.y=s,e},inverse:function(e){var t,n,o,i;e.x-=this.x0,e.y=this.rh-e.y+this.y0,this.ns>=0?(n=Math.sqrt(e.x*e.x+e.y*e.y),t=1):(n=-Math.sqrt(e.x*e.x+e.y*e.y),t=-1);var r=0;if(0!==n&&(r=Math.atan2(t*e.x,t*e.y)),this.sphere)return i=x(this.long0+r/this.ns),o=Ze(this.g-n/this.a),e.x=i,e.y=o,e;var a=this.g-n/this.a;return o=Ke(a,this.e0,this.e1,this.e2,this.e3),i=x(this.long0+r/this.ns),e.x=i,e.y=o,e},names:["Equidistant_Conic","eqdc"]},dt={init:function(){this.R=this.a},forward:function(e){var n,o,i=e.x,r=e.y,a=x(i-this.long0);Math.abs(r)<=1e-10&&(n=this.x0+this.R*a,o=this.y0);var s=et(2*Math.abs(r/Math.PI));(Math.abs(a)<=1e-10||Math.abs(Math.abs(r)-t)<=1e-10)&&(n=this.x0,o=r>=0?this.y0+Math.PI*this.R*Math.tan(.5*s):this.y0+Math.PI*this.R*-Math.tan(.5*s));var l=.5*Math.abs(Math.PI/a-a/Math.PI),c=l*l,u=Math.sin(s),d=Math.cos(s),p=d/(u+d-1),h=p*p,g=p*(2/u-1),m=g*g,f=Math.PI*this.R*(l*(p-m)+Math.sqrt(c*(p-m)*(p-m)-(m+c)*(h-m)))/(m+c);a<0&&(f=-f),n=this.x0+f;var y=c+p;return f=Math.PI*this.R*(g*y-l*Math.sqrt((m+c)*(c+1)-y*y))/(m+c),o=r>=0?this.y0+f:this.y0-f,e.x=n,e.y=o,e},inverse:function(e){var t,n,o,i,r,a,s,l,c,u,d,p;return e.x-=this.x0,e.y-=this.y0,d=Math.PI*this.R,r=(o=e.x/d)*o+(i=e.y/d)*i,d=3*(i*i/(l=-2*(a=-Math.abs(i)*(1+r))+1+2*i*i+r*r)+(2*(s=a-2*i*i+o*o)*s*s/l/l/l-9*a*s/l/l)/27)/(c=(a-s*s/3/l)/l)/(u=2*Math.sqrt(-c/3)),Math.abs(d)>1&&(d=d>=0?1:-1),p=Math.acos(d)/3,n=e.y>=0?(-u*Math.cos(p+Math.PI/3)-s/3/l)*Math.PI:-(-u*Math.cos(p+Math.PI/3)-s/3/l)*Math.PI,t=Math.abs(o)<1e-10?this.long0:x(this.long0+Math.PI*(r-1+Math.sqrt(1+2*(o*o-i*i)+r*r))/2/o),e.x=t,e.y=n,e},names:["Van_der_Grinten_I","VanDerGrinten","vandg"]},pt={init:function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},forward:function(e){var n,o,i,r,a,s,l,c,u,d,p,h,g,m,f,y,A,v,C,I,b,w,E=e.x,_=e.y,S=Math.sin(e.y),M=Math.cos(e.y),P=x(E-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=1e-10?(e.x=this.x0+this.a*(t-_)*Math.sin(P),e.y=this.y0-this.a*(t-_)*Math.cos(P),e):Math.abs(this.sin_p12+1)<=1e-10?(e.x=this.x0+this.a*(t+_)*Math.sin(P),e.y=this.y0+this.a*(t+_)*Math.cos(P),e):(v=this.sin_p12*S+this.cos_p12*M*Math.cos(P),A=(y=Math.acos(v))?y/Math.sin(y):1,e.x=this.x0+this.a*A*M*Math.sin(P),e.y=this.y0+this.a*A*(this.cos_p12*S-this.sin_p12*M*Math.cos(P)),e):(n=qe(this.es),o=We(this.es),i=He(this.es),r=Ye(this.es),Math.abs(this.sin_p12-1)<=1e-10?(a=this.a*Ve(n,o,i,r,t),s=this.a*Ve(n,o,i,r,_),e.x=this.x0+(a-s)*Math.sin(P),e.y=this.y0-(a-s)*Math.cos(P),e):Math.abs(this.sin_p12+1)<=1e-10?(a=this.a*Ve(n,o,i,r,t),s=this.a*Ve(n,o,i,r,_),e.x=this.x0+(a+s)*Math.sin(P),e.y=this.y0+(a+s)*Math.cos(P),e):(l=S/M,c=Je(this.a,this.e,this.sin_p12),u=Je(this.a,this.e,S),d=Math.atan((1-this.es)*l+this.es*c*this.sin_p12/(u*M)),C=0===(p=Math.atan2(Math.sin(P),this.cos_p12*Math.tan(d)-this.sin_p12*Math.cos(P)))?Math.asin(this.cos_p12*Math.sin(d)-this.sin_p12*Math.cos(d)):Math.abs(Math.abs(p)-Math.PI)<=1e-10?-Math.asin(this.cos_p12*Math.sin(d)-this.sin_p12*Math.cos(d)):Math.asin(Math.sin(P)*Math.cos(d)/Math.sin(p)),h=this.e*this.sin_p12/Math.sqrt(1-this.es),y=c*C*(1-(I=C*C)*(f=(g=this.e*this.cos_p12*Math.cos(p)/Math.sqrt(1-this.es))*g)*(1-f)/6+(b=I*C)/8*(m=h*g)*(1-2*f)+(w=b*C)/120*(f*(4-7*f)-3*h*h*(1-7*f))-w*C/48*m),e.x=this.x0+y*Math.sin(p),e.y=this.y0+y*Math.cos(p),e))},inverse:function(e){var n,o,i,r,a,s,l,c,u,d,p,h,g,m,f,y,A,v,C,I,b,w,E;if(e.x-=this.x0,e.y-=this.y0,this.sphere){if((n=Math.sqrt(e.x*e.x+e.y*e.y))>2*t*this.a)return;return o=n/this.a,i=Math.sin(o),r=Math.cos(o),a=this.long0,Math.abs(n)<=1e-10?s=this.lat0:(s=et(r*this.sin_p12+e.y*i*this.cos_p12/n),l=Math.abs(this.lat0)-t,a=Math.abs(l)<=1e-10?this.lat0>=0?x(this.long0+Math.atan2(e.x,-e.y)):x(this.long0-Math.atan2(-e.x,e.y)):x(this.long0+Math.atan2(e.x*i,n*this.cos_p12*r-e.y*this.sin_p12*i))),e.x=a,e.y=s,e}return c=qe(this.es),u=We(this.es),d=He(this.es),p=Ye(this.es),Math.abs(this.sin_p12-1)<=1e-10?(h=this.a*Ve(c,u,d,p,t),n=Math.sqrt(e.x*e.x+e.y*e.y),s=Ke((h-n)/this.a,c,u,d,p),a=x(this.long0+Math.atan2(e.x,-1*e.y)),e.x=a,e.y=s,e):Math.abs(this.sin_p12+1)<=1e-10?(h=this.a*Ve(c,u,d,p,t),n=Math.sqrt(e.x*e.x+e.y*e.y),s=Ke((n-h)/this.a,c,u,d,p),a=x(this.long0+Math.atan2(e.x,e.y)),e.x=a,e.y=s,e):(n=Math.sqrt(e.x*e.x+e.y*e.y),f=Math.atan2(e.x,e.y),g=Je(this.a,this.e,this.sin_p12),y=Math.cos(f),v=-(A=this.e*this.cos_p12*y)*A/(1-this.es),C=3*this.es*(1-v)*this.sin_p12*this.cos_p12*y/(1-this.es),w=1-v*(b=(I=n/g)-v*(1+v)*Math.pow(I,3)/6-C*(1+3*v)*Math.pow(I,4)/24)*b/2-I*b*b*b/6,m=Math.asin(this.sin_p12*Math.cos(b)+this.cos_p12*Math.sin(b)*y),a=x(this.long0+Math.asin(Math.sin(f)*Math.sin(b)/Math.cos(m))),E=Math.sin(m),s=Math.atan2((E-this.es*w*this.sin_p12)*Math.tan(m),E*(1-this.es)),e.x=a,e.y=s,e)},names:["Azimuthal_Equidistant","aeqd"]},ht={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(e){var t,n,o,i,r,a,s,l=e.x,c=e.y;return o=x(l-this.long0),t=Math.sin(c),n=Math.cos(c),i=Math.cos(o),((r=this.sin_p14*t+this.cos_p14*n*i)>0||Math.abs(r)<=1e-10)&&(a=1*this.a*n*Math.sin(o),s=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*n*i)),e.x=a,e.y=s,e},inverse:function(e){var n,o,i,r,a,s,l;return e.x-=this.x0,e.y-=this.y0,n=Math.sqrt(e.x*e.x+e.y*e.y),o=et(n/this.a),i=Math.sin(o),r=Math.cos(o),s=this.long0,Math.abs(n)<=1e-10?(l=this.lat0,e.x=s,e.y=l,e):(l=et(r*this.sin_p14+e.y*i*this.cos_p14/n),a=Math.abs(this.lat0)-t,Math.abs(a)<=1e-10?(s=this.lat0>=0?x(this.long0+Math.atan2(e.x,-e.y)):x(this.long0-Math.atan2(-e.x,e.y)),e.x=s,e.y=l,e):(s=x(this.long0+Math.atan2(e.x*i,n*this.cos_p14*r-e.y*this.sin_p14*i)),e.x=s,e.y=l,e))},names:["ortho"]},gt=1,mt=2,ft=3,yt=4,At=5,vt=6,Ct=1,It=2,bt=3,wt=4;function Et(e,n,o,r){var s;return e<1e-10?(r.value=Ct,s=0):(s=Math.atan2(n,o),Math.abs(s)<=i?r.value=Ct:s>i&&s<=t+i?(r.value=It,s-=t):s>t+i||s<=-(t+i)?(r.value=bt,s=s>=0?s-a:s+a):(r.value=wt,s+=t)),s}function _t(e,t){var n=e+t;return n<-a?n+=r:n>+a&&(n-=r),n}var St,Mt={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=t-i/2?this.face=At:this.lat0<=-(t-i/2)?this.face=vt:Math.abs(this.long0)<=i?this.face=gt:Math.abs(this.long0)<=t+i?this.face=this.long0>0?mt:yt:this.face=ft,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(e){var n,o,r,s,l,c,u={x:0,y:0},d={value:0};if(e.x-=this.long0,n=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(e.y)):e.y,o=e.x,this.face===At)s=t-n,o>=i&&o<=t+i?(d.value=Ct,r=o-t):o>t+i||o<=-(t+i)?(d.value=It,r=o>0?o-a:o+a):o>-(t+i)&&o<=-i?(d.value=bt,r=o+t):(d.value=wt,r=o);else if(this.face===vt)s=t+n,o>=i&&o<=t+i?(d.value=Ct,r=-o+t):o=-i?(d.value=It,r=-o):o<-i&&o>=-(t+i)?(d.value=bt,r=-o-t):(d.value=wt,r=o>0?-o+a:-o-a);else{var p,h,g,m,f,y;this.face===mt?o=_t(o,+t):this.face===ft?o=_t(o,+a):this.face===yt&&(o=_t(o,-t)),m=Math.sin(n),f=Math.cos(n),y=Math.sin(o),p=f*Math.cos(o),h=f*y,g=m,this.face===gt?r=Et(s=Math.acos(p),g,h,d):this.face===mt?r=Et(s=Math.acos(h),g,-p,d):this.face===ft?r=Et(s=Math.acos(-p),g,-h,d):this.face===yt?r=Et(s=Math.acos(-h),g,p,d):(s=r=0,d.value=Ct)}return c=Math.atan(12/a*(r+Math.acos(Math.sin(r)*Math.cos(i))-t)),l=Math.sqrt((1-Math.cos(s))/(Math.cos(c)*Math.cos(c))/(1-Math.cos(Math.atan(1/Math.cos(r))))),d.value===It?c+=t:d.value===bt?c+=a:d.value===wt&&(c+=1.5*a),u.x=l*Math.cos(c),u.y=l*Math.sin(c),u.x=u.x*this.a+this.x0,u.y=u.y*this.a+this.y0,e.x=u.x,e.y=u.y,e},inverse:function(e){var n,o,i,r,s,l,c,u,d,p,h,g,m={lam:0,phi:0},f={value:0};if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,o=Math.atan(Math.sqrt(e.x*e.x+e.y*e.y)),n=Math.atan2(e.y,e.x),e.x>=0&&e.x>=Math.abs(e.y)?f.value=Ct:e.y>=0&&e.y>=Math.abs(e.x)?(f.value=It,n-=t):e.x<0&&-e.x>=Math.abs(e.y)?(f.value=bt,n=n<0?n+a:n-a):(f.value=wt,n+=t),d=a/12*Math.tan(n),s=Math.sin(d)/(Math.cos(d)-1/Math.sqrt(2)),l=Math.atan(s),(c=1-(i=Math.cos(n))*i*(r=Math.tan(o))*r*(1-Math.cos(Math.atan(1/Math.cos(l)))))<-1?c=-1:c>1&&(c=1),this.face===At)u=Math.acos(c),m.phi=t-u,f.value===Ct?m.lam=l+t:f.value===It?m.lam=l<0?l+a:l-a:f.value===bt?m.lam=l-t:m.lam=l;else if(this.face===vt)u=Math.acos(c),m.phi=u-t,f.value===Ct?m.lam=-l+t:f.value===It?m.lam=-l:f.value===bt?m.lam=-l-t:m.lam=l<0?-l-a:-l+a;else{var y,A,v;d=(y=c)*y,A=(d+=(v=d>=1?0:Math.sqrt(1-d)*Math.sin(l))*v)>=1?0:Math.sqrt(1-d),f.value===It?(d=A,A=-v,v=d):f.value===bt?(A=-A,v=-v):f.value===wt&&(d=A,A=v,v=-d),this.face===mt?(d=y,y=-A,A=d):this.face===ft?(y=-y,A=-A):this.face===yt&&(d=y,y=A,A=-d),m.phi=Math.acos(-v)-t,m.lam=Math.atan2(A,y),this.face===mt?m.lam=_t(m.lam,-t):this.face===ft?m.lam=_t(m.lam,-a):this.face===yt&&(m.lam=_t(m.lam,+t))}return 0!==this.es&&(p=m.phi<0?1:0,h=Math.tan(m.phi),g=this.b/Math.sqrt(h*h+this.one_minus_f_squared),m.phi=Math.atan(Math.sqrt(this.a*this.a-g*g)/(this.one_minus_f*g)),p&&(m.phi=-m.phi)),m.lam+=this.long0,e.x=m.lam,e.y=m.phi,e},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},Pt=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],xt=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],kt=o/5,Gt=function(e,t){return e[0]+t*(e[1]+t*(e[2]+t*e[3]))},Rt={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(e){var t=x(e.x-this.long0),n=Math.abs(e.y),i=Math.floor(n*kt);i<0?i=0:i>=18&&(i=17);var r={x:Gt(Pt[i],n=o*(n-.08726646259971647*i))*t,y:Gt(xt[i],n)};return e.y<0&&(r.y=-r.y),r.x=r.x*this.a*.8487+this.x0,r.y=r.y*this.a*1.3523+this.y0,r},inverse:function(e){var o={x:(e.x-this.x0)/(.8487*this.a),y:Math.abs(e.y-this.y0)/(1.3523*this.a)};if(o.y>=1)o.x/=Pt[18][0],o.y=e.y<0?-t:t;else{var i=Math.floor(18*o.y);for(i<0?i=0:i>=18&&(i=17);;)if(xt[i][0]>o.y)--i;else{if(!(xt[i+1][0]<=o.y))break;++i}var r=xt[i],a=5*(o.y-r[0])/(xt[i+1][0]-r[0]);a=function(e,t,n,o){for(var i=t;o;--o){var r=e(i);if(i-=r,Math.abs(r)1&&console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored");var r=function(e,t,n){for(var o=[],i=0;i3?o.splice(3,o.length-1):[],void 0!==this.listeners[e]?this.listeners[e].push({scope:n,callback:t,args:o}):this.listeners[e]=[{scope:n,callback:t,args:o}]},removeEventListener:function(e,t,n){if(void 0!==this.listeners[e]){for(var o=this.listeners[e].length,i=[],r=0;r0;for(var i=0;i2?o.splice(2,o.length-1):[],o=[n].concat(o),void 0!==this.listeners[e]){var a=this.listeners[e].slice(),s=a.length;for(r=0;r0?r.replace("%var%",i.join(" - ")):r.replace("%var%","%var% (not specified)")}catch(e){}return r}},I={normalyzeParameters:function(e){var t=null;if(e){var n=[];for(var o in e)if(e.hasOwnProperty(o)){var i=e[o];i||(i=""),n.push(o+"="+i)}t=n.join("&")}return t},normalyzeUrl:function(e,t,n){var o=e;if(e){if(e.split("?").length-1>=2){var i=e.search(/\?/)+1;o=e.substring(0,i)+e.slice(i).replace(/\?/g,"&")}var r=e.indexOf("?");-1===r&&(o+="?"),-1!==r&&r!==e.length-1&&(o+="&")}return t&&(o+="string"==typeof t?t=t.replace("?",""):this.normalyzeParameters(t)),n&&(o=encodeURIComponent(o)),o},indent:function(e,t){return new Array((e||0)+1).join("\t")+t}},b=n(64),w=n.n(b),E={call:function(e){var t=v.getLogger("XHR");if(t.trace("[XHR::call()]"),w.a.polyfill(),!e.url)throw new Error("missing parameter : url is not defined !");if(!e.method)throw new Error("missing parameter : method is not defined !");e.format||(e.format="text");var n={};switch(n.url=e.url,n.data=e.data?e.data:null,n.method=e.method,n.timeOut=e.timeOut||0,n.scope=e.scope||this,n.proxy=e.proxy||null,n.content=e.content||null,n.headers=e.headers||{referer:"http://localhost"},e.method){case"DELETE":case"GET":break;case"PUT":case"POST":n.content=e.content?e.content:"application/x-www-form-urlencoded",n.headers=e.headers?e.headers:{referer:"http://localhost"};break;case"HEAD":case"OPTIONS":throw new Error("HTTP method not yet supported !");default:throw new Error("HTTP method unknown !")}switch(e.format){case"text":this.__call(n).then((function(n){t.trace(n),e.onResponse.call(this,n)})).catch((function(t){e.onFailure.call(this,t)}));break;case"json":this.__callJSON(n).then((function(n){t.trace(n),e.onResponse.call(this,n)})).catch((function(t){e.onFailure.call(this,t)}));break;case"xml":this.__callXML(n).then((function(n){t.trace(n),e.onResponse.call(this,n)})).catch((function(t){e.onFailure.call(this,t)}));break;default:throw new Error("This output Format is not yet supported !")}},__call:function(e){var t=v.getLogger("XHR");return t.trace("[XHR::__call()]"),new Promise((function(o,i){var r="POST"===e.method||"PUT"===e.method?1:0;e.data&&("object"==typeof e.data&&Object.keys(e.data).length||"string"==typeof e.data&&e.data.length)&&!r&&(e.url=I.normalyzeUrl(e.url,e.data)),t.trace("URL = ",e.url);var a=null;if("undefined"==typeof window){var s=n(59),l={headers:{Referer:"https://localhost"}};return e.data&&"string"==typeof e.data&&r&&(l={method:e.method,body:e.data,headers:{"Content-Type":e.content,Referer:"https://localhost"}}),s(e.url,l).then((function(e){if(e.ok)o(e.text());else{var t="Errors Occured on Http Request (status : '"+e.statusText+"' | url : '"+e.url+"')",n=e.status;i({message:t,status:n})}})).catch((function(e){i({message:e,status:-1})}))}if(window.XMLHttpRequest){t.trace("XMLHttpRequest"),(a=new XMLHttpRequest).open(e.method,e.url,!0),a.overrideMimeType=e.content;var c=null;e.timeOut>0&&(t.trace("XHR - TimeOut actif !"),c=window.setTimeout((function(){i({message:"TimeOut Occured on Http Request with XMLHttpRequest !",status:-1})}),e.timeOut)),r&&(t.trace("data = ",e.data),a.setRequestHeader("Content-type",e.content)),a.onerror=function(e){console.log(e),i(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(e){console.log(e),i(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onreadystatechange=function(e){if(4===a.readyState)if(200===a.status)window.clearTimeout(c),o(a.response);else{var t="Errors Occured on Http Request (status : '"+e.target.statusText+"' | url : '"+e.target.responseURL+"' | response : '"+e.target.response+"')",n=e.target.status;i({message:t,status:n})}};var u=e.data&&r?e.data:null;a.send(u)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");t.trace("XDomainRequest"),(a=new XDomainRequest).open(e.method,e.url),a.overrideMimeType=e.content,e.timeOut>0&&(a.timeout=e.timeout,t.trace("XHR - TimeOut actif !")),r&&a.setRequestHeader("Content-type",e.content),a.onerror=function(){i(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(){i(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onload=function(e){if(200===a.status)o(a.responseText);else{var t="Errors Occured on Http Request (status : '"+e.target.statusText+"' | url : '"+e.target.responseURL+"')",n=e.target.status;i({message:t,status:n})}};var d=e.data&&r?e.data:null;a.send(d)}}))},__callJSON:function(e){return this.__call(e).then(JSON.parse).catch((function(t){console.log("_callJSON failed on : ",e.url,t)}))},__callXML:function(e){return this.__call(e).then((function(e){var t;"undefined"==typeof window?t=(new(0,n(60).DOMParser)).parseFromString(e,"text/xml"):window.DOMParser?t=(new window.DOMParser).parseFromString(e,"text/xml"):((t=new window.ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t})).catch((function(t){console.log("__callXML failed on : ",e.url,t)}))}},_={uuid:(o=Math.floor(Date.now()),function(){return o++}),call:function(e){var t=v.getLogger("JSONP");if(t.trace("[JSONP::call ()]"),!e)throw t.error("missing parameter : options !"),new Error("missing parameter : options !");if(!e.url)throw t.error("missing parameter : options.url !"),new Error("missing parameter : options.url !");if(e.timeOut||(t.info("setting 'options.timeOut' default value"),e.timeOut=0),!e.onResponse)throw t.error("missing parameter : options.onResponse !"),new Error("missing parameter : options.onResponse !");var n="string"==typeof e.callbackSuffix?e.callbackSuffix:this.uuid(),o=!1,i=!1,r=e.url.indexOf("callback=");if(-1!==r){o=!0;var a=e.url.indexOf("&",r);-1===a&&(a=e.url.length);var s=e.url.substring(r+9,a);s&&(i=!0,e.callbackName=s,t.info("setting 'options.callbackName' value ("+e.callbackName+") from 'options.url' parameter"))}if(!o){var l=e.url.indexOf("?");-1===l?e.url=e.url+"?callback=":l===e.url.length?e.url=e.url+"callback=":e.url=e.url+"&callback=",t.info("setting callback default key in 'options.url' : "+e.url)}var c=!!e.callbackName||i;if(i||(e.callbackName||(t.info("setting 'options.callbackName' default value"),e.callbackName="callback",(n||""===n)&&(e.callbackName+=n)),e.url=e.url.replace("callback=","callback="+e.callbackName),t.info("setting callback function name in 'options.url' : "+e.url)),e.onTimeOut||(t.info("setting 'options.onTimeOut' default value"),e.onTimeOut=function(){console.log("TimeOut while invoking url : "+e.url)}),!c){var u=this,d=null;e.timeOut>0&&(d=window.setTimeout((function(){window[e.callbackName]=function(){},e.onTimeOut(),u._deleteScript(n)}),e.timeOut)),window[e.callbackName]=function(t){window.clearTimeout(d),e.onResponse(t),u._deleteScript(n)}}this._createScript(n,e.url)},_createScript:function(e,t){var n,o=document.getElementById("results"+e);(n=document.createElement("script")).setAttribute("type","text/javascript"),n.setAttribute("src",t),n.setAttribute("charset","UTF-8"),n.setAttribute("id","results"+e),n.setAttribute("async","true");var i=document.documentElement||document.getElementsByTagName("head")[0];null===o?i.appendChild(n):i.replaceChild(n,o)},_deleteScript:function(e){var t=document.getElementById("results"+e);if(t){var n=t.parentNode||document.documentElement;if(!n)return;n.removeChild(t)}}},S={send:function(e){var t=e||{method:"GET",protocol:"XHR",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("undefined"!=typeof window||"JSONP"!==e.protocol){if("XHR"===e.protocol||"json"===e.format?t.wrap=!1:"JSONP"===e.protocol&&"xml"===e.format&&(t.wrap=!0),t.callback=null,t.output=t.wrap?"json":null,t.wrap){var n={};n.output=t.output,n.callback=t.callback,delete n.callback,t.url=I.normalyzeUrl(e.url,n)}switch(t.protocol){case"XHR":"GET"===e.method&&e.nocache&&(t.url=I.normalyzeUrl(t.url,{t:(new Date).getTime()})),E.call(t);break;case"JSONP":t.data&&(t.url=I.normalyzeUrl(t.url,t.data)),_.call(t);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}else console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS")}};function M(e){if(!(this instanceof M))throw new TypeError("ErrorService constructor cannot be called as a function.");var t=e;"string"==typeof e||e instanceof String?(this.message=e,this.status=-1,this.type=M.TYPE_UNKERR):(this.message=t.message||"undefined!?",this.type=t.type,this.status=t.status||-1),this.name="ErrorService",this.stack=(new Error).stack}M.TYPE_SRVERR="SERVICE_ERROR",M.TYPE_USEERR="USAGE_ERROR",M.TYPE_UNKERR="UNKNOWN_ERROR",M.prototype=Object.create(Error.prototype,{constructor:{value:M,writable:!0,configurable:!0}});var P=M,x=n(31);function k(e){if(!(this instanceof k))throw new TypeError(C.getMessage("CLASS_CONSTRUCTOR"));for(var t in this.logger=v.getLogger("CommonService"),this.logger.trace("[Constructeur CommonService (options)]"),this.options={protocol:"XHR",ssl:!0,proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(e){console.log("onSuccess - la reponse est la suivante : ",e)},onFailure:function(e){200!==e.status&&e.status?console.log("onFailure - Erreur (",e.status,") : ",e.message):console.log("onFailure : ",e.message)}},e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);if(this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(e){console.log("onSuccess - la réponse brute du service est la suivante : ",e)}),!!(null===this.options.onSuccess||"function"!=typeof this.options.onSuccess))throw new Error(C.getMessage("PARAM_MISSING","onSuccess()"));switch(this.options.httpMethod="string"==typeof e.httpMethod?e.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(C.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(C.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof e.protocol?e.protocol.toUpperCase():"XHR",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(C.getMessage("PARAM_UNKNOWN","protocol"))}if("undefined"==typeof window&&"JSONP"===this.options.protocol)throw new Error(C.getMessage("PARAM_NOT_SUPPORT_NODEJS","protocol=JSONP (instead use XHR)"));"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=e.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}k.prototype={constructor:k,call:function(){this.logger.trace("CommonService::call ()");var e=this;function t(t){this.logger.trace("CommonService::onBuildRequest : ",t),this.callService.call(e,i,n)}function n(t){this.logger.trace("CommonService::onCallService : ",t),this.analyzeResponse.call(e,i,o)}function o(e){if(this.logger.trace("CommonService::onAnalyzeResponse : ",e),!e)return i.call(this,new P("Analyse de la reponse en échec !?"));this.options.onSuccess.call(this,e)}function i(e){this.logger.trace("CommonService::onError()");var t=e;t instanceof P||(t=new P(e.message)),this.options.onFailure.call(this,t)}(function(){this.logger.trace("CommonService::run ()"),this.buildRequest.call(e,i,t)}).call(e)},buildRequest:function(e,t){this.logger.error("overwritten method !"),e&&e.call(this,"This method must be overwritten !"),t.call(this,"This method must be overwritten !")},callService:function(e,t){var n=null,o=this.request,i=!(!this.options.proxyURL||"XHR"!==this.options.protocol),r={"gp-access-lib":x.version};this.options.apiKey&&(r.apiKey=this.options.apiKey),this.options.serverUrl=I.normalyzeUrl(this.options.serverUrl,r,!1),i&&("GET"===this.options.httpMethod&&(n=this.options.proxyURL+I.normalyzeUrl(this.options.serverUrl,this.request,!0),o=null),"POST"===this.options.httpMethod&&(n=this.options.proxyURL+I.normalyzeUrl(this.options.serverUrl,null,!0),o=this.request));var a=this,s={url:n||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:o,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(n){a.logger.trace("callService::onResponse()");var o=null;if("XHR"===a.options.protocol&&(a.logger.trace("Response XHR",n),o=n),"JSONP"===a.options.protocol){if(a.logger.trace("Response JSON",n),!n)return void e.call(a,new P("Le contenu de la reponse est vide !?"));if(n.http){if(200!==n.http.status)return void e.call(a,new P({status:n.http.status,message:n.http.error,type:P.TYPE_SRVERR}));o=n.xml,a.options.rawResponse&&(o=n)}else o=n}if("function"==typeof a.options.onBeforeParse){var i=a.options.onBeforeParse(o);"string"==typeof i&&(o=i)}a.response=o,t.call(a,o)},onFailure:function(t){a.logger.trace("callService::onFailure()"),t.type=P.TYPE_SRVERR,e.call(a,new P(t))},onTimeOut:function(){a.logger.trace("callService::onTimeOut()"),e.call(a,new P("TimeOut!"))}};S.send(s)},analyzeResponse:function(e,t){this.logger.error("overwritten method !"),e&&e.call(this,"This method must be overwritten !"),t.call(this,"This method must be overwritten !")}};var G=k,R={ssl:!0,newUrl:function(e){return(!1===R.ssl?"http://":"https://")+"data.geopf.fr"+e},Alti:{new_key:{"elevation-json":"/altimetrie/1.0/calcul/alti/rest/elevation.json","elevation-xml":"/altimetrie/1.0/calcul/alti/rest/elevation.xml","profil-json":"/altimetrie/1.0/calcul/alti/rest/elevationLine.json","profil-xml":"/altimetrie/1.0/calcul/alti/rest/elevationLine.xml"},newUrl:function(){return{"elevation-json":R.newUrl(this.new_key["elevation-json"]),"elevation-xml":R.newUrl(this.new_key["elevation-xml"]),"profil-json":R.newUrl(this.new_key["profil-json"]),"profil-xml":R.newUrl(this.new_key["profil-xml"])}}},ProcessIsoCurve:{new_key:"/navigation/isochrone",newUrl:function(){return R.newUrl(this.new_key)}},Config:{_key:"https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/",url:function(e){Array.isArray(e)||(e=e.split(","));for(var t=[],n=0;no(e,{credentials:"same-origin"}).then(e=>{if(e.ok)return e.json().then(e=>e).catch(e=>{throw new Error("Exception Json : "+e)});throw new Error("Exception HTTP : "+e.status+" (status code) !")}).catch(e=>new Promise((t,n)=>{n(e)})),a=[];for(let e=0;e{if(!e)throw new Error("results config empty !?");e.forEach(e=>{this.listConfigResults.push(e)})}).then(()=>{t.call(this,this.listConfigResults)}).catch(t=>{e.call(this,t)})},j=function(e,t){this.listConfigResults=[];for(var n=0;nt||e__IDENTIFIER__\x3c!-- __DATAINPUTS__ --\x3e__RAWDATAOUTPUT__',input:"__KEY____DATA__"}},namespaceByDefault:function(){return['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'].join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){this.logger.trace("WPS::processRequestString ()");var e="";if("POST"===this.method)e=this.template.post.value;else{if("GET"!==this.method)return this.logger.error("No other method supported by the service !"),!1;e=this.template.get.value}return e=(e=(e=(e=(e=e.replace(/__SERVICE__/g,this.paramservice)).replace(/__VERSION__/g,this.paramversion)).replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput)).replace(/__IDENTIFIER__/g,this.paramidentifier)).replace(/__REQUEST__/g,this.paramrequest),"POST"===this.method&&(e=(e=e.replace(/__NAMESPACE__/g,this.namespaceByDefault)).replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),(e=e.replace(//g,this.__addDataInputs()))?(this.requestString=e,this.logger.trace("traduction tmpl",e),!0):(this.logger.warn("traduction tmpl : empty request !?"),!1)},__addDataInputs:function(){this.logger.trace("WPS::__addDataInputs ()");for(var e,t="GET"===this.method?this.template.get.input:this.template.post.input,n="GET"===this.method?";":"",o="",i=this,r=this.DataObject.getData(),a=0;a0)for(var a=o.getElementsByTagName("parsererror"),s=0;s0){var o=function(e){if(e.attributes.length>0){for(var t={},n=e.attributes,o=0;o0?t.index=t.filters.type[0]:t.index=t.filters.type),delete t.filters.type),t.filters.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),delete t.filters.bbox)),delete t.filterOptions),t.position&&(t.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),t.position.lon||(t.position.lon=t.position.x),delete t.position.x),t.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),t.position.lat||(t.position.lat=t.position.y),delete t.position.y)),t.returnFreeForm&&(this.logger.warn("The parameter 'returnFreeForm' is deprecated"),delete t.returnFreeForm),t.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete t.srs),t},_e.prototype.buildRequest=function(e,t){var n={httpMethod:this.options.httpMethod,geocodeMethod:"search",query:this.options.query,index:this.options.index,returnTrueGeometry:this.options.returnTrueGeometry,position:this.options.position,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=fe.build(n),this.request?t.call(this,this.request):e.call(this,new P(C.getMessage("SERVICE_REQUEST_BUILD")))},_e.prototype.analyzeResponse=function(e,t){if(this.response){var n={response:this.response,rawResponse:this.options.rawResponse,onError:e,onSuccess:t,scope:this};Ee.build(n)}else e.call(this,new P(C.getMessage("SERVICE_RESPONSE_EMPTY")))};var Se=_e;function Me(e){if(!(this instanceof Me))throw new TypeError(C.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));this.CLASSNAME="ReverseGeocode",this.logger=v.getLogger("Gp.Services.ReverseGeocode"),this.logger.trace("[Constructeur ReverseGeocode (options)]");var t=this.patchOptionConvertor(e);if(t.serverUrl||(t.serverUrl=T.ReverseGeocode.newUrl()),G.apply(this,[t]),t.searchGeometry)this.options.searchGeometry=t.searchGeometry;else if(!t.position)throw new Error(C.getMessage("PARAM_MISSING","searchGeometry"));if(t.index||(this.options.index=t.index="StreetAddress"),t.filters)for(var n=Object.keys(t.filters),o=0;o0?t.index=t.filterOptions.type[0]:t.index=t.filterOptions.type),delete t.filterOptions.type),t.filterOptions.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),t.searchGeometry||(t.searchGeometry=this.bbox2Json(t.filterOptions.bbox)),delete t.filterOptions.bbox),t.filterOptions.circle&&(this.logger.warn("The parameter 'filterOptions.circle' is deprecated"),t.searchGeometry||(t.searchGeometry=this.circle2Json(t.filterOptions.circle)),delete t.filterOptions.circle),t.filterOptions.polygon&&(this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"),t.searchGeometry||(t.searchGeometry=this.polygon2Json(t.filterOptions.polygon)),delete t.filterOptions.polygon),!t.filters&&Object.keys(t.filterOptions).length>0&&(t.filters=t.filterOptions),delete t.filterOptions),t.position&&(t.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),t.position.lon||(t.position.lon=t.position.x),delete t.position.x),t.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),t.position.lat||(t.position.lat=t.position.y),delete t.position.y)),t.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete t.srs),t},Me.prototype.buildRequest=function(e,t){var n={httpMethod:this.options.httpMethod,geocodeMethod:"reverse",searchGeometry:this.options.searchGeometry,index:this.options.index,position:this.options.position,returnTrueGeometry:this.options.returnTrueGeometry,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=fe.build(n),this.request?t.call(this,this.request):e.call(this,new P(C.getMessage("SERVICE_REQUEST_BUILD")))},Me.prototype.analyzeResponse=function(e,t){if(this.response){var n={response:this.response,rawResponse:this.options.rawResponse,onError:e,onSuccess:t,scope:this};Ee.build(n)}else e.call(this,new P(C.getMessage("SERVICE_RESPONSE_EMPTY")))},Me.prototype.bbox2Json=function(e){return{type:"Polygon",coordinates:[[[e.left,e.top],[e.right,e.top],[e.right,e.bottom],[e.left,e.bottom],[e.left,e.top]]]}},Me.prototype.circle2Json=function(e){return{type:"Circle",radius:e.radius,coordinates:[e.x,e.y]}},Me.prototype.polygon2Json=function(e){for(var t={type:"Polygon",coordinates:[[]]},n=0;n=5e4&&(this.distanceUnit="km",this.costValue/=1e3)):(this.costType="time",this.costValue=this.options.time)}Je.CLASSNAME="ProcessIsoCurveParam",Je.prototype={constructor:Je,getLocation:function(){return this.point.x+","+this.point.y},getDistanceUnit:function(){return"m"===this.distanceUnit?"meter":"km"===this.distanceUnit?"kilometer":""},getConstraints:function(){var e=[];if(0!==this.constraints.length)for(var t=0;t0)for(var o in t.noProxyDomains)if(n.trace("[ProxyUtils] proxifyUrl : analyzing "+t.noProxyDomains[o]),-1!==e.indexOf(t.noProxyDomains[o]))return n.info("[ProxyUtils] proxifyUrl : "+e+" found in noProxyDomains list ("+t.noProxyDomains[o]+")."),e;return t.proxyUrl+encodeURIComponent(e)}};function ut(e){return(ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var dt=lt.getLogger("GfiUtils"),pt={getLayerFormat:function(e){var t="function"==typeof e.getType?e.getType():null,n=e.getSource();if(t){if("VECTOR"===t||"VECTOR_TILE"===t)return"vector";if("TILE"===t)return n.tileGrid?"wmts":"wms";if("IMAGE"===t)return"wms"}else{if(n instanceof p.a||n instanceof f.a)return"wms";if(n instanceof g.a)return"wmts";if(n instanceof u.a||n instanceof l.a)return"vector"}return"unknown"},displayInfo:function(e,t,o,i,r){if(dt.trace("[GfiUtils] : displayInfo..."),i||(i="text/html"),null!==o){var s=null,l=o;l=(l=l.replace(/\n/g,"")).replace(/(>)\s*(<)/g,"$1$2");var c="undefined"!=typeof window?window:null;if("object"===("undefined"==typeof exports?"undefined":ut(exports))&&null===window)s=(new(0,n(62).DOMParser)).parseFromString(l,i);else if(c.DOMParser)s=(new c.DOMParser).parseFromString(l,i);else{if(!c.ActiveXObject)return dt.log("Incompatible environment for DOM Parser !"),!1;(s=new c.ActiveXObject("Microsoft.XMLDOM")).async=!1,s.loadXML(l)}var u=s.getElementsByTagName("body");if(u&&1===u.length&&!u[0].hasChildNodes())return!1;var d=document.createElement("div");d.className="gp-feature-info-div";var p=document.createElement("input");p.type="button",p.className="gp-styling-button closer",p.onclick=function(){return e.featuresOverlay&&(e.removeOverlay(e.featuresOverlay),e.featuresOverlay=null),!1};var h=document.createElement("div");return h.className="gp-features-content-div",h.innerHTML=o,d.appendChild(h),d.appendChild(p),e.featuresOverlay&&(e.removeOverlay(e.featuresOverlay),e.featuresOverlay=null),e.featuresOverlay=new a.a({element:d,autoPan:r.autoPan,autoPanAnimation:r.autoPanAnimation,autoPanMargin:r.autoPanMargin,positioning:"bottom-center",insertFirst:!1,stopEvent:!0}),e.addOverlay(e.featuresOverlay),e.featuresOverlay.setPosition(t),e.featuresOverlay.render(),!0}},features2html:function(e,t){var n=document.createElement("div");return t.forEach((function(e){var t=e.getProperties();if(t.hasOwnProperty("render"))n.insertAdjacentHTML("beforeend",t.render);else{if(t.hasOwnProperty("name")){var o=document.createElement("div");o.className="gp-att-name-div",o.insertAdjacentHTML("afterbegin",t.name),n.appendChild(o)}if(t.hasOwnProperty("description")){var i=document.createElement("div");i.className="gp-att-description-div",i.insertAdjacentHTML("afterbegin",t.description),n.appendChild(i)}var r=null,a=!1,s=null,l=null,c=null,u=["fill","fill-opacity","stroke","stroke-opacity","stroke-width","marker-symbol","marker-color","marker-size","geometry","value","name","description","styleUrl","extensionsNode_","icon"];for(r in t)if(void 0!==t[r]&&-1===u.indexOf(r)){a||((s=document.createElement("div")).className="gp-att-others-div",l=document.createElement("ul"),a=!0),c=document.createElement("li");var d=document.createElement("span");d.className="gp-attname-others-span",d.appendChild(document.createTextNode(r+" : ")),c.appendChild(d),c.appendChild(document.createTextNode(t[r])),l.appendChild(c)}l&&(s.appendChild(l),n.appendChild(s))}}),e),n.hasChildNodes()||(n=null),n},layerGetFeatureAtCoordinates:function(e,t,n){var o=e.getPixelFromCoordinate(n);return e.hasFeatureAtPixel(o,(function(e){return e===t}))},displayVectorFeatureInfo:function(e,t,n,o){var i=e.getPixelFromCoordinate(t),r=[];if(e.forEachFeatureAtPixel(i,(function(e,t){(!n||n.indexOf(t)>-1)&&r.push(e)})),0===r.length)return!1;var a=this.features2html(e,r);return null!==a&&(this.displayInfo(e,t,a.innerHTML,"text/html",o),!0)},displayFeatureInfo:function(e,t,n,o,i){for(var r={},a=0;ae.getResolution()&&(f=!1),f&&g.maxResolution&&g.maxResolution255)throw new Error("'"+e+"'' is greater than 255(0xff);");return("0"+Number(e).toString(16)).slice(-2)},num:function(e){return parseInt(e,16)},arrayToRgba:function(e){if(!Array.isArray(e))throw new Error("Not an array !");var t=e[0],n=e[1],o=e[2],i=e[3]||1;return"rgba("+t+", "+n+", "+o+", "+parseFloat(i)+")"},arrayToHex:function(e){if(!Array.isArray(e))throw new Error("Not an array !");var t=e[0],n=e[1],o=e[2],i=e[3],r=[this.hex(t),this.hex(n),this.hex(o)],a={};return a.hex="#"+r.join(""),i&&(a.opacity=parseFloat(i)),a},rgbaToHex:function(e){var t=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(0?.?\d+)\s*)?\)/.exec(e);if(!t)throw new Error("Invalid format: "+e);var n=t[1],o=t[2],i=t[3],r=t[4],a=[this.hex(n),this.hex(o),this.hex(i)],s={};return s.hex="#"+a.join(""),r&&(s.opacity=parseFloat(r)),s},hexToRgba:function(e,t){if(!e)throw new Error("Invalid format");e=e.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(function(e,t,n,o){return t+t+n+n+o+o}));var n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return(n=n?{r:parseInt(n[1],16),g:parseInt(n[2],16),b:parseInt(n[3],16)}:null)?"rgba("+n.r+", "+n.g+", "+n.b+", "+t+")":null},isHex:function(e){if(!e)return!1;if("#"!==e.charAt(0))return!1;return!!/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e)},isRGB:function(e){if(!e)return!1;return!!/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(0?.?\d+)\s*)?\)/.exec(e)}},At={lightOrange:"data:image/png;base64,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IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjkyYWVkNjM2LWY3MDMtNDAzOC1hNzM4LWZiYzYxYzZlMTljNCIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5NWMzZWI3NC0zYWRmLTRkYzUtOWZjZS1iODQ4NTc3Nzg4ODQiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0NjI3ZDg3NC1lZDIyLTRiZTUtYTlkNS00NDlmMzVhZDIxYzgiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE5Mjc4OTUzMDYiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphM2U3ZWQ1MS0xNTI4LTRhYjAtODVjOS0zNzNkNzgxZGM2ZmMiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjI1OjI3KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PofUkY4AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPGRuA4VZTAAAFcElEQVRYw82YW2xbVRaGv7XP8bHjXByHQkNhWigdVX1AikRBMBoQ8wASl4fRqPDAAxIPKAVxeRqQRohHBEVCaoGKUBCl4qHcNKCZVKMRRQxtgTaACLRKqlwB14NzM2ni2D2XvXjgBFXQOnFiA1uy/HB89u9/7bX+vf4l1HnpK57hTNCE0AzqAS5gAAuEID5KiWSiLPf4tp7YUjcSu4yLZzdi2IJyNXANcBlwAdAKzAHTwDhwDKEPywC+GZWHbPi7IKOvZIWguAnlr8BtwJ+AxDJeDYCPgF6Ed0hkh+Weov5mZLTHJMDeBjwYk0itYJtKTOpZML3SbYNfnYz2SBr0buARYENcFytdFvga2AGyT7p14Vcjoz3ShOgdKDuAi+pUewpMIDyCypvSreWGk9HdroOEV2F4A1hfTxGJCX2D5U7U/UzuD6NaXq49NRJhBsOjwMVLEtE4gaL4W5cV3IsxPEoizDT0ZLTHcSH6M/BWLLlVwpQKuPzhb+i8sRkv04Y/e5rvPigxtnM9trKU2k0D28A5LN3RsmXbrbFOU8DtQLpqfJqu97nh6TydmzvwWpOI8VDbxqbrkmz62yk+/Ps6yoe8KkeV/hHHfgrMNyrNEkBX1SAktgRs3T7ApV1rSWayiEkDLmLSJDNZLu1ay9btAyS2BEsEuWuZ99WKyRhgHeCcn8wGw/qbOnAS3jmfOwmP9Td1kNhQDduJcUwjyciS0RJXMMkWkPPUo/z4XFxZRhZII8mEwFCsT+f5xXTE7FAOteduItVaZodyhNPVZDeKccJGkxmsChIMOvTt6aRSzIP+7A9rRKWYp29PJ8GgsyqcVauZSADaj+IDTecWvBlD4e01HKjM07XtOOuuy+A2X0BYmib/8SxfvLWRYm8LdqZaCvkI/SDBci6nld0ze7KCLa4F3gSurR4MB5x1FnMhiCeor9hJiPKmWpbGp3EU2IbJFuTe5XfStbczLxgP7K0IPcCFDWhnJoFuMAek2/oNbWdku/WxHATejT1JPZcPvINysFYiK+gAFkXTK6H+MyhXADeseJ9fmrVDM6X080/+p1M2/yFsD1zjEIauEeMAqNpQE16oaKiqwfjYeLk+fuYl10HDq7DsBTavxs8o6FzFKez/dM3rLx9LjUyVxcb7yVkfzmpXFbACJURHIxgyxkyu1ml6qL0Z4YX4xl7Jfrrgm9Ov9bX/e++x1tHCgkQ11lgELGA4sBp3iHRbH5GDwJPAFLXo6KJnDmTh/aG2w2/3t47VSGQxs1zAE9U2s9pEjx3hXuBloCa7G1rxv8o3f/7SkUz/UFFWMqGRWMpHAqsDbl00KGotIXM7MawF7gKSS5oJJRospI7v+rD96Ikp8aV2EgrkVPW4OnIy6SVL9ZubvZgyaOVyYDfwl2oNqVWiXNEb231oTe+/BrzvK9Gy01MFyoiOKzIEmqsEfjGf/39U1yHgosJFUXhlFMl+z9E/nkvhVNHZsjux+9Caf77RnyzMBaJLmW4RrWAlB3Y4Uh13HLOA4wQjo6O2IRPNxVV4JuG5Et2SSelzjtFLzsZQ0NIZ8/2rx7K9+/paxqbKvyh4Bc4AFQxzau23Dow7FS+nHmfEUz05OqINH8+evXJPJVOuE93XkY4eSziaXcQpB2b+vZNt7+/8IPPl2OxPRMJ4dDsLzIho3hpzamJ6aqJ0ei6qtZAasmZ2OS1RyOMd6egBIzSFVoKj4y1Hnvhv+8cD02ZOkEmgIKITVnXKWDs1ksvNrgbTbRSZ46cypY50aWcllIsyKXvr8GTyi9f6WvePFGVQhO8EPW2NzI+OfV2pF2bDTgbg8D/aJeVUspd1BK3/G24u7/skO3+iYP3h3LdhI/B+AGodUpo8WKwoAAAAAElFTkSuQmCC",darkOrange:"data:image/png;base64,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czpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjIxNDZjMzUzLWIxZjItNGVjOC04NzQ3LTIwMGEyYWExM2ViMyIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2NGViNmI2Ni03Y2I2LTRkZGUtYTI3OS01MGY0ZWFiZGFhODAiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ODRhM2VjZC1kNGFmLTQ3NjItYjA1ZS04ODk2MGQ4ZTk0Y2MiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE5MDM3ODI2MTQiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxYzNjOGRkZi1kMjVkLTQ4YzQtYTAwYS0yMmU3ZDYwMzg1YjYiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjI1OjAzKzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PuhCAHgAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPGQOTjc4FAAAFdklEQVRYw82YW2gcZRTHf+eb2dlkc9lsrFYr2notfSgWxKKiog8VvIFI9UFQEaWtYPFJfREfRRSEeqlttViLD/WGisYXrShWpfWC1WpSN5eN3cZumkuTzWY3c/mOD9lI0WSTTXbVA8M8zMz3n//5zvl/5xyhxqb3ewYvaERpAvUAFzCABUIQH6GAHyvKa76tJbbUjMRW4+LbC7GsQbgCWA+sAs4AWoA8MAxkgEMo32LoxDO98oIN/xdk9IGUYEYvRrgduAW4Gogt4NMA+BroQHkfm+qW3aP6n5HRTSYG9hZga5lEwyKWKZVJvQCmQ3bZ4F8no5skAXov8BiwspwXizUL9APPgOyVXTr5r5HRzdKI1TsRngHOqlHuKTCI8hhG3padWqw7GX3IddDwcixvAefXUkTKhH7HcBfifi8vh1E1H1cfGkGYxPI4cM68RGw5zf3y3S7IuedgeZwgTNZ1Z3Sz46LRNcA7Zcmd25yGgPWP/M7q65toTLZSHBvn6OcFDm07n6g0n9oNAxsR54DsjBYs2251QWAbgFuBREX/tF3rc9+zA6xa3U5jSxwxHmpbueyqOOvvOM7rj67g1JfedFTNagngVtR+B0zUK8xiwLqKTmhcE3Dblk4uXbecRDKFmATgIiZBIpni0nXLuW1LJ41rgnmcvG6B59WiyRhgBeDM+UZipWHthnbcmDf7b8Y81m5oJ7GyErZTxjH1JCPzesu4ghtvBpkjH2X6uXFlAVEg9SMjhEAamFsyp4Yjcuks1s6uXdZacuksU8OVZDcC0mW8OpFRQqBruvqdwwpdDh+9cjaF0QHQv/2wRhRGB6afdzkVkKZxtDoyVaqZBKCHEXygcXafjhi63l3G9tIEGzYe4ZKrksSbzmCqMEz6mzE+eedC+juaiUYqhZCPchgkqKB4SzxntqQEO7oceBu4srIzHIitsMTOBOMJ1leCkxAMmEpRWt6Vg8BGTConOxZeSVdfzmwxHmpvRtkJnFmHcuYksBkxH8tO69e1nJEd1sdhP/BBuUippfnA+3jsr5ZI9TnzV33mFcB/DuEi4LpFr/PPZu3LkanES08fOltWnxe2Ba5xCEPXiHEAVG2oMS9UNFTVINOXKdamn3nQdSC8HMMeYPVS+hkFzQdObl9m2Zu7+xt6hkKx5fXktGumdNXyZQUKiPZGkDbGnFxqp+kh9kaUHeUTezHr6WRkxt/oa/toT39Lby6QqMoci4BJDB8vpTtEdlkflf3A08AQ1ejoTM8cyeRnudYD72Zb+qokMhNZLuCJaqtZaqDLLi0i7EHYDVTV7oZW/J9PNf3wanfycLoki5nQSFnKewKrnW5NNMhtKRDlt6EsB+4G4vM2/UrUNd5w5Pl028FfiuJL9SQUyKrqEXXkaNyLF2o3N9vUYKB0AbAduKFSQWqVKFv0+rYfXdbx4aB3qqQLDk8VKCKaUSQNmi0F/ujAwB9RTYeAMwoXabg2QvZ5jl4ym8Ip6FjgDm7/bdl7bw3Ec/lItEJyWyAS0RJWsmC7I9WM45hJHCfo6e21dZlozlju3pjnSnRT0tMXHdFzT8dQ0EJoTr2eSXXs7W/uG/pnwiswBZQw5NXaYw5knJKXVY8p8VSP9vZo3cezp1v2nniDK9FD7V70RMxoaganGJmJT0+0frbtt+RPfVN/EQnLo9sxYEREB6wxxweHhwYL4/mo2kSqi43c5zRH8GS7Fz1shMZQJTg41PzVU7+2fdNZNHlBTgI5ER20qkPG2qGebHZsSTpULzJH8slCe6ywrWTlrGTM3tw9Ef/xjUzLvp6idIlwQtBxa2Sit6+/VCvMuu0MwIE726RBSqlViaDli6Gm4t6e1MQveet3Z4+F9cD7Ewo4WRJBbaaSAAAAAElFTkSuQmCC",red:"data:image/png;base64,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293bv2fa/f0ASM5yljz/NiUAAA0aaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmI5YjA2YTAwLWZkOTQtNDc5MC1hNzIzLTlkMGUwNGRiNTRlNyIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1MTQ3ZGU5Yi1kOTA0LTRlNWYtYjIyYy0wZmMzOGRmMWI3ZGEiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4YzBjNTI2YS1lYTkyLTQxYWItODM5Yy05OWFhYTM0YjdlYzciCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE2NDAxNTU0MjYiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowMjQ4MDc5ZS1kMTYyLTQxZmItOGViYS1lMzY2NTRiNGRjMjYiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjIwOjQwKzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PkaovgIAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPFCiKn0kIAAAFfUlEQVRYw82YTWxc1RXHf+e+N2/GH+Px2IEEV02AgqIsIkwgoYS2ahepVGCBUOiCRRdsAAnECthErBBCICGFj4gqRQqBRSABUrVm1URtCSATJ5ASZCPHH0kGgx1/xJl5nvH7uIcFY4iIM/GzZyhHenqL994993/u+f/fOUeos+nNnkHCJoQWRD0UFzCARYhQCVB8NFWWTwNbT99SNxC3GZfIXg9sADYDWxCuRekEskARYQplFPgEOAr045ph6bXRzwKM3pEX5mduQLkHuAvYCqSW8GkIfAT0IBwknT8lH87o/w2M3mpSqL0LeLQKIrOMZSpVUC8hpkf6bPiTg9FbpBn0L8ATwLoqL5ZrFjgNPAeyV47p3E8GRjdLE6r3oTwHXF0n7ikwgfAEIvvlqJYbDkY3uw4a3YLyNrC2niJSBXQG4c+Ie0yORnGSj5OnRhzlUJ4ErrkikBAoAjPVe7ik4F6D8iRxlGvoyegmx4X4NwgHgM6a8fUyIfc8doZbf99Ca66N0uwF+v7tc3DnWoJK6gqep1C2g3NEjsdLlm03GXSbAe4GmmvGZ91vA3Y8P8aN6ztoyaYxxsPaNrbcnmbbvV/x9ONdnPnA+w71otaMcDfYPqDUmDQTUgjdNYPQsSHkgYf62di9mmwujzHNgIsxzWRzeTZ2r+aBh/rp2BDWDLLQjSzpf7VMMIpB6QKcy77Tuc6wdVsHbspbfJspj63bOuhcV8u3g9KFJtufWQbHakfLdQUv3YrI4qwQ+e65616Jr6mknE4KJgIGgctLZnEq5vRgAWsXLyKttZweLFCcqiW7cdVP1DgwQoQwUNPJxIDDG7vXMDszBvqjDWvM7MwYb+xew8SAUzNowgCSDEwyNVMJQU8AAdC06DvBtOG/76xirlLi3u0nufn2HJmWTir+FJ9+PMu7B66nr6eVYLpWCgUoJ0DCGoq3wv/MbXkhmlkN7Ad+XTMY4kBTl6XlKnA8IQ4U/xyUx8wlB3ZpKvcC23Hz49K79Ep6GeWM8VB7J8pfgasaUM6cAx5EzPvSZ4OGljNy1AYIh4C/L6lASWYBcBCHQ0mBJOfM94rk+WjwAsKvgN8te51LK7kPpm3zK89OrZH1v4zaQ9c4RJFrxDgAqjbSlBcpGqlqODoyWq5TP1OtnoU9wPqV9DMKWlRnfJ+/6q3XKpmhSRVbXU8uuhb6Hq1eVsBHdDiGQWPMuZV1mpuMB/aPCK8CXcsMjs6pufCm3/7PPZXs8LhKnJBjMTCH4f2VdIfIcRsgcgh4FpgkiY4u9Mwqc4fn2468M58dSQhkIbNcwBPVNrPSRJdjWgb2AK8BidrdSCX4PGw5/re53IlBK8uZ0EhVyodCq/1uXTTIzfrExZ0oq4H7gfQSmv54IMqcfNFv7/0ilkCSg1CgoKon1ZEv017ar9/cbEvGEFeuQ9mF8IdaBamFuBB7I7tKq3r+EXjnK0tPTxUoIzqqyCBooRIGM2NjX8d1HQIuKFys0cYY2eeJ3riYwinorHUndvmr3nt7Pj1eVNEa5LZALKIVrBTAnopVRx3HzOE44dDwsG3IRHPBxrtTnkv8p5yjLzvoLy72oaC+mvOvz+V79pZbRyYvJbwC80AFQ1GtPevAqFPxCuoxL57ql8ND2vDx7MVW2JTOuMQPdxDvSInmF/yU1ZT+Nd92eGcp97+RH4BE1XHHLDAtomPWmK8mpiYn/AvFOCmRGmLTm53WOOKpDhM/YqApQsLe+dYPnym1f9xvTVGQc8C4iE5Y1Ulj7eRQoTC7Ih1qFJiTQc7vwN9ZUbk6Z+ydp6L0Z2+Ws/uGrAyI8I2gF6yR0vDI6Uq9fDbsZACO3NQuGa3kr3XC7H+ClvJeP1/6IrbBqbNno0b4+xbMlmARngcRbAAAAABJRU5ErkJggg==",turquoiseBlue:"data:image/png;base64,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/MUi8H5G35QHBm+BvjV3bu1znD4AWZpV+gY4OARGS5S97vHu3u65/XunPb8fN2tyj8UDOK0AAA0aaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjEwNGNlNWFhLTE1YzctNGI4Yi1iOGU1LTFmYWQyNWFiYzBhZCIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkNDMyZTY1Zi0xOThhLTQxM2EtYWYyMy1jNzhlNzczNGRlN2QiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyNzExODVkMi03MWZiLTRhZDMtYTJmMi1iNjM3OWU3MDc1OTEiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE2ODQ5NDE4NjYyMzgzMjQiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NGFiYzNkYS1lZWJiLTRlZjctYjdjNS04ZDRjODY5OGVjODMiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA1LTI0VDE3OjI0OjI2KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pj0tlUwAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfnBRgPGBru/VeEAAAABmJLR0QA/wD/AP+gvaeTAAAFO0lEQVRYw9WYe2xTVRzHTx97dYS5B1UHa+/tY12dDoOKWyIGlfgHkCkSNTHGwHxA3NiAP/A5x4CMKEzdYL29YyAyBxKQZbI+NvYIaowaH9Ogi2GRbGjcFrbBNrq2a2/9nq5LCFnbbfSOeZJPTs/t6Tm/7/39zu+cU0IiXc7WSImNX0BsZiVYAhigmah5tHklsZrjSYtJSuZtaeSiiJU3gHUwfC9oARfBIHBP1DzaPH1eRuzmp0E6aTgSNX9EWMwSvOkMGPgG+CpguG8a0H7nA78zkMYqye0V0lYXDSHrYUw7cE5TxM04/b+38+vJ+RPRt0eIjVeAAhhyCQizFDKJEBjndaCY49Di4+CRlzFxfwSE3Ciol9i4DSBujoRUy7HIszFxdwSF3CioBy8qm1g5ufhirHwyJqwHrrDGWTlg8hFL1URN2+EF0XFPkyYuSWwhUVgnT2CygXBG3dFcM7bz1/au1u7OK9/93eWidUlHe1dCc810EsUAsXOPQZCI3rGZ6Wb4EXAEM0SCUFnZduz6T/09l4bHXYOCz+f0+XxeWg+7XYM/4vnKtlqHJHSIOrAHlYMFYmawRNCKycaDGZLVfMRdf/nPDpfXM+abotDnpy93dtzXfNgdZg+im2uimJ6h66UTeIMZsrat1jvkdPRRb/imLt4hl6N3DfqFEIPvOMzDJYspJsWfbUKEyFNttcKoyzkKo4UgYoRRt3OE9guT1br984nsmQ7gCWbIipaj4xeu9v/hFQTPlG7B89+u9v9O+4UQQ8f/BSlaVM8kgBOhji4p9mpvwQ+Wfwddjp6bQw2u8g44HT3535/tTUa/0Eccvg4sFDE1m2PBZkx2LVRqVcLQvG/PDDX1/tVxze38x+UZH6O1He28b764qgwtxOcf327eBGLFE9NikiD3qzDZhVBJgCJH3KubDnkfbD4s5Jw74qM1bcvDnxq8/vHt1SrS9InIJ2m7OQ4UYsKhCB9lJqHj0gPsHJzPvsS9w8rRRPDptI40M8PlH9fOJ5M5K008rsZmIwi5gc4QN9Zja8zn+5epch9PTFepU1iGuVunVqeyS9g0iv8zy96l0WiSjIsXx28iJEJhaONkMGB5YP14bkmI1SzIz1T0pRa9VKnNzCjUMcwWUAS2BtgWYLJN+xTo1OyrOhW7xsAwqnSGkd3i+uGjkT5Xw6DLt3AdEKQNB4YXbdtwQpuVuRtG7pwhxWA7vJgRib0nDuSDvtkIkjYcHE3aVWjRLL9/zyyETPK2Vq3OidAaOhiPDLcbxo3MRIik0eReWPnO15pHHiqbpYhS6hkNw7wAz0To6GM5hAzH3wkDa6b7x4bEwnkUfMnP6idX7Nex7GxElIDNerV6hU6jSdbp9RHck2w0w/FaGGoJm7KtnCfmWNlF1fOrK3Q6bekMRFABO7QM8yxewFLUi+5JSxPpAmcxy0gjt1Rytir4NcHKCfJTH/al5j1j1hr0pWEML55YD+x2GP6cVqNZZjQYEvUsG4vP4v8jKju5L1p6qnytxGKa6qogyOorBpVbXvxMe69xdxABb9I0DAGvIIRWp7NsBsJIoWVZKfaXuf+jMKp2b6z8+Adb4aErNwpCCh5J2pnfoH0ga08g7invBfaQjXjjuQifhyEgLdNolJP5UqR17y+QnSwvk1i565OZK6F8RzubvWwvDH8LvKZnmHXY8HKws+sNLJtI5muJ/7hYElOzJ1V+fN9R7CVDClPJOVXuqo06vS4HQjTwgDKDZRXk/1JiD7wrieFLk6T1lczCXUVK7aPZinS9XrTw+Q+Tql7SUmvGuQAAAABJRU5ErkJggg==",defaultOffset:[-25.5,-32]},vt=n(12),Ct=n.n(vt),It=n(13),bt=n.n(It),wt=n(32),Et=n.n(wt),_t=n(33),St=n.n(_t),Mt=n(15),Pt=n.n(Mt),xt=n(16),kt=n.n(xt),Gt=n(34),Rt=n.n(Gt),Tt=n(66),Ot=n.n(Tt),Lt=n(67),Dt=n.n(Lt),Nt=lt.getLogger("styling");Ct.a.prototype.setPropertyFill=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=e.getFill();if(t){var n=t.getColor();if(Array.isArray(n)){var o="rgba(";o+=n[0]+",",o+=n[1]+",",o+=n[2]+",",n=o+=n[3]+")"}if(yt.isRGB(n)){var i=yt.rgbaToHex(n);this.set("fill",i.hex),this.set("fill-opacity",i.opacity)}else this.set("fill",n),this.set("fill-opacity",1)}}},Ct.a.prototype.setPropertyStroke=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=e.getStroke();if(t){var n=t.getColor();if(Array.isArray(n)){var o="rgba(";o+=n[0]+",",o+=n[1]+",",o+=n[2]+",",n=o+=n[3]+")"}if(yt.isRGB(n)){var i=yt.rgbaToHex(n);this.set("stroke",i.hex),this.set("stroke-opacity",i.opacity)}else this.set("stroke",n),this.set("stroke-opacity",1);this.set("stroke-width",t.getWidth())}}},Ct.a.prototype.setPropertyLabel=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=void 0!==this.get("name");if(e.getText()&&t){var n=e.getText().getFill();if(n){var o=n.getColor();if(Array.isArray(o)){var i="rgba(";i+=o[0]+",",i+=o[1]+",",i+=o[2]+",",o=i+=o[3]+")"}if(yt.isRGB(o)){var r=yt.rgbaToHex(o);this.set("label-fill",r.hex),this.set("label-fill-opacity",r.opacity)}else this.set("label-fill",o),this.set("label-fill-opacity",1)}var a=e.getText().getStroke();if(a){var s=a.getColor();if(Array.isArray(s)){var l="rgba(";l+=s[0]+",",l+=s[1]+",",l+=s[2]+",",s=l+=s[3]+")"}if(yt.isRGB(s)){var c=yt.rgbaToHex(s);this.set("label-stroke",c.hex),this.set("label-stroke-opacity",c.opacity)}else this.set("label-stroke",s),this.set("label-stroke-opacity",1);this.set("label-stroke-width",a.getWidth())}this.set("label-font",e.getText().getFont()||jt.DEFAULT_TEXT.font),this.set("label-textAlign",e.getText().getTextAlign()||jt.DEFAULT_TEXT.textAlign)}}},Ct.a.prototype.setPropertyMarker=function(){var e=this.getStyle();if(e&&(!Array.isArray(e)||0!==e.length)){var t=e.getImage();if(t)if(t instanceof St.a){var n=t.getColor();if(Array.isArray(n)){var o="rgba(";o+=n[0]+",",o+=n[1]+",",o+=n[2]+",",n=o+=n[3]+")"}if(n){var i=yt.rgbaToHex(n);this.set("marker-color",i.hex)}var r=t.getScale();switch(Math.round(2*r)/2){case 0:case.5:this.set("marker-size","small");break;case 1:this.set("marker-size","medium");break;case 1.5:case 2:this.set("marker-size","large")}var a=t.getSrc();a&&this.set("marker-symbol",a),this.unset("circle-fill"),this.unset("circle-fill-opacity"),this.unset("circle-stroke"),this.unset("circle-stroke-width"),this.unset("circle-stroke-opacity"),this.unset("circle-radius")}else{var s=t.getFill();if(s){var l=s.getColor();if(Array.isArray(l)){var c="rgba(";c+=l[0]+",",c+=l[1]+",",c+=l[2]+",",l=c+=l[3]+")"}if(yt.isRGB(l)){var u=yt.rgbaToHex(l);this.set("circle-fill",u.hex),this.set("circle-fill-opacity",u.opacity)}else this.set("circle-fill",l),this.set("circle-fill-opacity",1)}var d=t.getStroke();if(d){var p=d.getColor();if(Array.isArray(p)){var h="rgba(";h+=p[0]+",",h+=p[1]+",",h+=p[2]+",",p=h+=p[3]+")"}if(yt.isRGB(p)){var g=yt.rgbaToHex(p);this.set("circle-stroke",g.hex),this.set("circle-stroke-opacity",g.opacity)}else this.set("circle-stroke",p),this.set("circle-stroke-opacity",1);this.set("circle-stroke-width",d.getWidth())}var m=t.getRadius();this.set("circle-radius",m)}}};var jt={APPLY_CONVERT_GEOM_GPX:!0,DEFAULT_ICON:{src:At.lightOrange,anchor:[.5,1],scale:1},DEFAULT_CIRCLE:{radius:10,fill:{opacity:1,color:[0,0,0,1]},stroke:{width:1,opacity:1,color:[0,0,0,1]}},DEFAULT_STROKE:{width:5,opacity:1,color:[250,250,250,1]},DEFAULT_FILL:{opacity:1,color:[0,0,0,1]},DEFAULT_TEXT:{font:"16px sans",textAlign:"left",stroke:{color:[250,250,250,1],width:5,opactity:1},fill:{opacity:1,color:[0,0,0,1]}},getListTags:function(){return["type","fill","fill-opacity","stroke","stroke-opacity","stroke-width","circle-fill","circle-fill-opacity","circle-stroke","circle-stroke-opacity","circle-stroke-width","circle-radius","marker-symbol","marker-color","marker-size","label-fill","label-fill-opacity","label-stroke","label-stroke-width","label-stroke-opacity","label-font","label-textAlign"]},defineStyleFromProperties:function(e){var t=null,n={},o=null;if(e.get("marker-color")||e.get("marker-size")||e.get("marker-symbol")){(o={}).src=this.DEFAULT_ICON.src,o.anchor=this.DEFAULT_ICON.anchor;var i=e.get("marker-symbol");i&&-1!==i.search("data:image/png;base64")&&(o.src=i);var r=e.get("marker-color");yt.isHex(r)&&(o.color=yt.hexToRgba(r,1));var a=e.get("marker-size");if(a)switch(a){case"small":o.scale=.5;break;case"medium":o.scale=1;break;case"large":o.scale=1.5;break;default:o.scale=this.DEFAULT_ICON.scale}}var s=null;(e.get("stroke")||e.get("stroke-opacity")||e.get("stroke-width"))&&((s={}).color=yt.hexToRgba(e.get("stroke"),+e.get("stroke-opacity")||this.DEFAULT_STROKE.opacity),s.width=+e.get("stroke-width")||this.DEFAULT_STROKE.width);var l=null;(e.get("fill")||e.get("fill-opacity"))&&((l={}).color=yt.hexToRgba(e.get("fill"),+e.get("fill-opacity")||this.DEFAULT_FILL.opacity));var c=null,u=null,d=""!==e.get("name");d&&((e.get("label-fill")||e.get("label-fill-opacity"))&&((u={}).color=yt.hexToRgba(e.get("label-fill"),+e.get("label-fill-opacity")||this.DEFAULT_TEXT.fill.opacity)),(e.get("label-stroke")||e.get("label-stroke-opacity")||e.get("label-stroke-width"))&&((c={}).color=yt.hexToRgba(e.get("label-stroke"),+e.get("label-stroke-opacity")||this.DEFAULT_TEXT.stroke.opacity),c.width=+e.get("label-stroke-width")||this.DEFAULT_TEXT.stroke.width));var p=e.get("circle-radius")||this.DEFAULT_CIRCLE.radius,h=null;(e.get("circle-stroke")||e.get("circle-stroke-opacity")||e.get("circle-stroke-width"))&&((h={}).color=yt.hexToRgba(e.get("circle-stroke"),+e.get("circle-stroke-opacity")||this.DEFAULT_CIRCLE.stroke.opacity),h.width=+e.get("circle-stroke-width")||this.DEFAULT_CIRCLE.stroke.width);var g=null;(e.get("circle-fill")||e.get("circle-fill-opacity"))&&((g={}).color=yt.hexToRgba(e.get("circle-fill"),+e.get("circle-fill-opacity")||this.DEFAULT_CIRCLE.fill.opacity));var m=e.getGeometry().getType();switch(m){case"Circle":case"Point":case"MultiPoint":var f=!1,y={};if(h&&(y.stroke=new kt.a(h)),g&&(y.fill=new Pt.a(g)),0!==Object.keys(y).length&&(f=!0,y.radius=+p,n.image=new Et.a(y)),o&&(n.image=new St.a(o)),d){var A={};if(c&&(A.stroke=new kt.a(c)),u&&(A.fill=new Pt.a(u)),0!==Object.keys(A).length)A.text=e.get("name"),A.textAlign=e.get("label-textAlign")||this.DEFAULT_TEXT.textAlign,A.font=e.get("label-font")||this.DEFAULT_TEXT.font,n.text=new Rt.a(Object.assign({},this.DEFAULT_TEXT,A));else if(o||f){var v=new Rt.a(Object.assign({},this.DEFAULT_TEXT,{fill:new Pt.a(this.DEFAULT_TEXT.fill),stroke:new kt.a(this.DEFAULT_TEXT.stroke)}));if(v){var C=v.clone();C.setText(e.get("name")),n.text=C}}}break;case"Polygon":case"MultiPolygon":s&&(n.stroke=new kt.a(s)),l&&(n.fill=new Pt.a(l));break;case"LineString":case"MultiLineString":if(s&&(n.stroke=new kt.a(s)),this.APPLY_CONVERT_GEOM_GPX&&l){var I=e.get("type");if(I&&("Polygon"===I||"MultiPolygon"===I)){n.fill=new Pt.a(l);var b=e.clone(),w="LineString"===m?Ot.a:Dt.a;e.setGeometry(new w([b.getGeometry().getCoordinates()]))}}}return 0!==Object.keys(n).length&&(t=new bt.a(n)),t},defineStyleFunctionByDefault:function(e){if(!e)return[];if(0===Object.keys(e).length)return[];return function(t,n){var o=null;switch(t.getGeometry().getType()){case"Point":case"MultiPoint":var i={};if(e.getImage()&&(i.image=e.getImage()),e.getText()&&t.get("name")){var r=e.getText().clone();r.setText(t.get("name")),i.text=r}o=new bt.a(i);break;case"Circle":var a={},s={};if(e.getFill()&&(s.fill=e.getFill()),e.getStroke()&&(s.stroke=e.getStroke()),e.getText()&&t.get("name")){var l=e.getText().clone();l.setText(t.get("name")),a.text=l}0!==Object.keys(s).length&&(s.radius=3,a.image=new Et.a(s)),o=new bt.a(a);break;case"Polygon":case"MultiPolygon":var c={};e.getFill()&&(c.fill=e.getFill()),e.getStroke()&&(c.stroke=e.getStroke()),o=new bt.a(c);break;case"LineString":case"LinearRing":case"MultiLineString":var u={};e.getStroke()&&(u.stroke=e.getStroke()),o=new bt.a(u)}return[o]}},definePropertiesFromStyleByType:function(e){switch(e.getGeometry().getType()){case"Point":case"MultiPoint":e.setPropertyMarker(),e.setPropertyLabel();break;case"LineString":case"MultiLineString":e.setPropertyStroke();break;case"Polygon":case"MultiPolygon":e.setPropertyStroke(),e.setPropertyFill()}},definePropertiesFromStyle:function(e){var t=e.getStyle()||e.getStyleFunction();if(t){if("function"==typeof t){var n=t.call(this,e,0);if(!n||0===n.length)return;t=Array.isArray(n)?n[0]:n,e.setStyle(t)}this.definePropertiesFromStyleByType(e)}},defineTagFromStyle:function(e,t){return Nt.trace("todo..."),null}},Ut=jt;function Bt(e){return(Bt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var Ft=lt.getLogger("parser"),zt={parse:function(e){var t=null,o="undefined"!=typeof window?window:null;"object"===("undefined"==typeof exports?"undefined":Bt(exports))&&null===window?t=(new(0,n(62).DOMParser)).parseFromString(e,"text/xml"):o.DOMParser?t=(new o.DOMParser).parseFromString(e,"text/xml"):o.ActiveXObject?((t=new o.ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e)):Ft.log("Incompatible environment for DOM Parser !");var i=t.querySelector("parsererror");return i?(console.error(i),null):(Ft.trace(t),t)},toString:function(e){var t=(new XMLSerializer).serializeToString(e);return Ft.trace(t),t},format:function(e){for(var t="",n=(e=e.replace(/(>)\s*(<)(\/*)/g,"$1\n$2$3").replace(/ *(.*) +\n/g,"$1\n").replace(/(<.+>)(.+\n)/g,"$1\n$2")).split("\n"),o=0,i="other",r={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0},a=0;a/)),c=Boolean(s.match(/<\/.+>/)),u=Boolean(s.match(/<[^!].*>/)),d=l?"single":c?"closing":u?"opening":"other",p=i+"->"+d;i=d;var h="";o+=r[p];for(var g=0;gclosing"===p?t=t.substr(0,t.length-1)+s+"\n":t+=h+s+"\n"}return Ft.trace(t),t}};function Vt(e){return(Vt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var qt={detectSupport:function(){var e=!0,t=window.navigator.userAgent.toLowerCase();return-1===t.indexOf("iphone")&&-1===t.indexOf("ipod")&&-1===t.indexOf("ipad")&&-1===t.indexOf("android")&&-1===t.indexOf("mobile")&&-1===t.indexOf("blackberry")&&-1===t.indexOf("tablet")&&-1===t.indexOf("phone")&&-1===t.indexOf("touch")||(e=!1),-1===t.indexOf("msie")&&-1===t.indexOf("trident")||(e=!0),e},assign:function(e,t){for(var n in e=e||{},t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},mergeParams:function(e,t,n){if(void 0!==e&&void 0!==t)for(var o in void 0===n&&(n=!0),t)t.hasOwnProperty(o)&&("object"===Vt(t[o])?e.hasOwnProperty(o)?this.mergeParams(e[o],t[o],n):e[o]=t[o]:e.hasOwnProperty(o)?n&&(e[o]=t[o]):e[o]=t[o])}},Wt=lt.getLogger("extended KML format"),Ht=function(e){function t(n){if(!(this instanceof t))throw new TypeError("ERROR CLASS_CONSTRUCTOR");n=n||{},this.source=null,this.extensions=n.extensions||null,n.defaultStyle&&!Array.isArray(n.defaultStyle)&&(n.defaultStyle=[n.defaultStyle]),null!==n.defaultStyle&&void 0!==n.defaultStyle||(n.defaultStyle=[]),e.call(this,n)}function n(e,t,n){for(var o="#document"===e.nodeName?e.childNodes[0].childNodes:e.childNodes,i=o,r=0;r)\s*(<)/g,"$1$2"),null===(i=zt.parse(a)))return r;function s(e){var t="";t+=e.substr(6,2),t+=e.substr(4,2),t+=e.substr(2,2);for(var n=parseInt(t,16).toString(16),o="",i=n.length||0,r=0;r<6-i;r++)o+="0";return n="#"+o+n}var l=function(e,t){if(Wt.trace("label with style :",t),e){for(var n=e.getProperties().name,o=s("ff000000"),i="#FFFFFF",r=0,a="Sans",l="16px",c=null,u=5,d="#000000",p="#ffffff",h=1,g=!1,m=!1,f=t.childNodes,y=0;yt&&(o=!1),o&&p&&pt?1:er&&(c-s)*(r-l)-(i-s)*(u-l)>0&&a++:u<=r&&(c-s)*(r-l)-(i-s)*(u-l)<0&&a--,s=c,l=u}return 0!==a}function Xn(e,t,n,o,i,r){if(0===n.length)return!1;if(!Kn(e,t,n[0],o,i,r))return!1;for(var a=1,s=n.length;aC&&Xn(e,t,n,o,c=(u+d)/2,g)&&(v=c,C=I),u=d}return isNaN(v)&&(v=i[r]),a?(a.push(v,g,C),a):[v,g,C]}var $n={RADIANS:"radians",DEGREES:"degrees",FEET:"ft",METERS:"m",PIXELS:"pixels",TILE_PIXELS:"tile-pixels",USFEET:"us-ft"};var eo={};eo[$n.RADIANS]=6370997/(2*Math.PI),eo[$n.DEGREES]=2*Math.PI*6370997/360,eo[$n.FEET]=.3048,eo[$n.METERS]=1,eo[$n.USFEET]=1200/3937;var to=$n,no=function(){function e(e){this.code_=e.code,this.units_=e.units,this.extent_=void 0!==e.extent?e.extent:null,this.worldExtent_=void 0!==e.worldExtent?e.worldExtent:null,this.axisOrientation_=void 0!==e.axisOrientation?e.axisOrientation:"enu",this.global_=void 0!==e.global&&e.global,this.canWrapX_=!(!this.global_||!this.extent_),this.getPointResolutionFunc_=e.getPointResolution,this.defaultTileGrid_=null,this.metersPerUnit_=e.metersPerUnit}return e.prototype.canWrapX=function(){return this.canWrapX_},e.prototype.getCode=function(){return this.code_},e.prototype.getExtent=function(){return this.extent_},e.prototype.getUnits=function(){return this.units_},e.prototype.getMetersPerUnit=function(){return this.metersPerUnit_||eo[this.units_]},e.prototype.getWorldExtent=function(){return this.worldExtent_},e.prototype.getAxisOrientation=function(){return this.axisOrientation_},e.prototype.isGlobal=function(){return this.global_},e.prototype.setGlobal=function(e){this.global_=e,this.canWrapX_=!(!e||!this.extent_)},e.prototype.getDefaultTileGrid=function(){return this.defaultTileGrid_},e.prototype.setDefaultTileGrid=function(e){this.defaultTileGrid_=e},e.prototype.setExtent=function(e){this.extent_=e,this.canWrapX_=!(!this.global_||!e)},e.prototype.setWorldExtent=function(e){this.worldExtent_=e},e.prototype.setGetPointResolution=function(e){this.getPointResolutionFunc_=e},e.prototype.getPointResolutionFunc=function(){return this.getPointResolutionFunc_},e}();var oo="cosh"in Math?Math.cosh:function(e){var t=Math.exp(e);return(t+1/t)/2};"log2"in Math&&Math.log2;function io(e,t,n){return e+n*(t-e)}var ro=function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function o(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new o)}}(),ao=6378137*Math.PI,so=[-ao,-ao,ao,ao],lo=[-180,-85,180,85],co=6378137*Math.log(Math.tan(Math.PI/2)),uo=function(e){function t(t){return e.call(this,{code:t,units:to.METERS,extent:so,global:!0,worldExtent:lo,getPointResolution:function(e,t){return e/oo(t[1]/6378137)}})||this}return ro(t,e),t}(no),po=[new uo("EPSG:3857"),new uo("EPSG:102100"),new uo("EPSG:102113"),new uo("EPSG:900913"),new uo("http://www.opengis.net/def/crs/EPSG/0/3857"),new uo("http://www.opengis.net/gml/srs/epsg.xml#3857")];function ho(e,t,n){var o=e.length,i=n>1?n:2,r=t;void 0===r&&(r=i>2?e.slice():new Array(o));for(var a=0;aco?s=co:s<-co&&(s=-co),r[a+1]=s}return r}function go(e,t,n){var o=e.length,i=n>1?n:2,r=t;void 0===r&&(r=i>2?e.slice():new Array(o));for(var a=0;a>1)],t))<0?a=o+1:(s=o,l=!i);return l?a:~a}(h,y);A<0?(l=(y-h[-A-2])/(h[-A-1]-h[-A-2]),s=t+(-A-2)*o):s=t+A*o}var v=a>1?a:2,C=r||new Array(v);for(g=0;g=.05){for(var n="",o=e.split("\n"),i=Vo.slice(0,Math.round(t/.1)),r=0,a=o.length;r0&&(n+="\n"),n+=o[r].split("").join(i);return n}return e}function Wo(){return zo||(zo=Fo(1,1).getContext("2d")),zo}function Ho(e,t){return Wo().measureText(e).width+(e.length-1)*t}var Yo={};No.labelCache&&jo(No.labelCache,"clear",(function(){Yo={}}));var Jo,Zo,Ko=Do.e.isFunction,Xo=Do.e.convertFunction,Qo=Do.c.isExpression,$o=Do.c.createPropertyExpression,ei={Point:1,MultiPoint:1,LineString:2,MultiLineString:2,Polygon:3,MultiPolygon:3},ti={center:[.5,.5],left:[0,.5],right:[1,.5],top:[.5,0],bottom:[.5,1],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]},ni={},oi={zoom:0};function ii(e,t,n,o,i,r){var a=e.id;r||(r={},console.warn("No functionCache provided to getValue()")),r[a]||(r[a]={});var s=r[a];if(!s[n]){var l=(e[t]||ni)[n],c=Do.f["".concat(t,"_").concat(e.type)][n];void 0===l&&(l=c.default);var u=Qo(l);if(!u&&Ko(l)&&(l=Xo(l,c),u=!0),u){var d=function(e,t){var n=$o(e,t);if("error"===n.result)throw new Error(n.value.map((function(e){return"".concat(e.key,": ").concat(e.message)})).join(", "));return n.value}(l,c);s[n]=d.evaluate.bind(d)}else"color"==c.type&&(l=Do.a.parse(l)),s[n]=function(){return l}}return oi.zoom=o,s[n](oi,i)}function ri(e,t){if(e){if(0===e.a||0===t)return;var n=e.a;return t=void 0===t?1:t,"rgba("+Math.round(255*e.r/n)+","+Math.round(255*e.g/n)+","+Math.round(255*e.b/n)+","+n*t+")"}return e}var ai=/^([^]*)\{(.*)\}([^]*)$/;function si(e,t){var n;do{if(n=e.match(ai)){var o=t[n[2]]||"";e=n[1]+o+n[3]}}while(n);return e}var li=!1;var ci=function(e,t,n,o,i,r,a){if(void 0===o&&(o=Bo),"string"==typeof t&&(t=JSON.parse(t)),8!=t.version)throw new Error("glStyle version 8 required.");var s,l;if(r)if("undefined"!=typeof Image){var c=new Image;c.crossOrigin="anonymous",c.onload=function(){s=c,l=[c.width,c.height],e.changed(),c.onload=null},c.src=r}else if("undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope){var u=self;u.postMessage({action:"loadImage",src:r}),u.addEventListener("message",(function(e){"imageLoaded"===e.data.action&&e.data.src===r&&(s=e.data.image,l=[s.width,s.height])}))}for(var d,p=Object(Do.b)(t.layers),h={},g=[],m={},f={},y={},A={},v=0,C=p.length;v=C.maxzoom)return"continue";var E=C.filter;if(!E||function(e,t,n,o,i){return i||console.warn("No filterCache provided to evaluateFilter()"),e in i||(i[e]=Object(Do.d)(t).filter),oi.zoom=o,i[e](oi,n)}(I,E,p,c,A)){u=C;var _=void 0,S=void 0,k=void 0,G=void 0,R=void 0,T=void 0,O=v.index;if(3==d&&("fill"==C.type||"fill-extrusion"==C.type))if(S=ii(C,"paint",C.type+"-opacity",c,p,y),C.type+"-pattern"in w){var L=ii(C,"paint",C.type+"-pattern",c,p,y);if(L){var D="string"==typeof L?si(L,n):L.toString();if(s&&i&&i[D]){++g,(T=x[g])&&T.getFill()&&!T.getStroke()&&!T.getText()||(T=new bt.a({fill:new Pt.a}),x[g]=T),k=T.getFill(),T.setZIndex(O);var N=f[he=D+"."+S];if(!N){var j=Fo((ge=i[D]).width,ge.height),U=j.getContext("2d");U.globalAlpha=S,U.drawImage(s,ge.x,ge.y,ge.width,ge.height,0,0,ge.width,ge.height),N=U.createPattern(j,"repeat"),f[he]=N}k.setColor(N)}}}else(_=ri(ii(C,"paint",C.type+"-color",c,p,y),S))&&(C.type+"-outline-color"in w&&(R=ri(ii(C,"paint",C.type+"-outline-color",c,p,y),S)),R||(R=_),++g,(T=x[g])&&T.getFill()&&T.getStroke()&&!T.getText()||(T=new bt.a({fill:new Pt.a,stroke:new kt.a}),x[g]=T),(k=T.getFill()).setColor(_),(G=T.getStroke()).setColor(R),G.setWidth(1),T.setZIndex(O));if(1!=d&&"line"==C.type){_=!("line-pattern"in w)&&"line-color"in w?ri(ii(C,"paint","line-color",c,p,y),ii(C,"paint","line-opacity",c,p,y)):void 0;var B=ii(C,"paint","line-width",c,p,y);_&&B>0&&(++g,(T=x[g])&&T.getStroke()&&!T.getFill()&&!T.getText()||(T=new bt.a({stroke:new kt.a}),x[g]=T),(G=T.getStroke()).setLineCap(ii(C,"layout","line-cap",c,p,y)),G.setLineJoin(ii(C,"layout","line-join",c,p,y)),G.setMiterLimit(ii(C,"layout","line-miter-limit",c,p,y)),G.setColor(_),G.setWidth(B),G.setLineDash(w["line-dasharray"]?ii(C,"paint","line-dasharray",c,p,y).map((function(e){return e*B})):null),T.setZIndex(O))}var F=!1,z=null,V=0,q=void 0,W=void 0,H=void 0;if((1==d||2==d)&&"icon-image"in b){var Y=ii(C,"layout","icon-image",c,p,y);if(Y){q="string"==typeof Y?si(Y,n):Y.toString();var J=void 0;if(s&&i&&i[q]){var Z=ii(C,"layout","icon-rotation-alignment",c,p,y);if(2==d){var K=e.getGeometry();if(K.getFlatMidpoint||K.getFlatMidpoints){var X=K.getExtent();if(Math.sqrt(Math.max(Math.pow((X[2]-X[0])/t,2),Math.pow((X[3]-X[1])/t,2)))>150){var Q="MultiLineString"===K.getType()?K.getFlatMidpoints():K.getFlatMidpoint();if(Zo||(Zo=new To("Point",Jo=[NaN,NaN],[],{},null)),J=Zo,Jo[0]=Q[0],Jo[1]=Q[1],"line"===(ke=ii(C,"layout","symbol-placement",c,p,y))&&"map"===Z)for(var $=K.getStride(),ee=K.getFlatCoordinates(),te=0,ne=ee.length-$;te=se&&Q[0]<=ce&&Q[1]>=le&&Q[1]<=ue){V=Math.atan2(ie-ae,re-oe);break}}}}}if(2!==d||J){var de=ii(C,"layout","icon-size",c,p,y),pe=void 0!==w["icon-color"]?ii(C,"paint","icon-color",c,p,y):null;if(!pe||0!==pe.a){var he=q+"."+de;if(null!==pe&&(he+="."+pe),!(W=m[he])){var ge=i[q];W=new St.a({color:pe?[255*pe.r,255*pe.g,255*pe.b,pe.a]:void 0,img:s,imgSize:l,size:[ge.width,ge.height],offset:[ge.x,ge.y],rotateWithView:"map"===Z,scale:de/ge.pixelRatio}),m[he]=W}}W&&(++g,(T=x[g])&&T.getImage()&&!T.getFill()&&!T.getStroke()||(T=new bt.a,x[g]=T),T.setGeometry(J),W.setRotation(V+Uo(ii(C,"layout","icon-rotate",c,p,y))),W.setOpacity(ii(C,"paint","icon-opacity",c,p,y)),W.setAnchor(ti[ii(C,"layout","icon-anchor",c,p,y)]),T.setImage(W),z=T.getText(),T.setText(void 0),T.setZIndex(O),F=!0,H=!1)}else H=!0}}}if(1==d&&"circle-radius"in w){++g,(T=x[g])&&T.getImage()&&!T.getFill()&&!T.getStroke()||(T=new bt.a,x[g]=T);var me=ii(C,"paint","circle-radius",c,p,y),fe=ri(ii(C,"paint","circle-stroke-color",c,p,y),ii(C,"paint","circle-stroke-opacity",c,p,y)),ye=ri(ii(C,"paint","circle-color",c,p,y),ii(C,"paint","circle-opacity",c,p,y)),Ae=ii(C,"paint","circle-stroke-width",c,p,y),ve=me+"."+fe+"."+ye+"."+Ae;(W=m[ve])||(W=new Et.a({radius:me,stroke:fe&&Ae>0?new kt.a({width:Ae,color:fe}):void 0,fill:ye?new Pt.a({color:ye}):void 0}),m[ve]=W),T.setImage(W),z=T.getText(),T.setText(void 0),T.setGeometry(void 0),T.setZIndex(O),F=!0}var Ce=void 0;if("text-field"in b)Ce=si(ii(C,"layout","text-field",c,p,y).toString(),n).trim(),S=ii(C,"paint","text-opacity",c,p,y);if(Ce&&S&&!H){F||(++g,(T=x[g])&&T.getText()&&!T.getFill()&&!T.getStroke()||(T=new bt.a,x[g]=T),T.setImage(void 0),T.setGeometry(void 0)),T.getText()||T.setText(z||new Rt.a({padding:[2,2,2,2]})),z=T.getText();var Ie=Math.round(ii(C,"layout","text-size",c,p,y)),be=ii(C,"layout","text-font",c,p,y),we=ii(C,"layout","text-line-height",c,p,y),Ee=Lo()(a?a(be):be,Ie,we),_e=b["text-transform"];"uppercase"==_e?Ce=Ce.toUpperCase():"lowercase"==_e&&(Ce=Ce.toLowerCase());var Se=ii(C,"layout","text-max-width",c,p,y),Me=ii(C,"layout","text-letter-spacing",c,p,y),Pe=2==d?qo(Ce,Me):function e(t,n,o,i){if(-1!==t.indexOf("\n")){for(var r=t.split("\n"),a=[],s=0,l=r.length;s1){var p=Wo();p.font=n;var h=p.measureText("M").width*o,g="";for(a=[],s=0,l=d.length;s1;++s){var y=a[s];if(Ho(y,i)<.35*h){var A=s>0?Ho(a[s-1],i):1/0,v=s.7*h&&Ho(I,i)<.6*h){var b=C.split(" "),w=b.pop();Ho(w,i)<.2*h&&(a[s]=b.join(" "),a[s+1]=w+" "+I),l-=1}}u=a.join("\n")}else u=t;u=qo(u,i),Yo[c]=u}return u}(Ce,Ee,Se,Me);z.setText(Pe),z.setFont(Ee),z.setRotation(Uo(ii(C,"layout","text-rotate",c,p,y)));var xe=ii(C,"layout","text-anchor",c,p,y),ke=F||1==d?"point":ii(C,"layout","symbol-placement",c,p,y);z.setPlacement(ke);var Ge=ii(C,"paint","text-halo-width",c,p,y),Re=ii(C,"layout","text-offset",c,p,y),Te=ii(C,"paint","text-translate",c,p,y),Oe=0,Le=0;if("point"==ke){var De="center";-1!==xe.indexOf("left")?(De="left",Le=Ge):-1!==xe.indexOf("right")&&(De="right",Le=-Ge),z.setTextAlign(De);var Ne=ii(C,"layout","text-rotation-alignment",c,p,y);z.setRotateWithView("map"==Ne)}else z.setMaxAngle(Uo(ii(C,"layout","text-max-angle",c,p,y))*Ce.length/Pe.length),z.setTextAlign(),z.setRotateWithView(!1);var je="middle";0==xe.indexOf("bottom")?(je="bottom",Oe=-Ge-.5*(we-1)*Ie):0==xe.indexOf("top")&&(je="top",Oe=Ge+.5*(we-1)*Ie),z.setTextBaseline(je),z.setOffsetX(Re[0]*Ie+Le+Te[0]),z.setOffsetY(Re[1]*Ie+Oe+Te[1]),P.setColor(ri(ii(C,"paint","text-color",c,p,y),S)),z.setFill(P);var Ue=ri(ii(C,"paint","text-halo-color",c,p,y),S);if(Ue){M.setColor(Ue),Ge*=2;var Be=.5*Ie;M.setWidth(Ge<=Be?Ge:Be),z.setStroke(M)}else z.setStroke(void 0);var Fe=ii(C,"layout","text-padding",c,p,y),ze=z.getPadding();Fe!==ze[0]&&(ze[0]=Fe,ze[1]=Fe,ze[2]=Fe,ze[3]=Fe),T.setZIndex(O)}}},C=0,I=r.length;C-1?(x.length=g+1,li&&("function"==typeof e.set?e.set("mapbox-layer",u):e.getProperties()["mapbox-layer"]=u),x):void 0}};return e.setStyle(k),e.set("mapbox-source",d),e.set("mapbox-layers",g),k},ui=n(72),di=n.n(ui);n(73);function pi(e){return(pi="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var hi,gi=/font-family: ?([^;]*);/,mi=/("|')/g;function fi(e){if(!hi){hi={};for(var t=document.styleSheets,n=0,o=t.length;n2?o[2]:""):e+n}function wi(e,t,n,o,i){return new Promise((function(r,a){if("object"!=pi(t)&&(t=JSON.parse(t)),8!=t.version)return a(new Error("glStyle version 8 required."));if(!(e instanceof Dn.a||e instanceof xn.a))return a(new Error("Can only apply to VectorLayer or VectorTileLayer"));var s,l,c;function u(){c||t.sprite&&!s?c?(e.setStyle(c),r()):a(new Error("Something went wrong trying to apply style.")):(c=ci(e,t,n,i,s,l,vi),e.getStyle()?r():a(new Error("Nothing to show for source [".concat(n,"]"))))}if(t.sprite){var d=.5==(window.devicePixelRatio>=1.5?.5:1)?"@2x":"",p=bi(t.sprite,o,d+".json");fetch(p,{credentials:"same-origin"}).then((function(e){return e.ok||""===d?e:(p=bi(t.sprite,o,".json"),fetch(p,{credentials:"same-origin"}))})).then((function(e){if(e.ok)return e.json();a(new Error("Problem fetching sprite from ".concat(p,": ").concat(e.statusText)))})).then((function(e){if(void 0===e)return a(new Error("No sprites found."));s=e,l=bi(t.sprite,o,d+".png"),u()})).catch((function(e){a(new Error("Sprites cannot be loaded: ".concat(p,": ").concat(e.message)))}))}else u()}))}new on.a;var Ei=function(e){function t(n,o){if(!(this instanceof t))throw new TypeError("ERROR CLASS_CONSTRUCTOR");if(!n.layer)throw new Error("ERROR PARAM_MISSING : layer");if("string"!=typeof n.layer)throw new Error("ERROR WRONG TYPE : layer");if(this.layerName=n.layer,this.styleName=n.style,this.sourceId=n.source,void 0===n.ssl&&(n.ssl=!0),this.protocol=!1===n.ssl?"http://":"https://",!hn.a.isConfigLoaded())throw new Error("ERROR : contract key configuration has to be loaded to load Geoportal layers.");var i=this.layerName+"$GEOPORTAIL:GPP:TMS",r=hn.a.configuration.getLayerConf(i);if(!r)throw new Error("ERROR : Layer ID not found into the catalogue !?");this.styleUrl=null,this.styleTitle="";for(var a=0;a * @author owenm * @license MIT */ -function ki(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Gi(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Di(e){if("undefined"!=typeof window&&window.navigator)return!!navigator.userAgent.match(e)}var Ni=Di(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),ji=Di(/Edge/i),Ui=Di(/firefox/i),Bi=Di(/safari/i)&&!Di(/chrome/i)&&!Di(/android/i),Fi=Di(/iP(ad|od|hone)/i),zi=Di(/chrome/i)&&Di(/android/i),Vi={capture:!1,passive:!1};function qi(e,t,n){e.addEventListener(t,n,!Ni&&Vi)}function Wi(e,t,n){e.removeEventListener(t,n,!Ni&&Vi)}function Hi(e,t){if(t){if(">"===t[0]&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch(e){return!1}return!1}}function Yi(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function Ji(e,t,n,o){if(e){n=n||document;do{if(null!=t&&(">"===t[0]?e.parentNode===n&&Hi(e,t):Hi(e,t))||o&&e===n)return e;if(e===n)break}while(e=Yi(e))}return null}var Zi,Ki=/\s+/g;function Xi(e,t,n){if(e&&t)if(e.classList)e.classList[n?"add":"remove"](t);else{var o=(" "+e.className+" ").replace(Ki," ").replace(" "+t+" "," ");e.className=(o+(n?" "+t:"")).replace(Ki," ")}}function Qi(e,t,n){var o=e&&e.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(n=e.currentStyle),void 0===t?n:n[t];t in o||-1!==t.indexOf("webkit")||(t="-webkit-"+t),o[t]=n+("string"==typeof n?"":"px")}}function $i(e,t){var n="";if("string"==typeof e)n=e;else do{var o=Qi(e,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function er(e,t,n){if(e){var o=e.getElementsByTagName(t),i=0,r=o.length;if(n)for(;i=r:i<=r))return o;if(o===tr())break;o=lr(o,!1)}return!1}function ir(e,t,n,o){for(var i=0,r=0,a=e.children;r2&&void 0!==arguments[2]?arguments[2]:{},o=n.evt,i=Li(n,vr);yr.pluginEvent.bind(pa)(e,t,Gi({dragEl:br,parentEl:wr,ghostEl:Er,rootEl:_r,nextEl:Sr,lastDownEl:Mr,cloneEl:Pr,cloneHidden:xr,dragStarted:zr,putSortable:Lr,activeSortable:pa.active,originalEvent:o,oldIndex:kr,oldDraggableIndex:Rr,newIndex:Gr,newDraggableIndex:Tr,hideGhostForTarget:la,unhideGhostForTarget:ca,cloneNowHidden:function(){xr=!0},cloneNowShown:function(){xr=!1},dispatchSortableEvent:function(e){Ir({sortable:t,name:e,originalEvent:o})}},i))};function Ir(e){Ar(Gi({putSortable:Lr,cloneEl:Pr,targetEl:br,rootEl:_r,oldIndex:kr,oldDraggableIndex:Rr,newIndex:Gr,newDraggableIndex:Tr},e))}var br,wr,Er,_r,Sr,Mr,Pr,xr,kr,Gr,Rr,Tr,Or,Lr,Dr,Nr,jr,Ur,Br,Fr,zr,Vr,qr,Wr,Hr,Yr=!1,Jr=!1,Zr=[],Kr=!1,Xr=!1,Qr=[],$r=!1,ea=[],ta="undefined"!=typeof document,na=Fi,oa=ji||Ni?"cssFloat":"float",ia=ta&&!zi&&!Fi&&"draggable"in document.createElement("div"),ra=function(){if(ta){if(Ni)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto","auto"===e.style.pointerEvents}}(),aa=function(e,t){var n=Qi(e),o=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),i=ir(e,0,t),r=ir(e,1,t),a=i&&Qi(i),s=r&&Qi(r),l=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+nr(i).width,c=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+nr(r).width;if("flex"===n.display)return"column"===n.flexDirection||"column-reverse"===n.flexDirection?"vertical":"horizontal";if("grid"===n.display)return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(i&&a.float&&"none"!==a.float){var u="left"===a.float?"left":"right";return!r||"both"!==s.clear&&s.clear!==u?"horizontal":"vertical"}return i&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||l>=o&&"none"===n[oa]||r&&"none"===n[oa]&&l+c>o)?"vertical":"horizontal"},sa=function(e){function t(e,n){return function(o,i,r,a){var s=o.options.group.name&&i.options.group.name&&o.options.group.name===i.options.group.name;if(null==e&&(n||s))return!0;if(null==e||!1===e)return!1;if(n&&"clone"===e)return e;if("function"==typeof e)return t(e(o,i,r,a),n)(o,i,r,a);var l=(n?o:i).options.group.name;return!0===e||"string"==typeof e&&e===l||e.join&&e.indexOf(l)>-1}}var n={},o=e.group;o&&"object"==Ri(o)||(o={name:o}),n.name=o.name,n.checkPull=t(o.pull,!0),n.checkPut=t(o.put),n.revertClone=o.revertClone,e.group=n},la=function(){!ra&&Er&&Qi(Er,"display","none")},ca=function(){!ra&&Er&&Qi(Er,"display","")};ta&&document.addEventListener("click",(function(e){if(Jr)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),Jr=!1,!1}),!0);var ua=function(e){if(br){e=e.touches?e.touches[0]:e;var t=(i=e.clientX,r=e.clientY,Zr.some((function(e){var t=e[hr].options.emptyInsertThreshold;if(t&&!rr(e)){var n=nr(e),o=i>=n.left-t&&i<=n.right+t,s=r>=n.top-t&&r<=n.bottom+t;return o&&s?a=e:void 0}})),a);if(t){var n={};for(var o in e)e.hasOwnProperty(o)&&(n[o]=e[o]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[hr]._onDragOver(n)}}var i,r,a},da=function(e){br&&br.parentNode[hr]._isOutsideThisEl(e.target)};function pa(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=Oi({},t),e[hr]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return aa(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData("Text",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==pa.supportPointer&&"PointerEvent"in window&&!Bi,emptyInsertThreshold:5};for(var o in yr.initializePlugins(this,e,n),n)!(o in t)&&(t[o]=n[o]);for(var i in sa(t),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!t.forceFallback&&ia,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?qi(e,"pointerdown",this._onTapStart):(qi(e,"mousedown",this._onTapStart),qi(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(qi(e,"dragover",this),qi(e,"dragenter",this)),Zr.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),Oi(this,gr())}function ha(e,t,n,o,i,r,a,s){var l,c,u=e[hr],d=u.options.onMove;return!window.CustomEvent||Ni||ji?(l=document.createEvent("Event")).initEvent("move",!0,!0):l=new CustomEvent("move",{bubbles:!0,cancelable:!0}),l.to=t,l.from=e,l.dragged=n,l.draggedRect=o,l.related=i||t,l.relatedRect=r||nr(t),l.willInsertAfter=s,l.originalEvent=a,e.dispatchEvent(l),d&&(c=d.call(u,l,a)),c}function ga(e){e.draggable=!1}function ma(){$r=!1}function fa(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,o=0;n--;)o+=t.charCodeAt(n);return o.toString(36)}function ya(e){return setTimeout(e,0)}function Aa(e){return clearTimeout(e)}pa.prototype={constructor:pa,_isOutsideThisEl:function(e){this.el.contains(e)||e===this.el||(Vr=null)},_getDirection:function(e,t){return"function"==typeof this.options.direction?this.options.direction.call(this,e,t,br):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,o=this.options,i=o.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,s=(a||e).target,l=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||s,c=o.filter;if(function(e){ea.length=0;var t=e.getElementsByTagName("input"),n=t.length;for(;n--;){var o=t[n];o.checked&&ea.push(o)}}(n),!br&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||o.disabled)&&!l.isContentEditable&&(this.nativeDraggable||!Bi||!s||"SELECT"!==s.tagName.toUpperCase())&&!((s=Ji(s,o.draggable,n,!1))&&s.animated||Mr===s)){if(kr=ar(s),Rr=ar(s,o.draggable),"function"==typeof c){if(c.call(this,e,s,this))return Ir({sortable:t,rootEl:l,name:"filter",targetEl:s,toEl:n,fromEl:n}),Cr("filter",t,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some((function(o){if(o=Ji(l,o.trim(),n,!1))return Ir({sortable:t,rootEl:o,name:"filter",targetEl:s,fromEl:n,toEl:n}),Cr("filter",t,{evt:e}),!0}))))return void(i&&e.cancelable&&e.preventDefault());o.handle&&!Ji(l,o.handle,n,!1)||this._prepareDragStart(e,a,s)}}},_prepareDragStart:function(e,t,n){var o,i=this,r=i.el,a=i.options,s=r.ownerDocument;if(n&&!br&&n.parentNode===r){var l=nr(n);if(_r=r,wr=(br=n).parentNode,Sr=br.nextSibling,Mr=n,Or=a.group,pa.dragged=br,Dr={target:br,clientX:(t||e).clientX,clientY:(t||e).clientY},Br=Dr.clientX-l.left,Fr=Dr.clientY-l.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,br.style["will-change"]="all",o=function(){Cr("delayEnded",i,{evt:e}),pa.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!Ui&&i.nativeDraggable&&(br.draggable=!0),i._triggerDragStart(e,t),Ir({sortable:i,name:"choose",originalEvent:e}),Xi(br,a.chosenClass,!0))},a.ignore.split(",").forEach((function(e){er(br,e.trim(),ga)})),qi(s,"dragover",ua),qi(s,"mousemove",ua),qi(s,"touchmove",ua),qi(s,"mouseup",i._onDrop),qi(s,"touchend",i._onDrop),qi(s,"touchcancel",i._onDrop),Ui&&this.nativeDraggable&&(this.options.touchStartThreshold=4,br.draggable=!0),Cr("delayStart",this,{evt:e}),!a.delay||a.delayOnTouchOnly&&!t||this.nativeDraggable&&(ji||Ni))o();else{if(pa.eventCanceled)return void this._onDrop();qi(s,"mouseup",i._disableDelayedDrag),qi(s,"touchend",i._disableDelayedDrag),qi(s,"touchcancel",i._disableDelayedDrag),qi(s,"mousemove",i._delayedDragTouchMoveHandler),qi(s,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&qi(s,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){br&&ga(br),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;Wi(e,"mouseup",this._disableDelayedDrag),Wi(e,"touchend",this._disableDelayedDrag),Wi(e,"touchcancel",this._disableDelayedDrag),Wi(e,"mousemove",this._delayedDragTouchMoveHandler),Wi(e,"touchmove",this._delayedDragTouchMoveHandler),Wi(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||"touch"==e.pointerType&&e,!this.nativeDraggable||t?this.options.supportPointer?qi(document,"pointermove",this._onTouchMove):qi(document,t?"touchmove":"mousemove",this._onTouchMove):(qi(br,"dragend",this),qi(_r,"dragstart",this._onDragStart));try{document.selection?ya((function(){document.selection.empty()})):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(e,t){if(Yr=!1,_r&&br){Cr("dragStarted",this,{evt:t}),this.nativeDraggable&&qi(document,"dragover",da);var n=this.options;!e&&Xi(br,n.dragClass,!1),Xi(br,n.ghostClass,!0),pa.active=this,e&&this._appendGhost(),Ir({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(Nr){this._lastX=Nr.clientX,this._lastY=Nr.clientY,la();for(var e=document.elementFromPoint(Nr.clientX,Nr.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(Nr.clientX,Nr.clientY))!==t;)t=e;if(br.parentNode[hr]._isOutsideThisEl(e),t)do{if(t[hr]){if(t[hr]._onDragOver({clientX:Nr.clientX,clientY:Nr.clientY,target:e,rootEl:t})&&!this.options.dragoverBubble)break}e=t}while(t=t.parentNode);ca()}},_onTouchMove:function(e){if(Dr){var t=this.options,n=t.fallbackTolerance,o=t.fallbackOffset,i=e.touches?e.touches[0]:e,r=Er&&$i(Er,!0),a=Er&&r&&r.a,s=Er&&r&&r.d,l=na&&Hr&&sr(Hr),c=(i.clientX-Dr.clientX+o.x)/(a||1)+(l?l[0]-Qr[0]:0)/(a||1),u=(i.clientY-Dr.clientY+o.y)/(s||1)+(l?l[1]-Qr[1]:0)/(s||1);if(!pa.active&&!Yr){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||e.clientX<=o.right&&e.clientY>o.bottom&&e.clientX>=o.left:e.clientX>o.right&&e.clientY>o.top||e.clientX<=o.right&&e.clientY>o.bottom+10}(e,i,this)&&!m.animated){if(m===br)return G(!1);if(m&&r===e.target&&(a=m),a&&(n=nr(a)),!1!==ha(_r,r,br,t,a,n,e,!!a))return k(),r.appendChild(br),wr=r,R(),G(!0)}else if(m&&function(e,t,n){var o=nr(ir(n.el,0,n.options,!0));return t?e.clientXu+c*r/2:ld-Wr)return-qr}else if(l>u+c*(1-i)/2&&ld-c*r/2))return l>u+c/2?1:-1;return 0}(e,a,n,i,I?1:s.swapThreshold,null==s.invertedSwapThreshold?s.swapThreshold:s.invertedSwapThreshold,Xr,Vr===a))){var _=ar(br);do{_-=y,v=wr.children[_]}while(v&&("none"===Qi(v,"display")||v===Er))}if(0===y||v===a)return G(!1);Vr=a,qr=y;var S=a.nextElementSibling,M=!1,P=ha(_r,r,br,t,a,n,e,M=1===y);if(!1!==P)return 1!==P&&-1!==P||(M=1===P),$r=!0,setTimeout(ma,30),k(),M&&!S?r.appendChild(br):a.parentNode.insertBefore(br,M?S:a),w&&dr(w,0,E-w.scrollTop),wr=br.parentNode,void 0===A||Xr||(Wr=Math.abs(A-nr(a)[b])),R(),G(!0)}if(r.contains(br))return G(!1)}return!1}function x(s,l){Cr(s,h,Gi({evt:e,isOwner:u,axis:i?"vertical":"horizontal",revert:o,dragRect:t,targetRect:n,canSort:d,fromSortable:p,target:a,completed:G,onMove:function(n,o){return ha(_r,r,br,t,n,nr(n),e,o)},changed:R},l))}function k(){x("dragOverAnimationCapture"),h.captureAnimationState(),h!==p&&p.captureAnimationState()}function G(t){return x("dragOverCompleted",{insertion:t}),t&&(u?c._hideClone():c._showClone(h),h!==p&&(Xi(br,Lr?Lr.options.ghostClass:c.options.ghostClass,!1),Xi(br,s.ghostClass,!0)),Lr!==h&&h!==pa.active?Lr=h:h===pa.active&&Lr&&(Lr=null),p===h&&(h._ignoreWhileAnimating=a),h.animateAll((function(){x("dragOverAnimationComplete"),h._ignoreWhileAnimating=null})),h!==p&&(p.animateAll(),p._ignoreWhileAnimating=null)),(a===br&&!br.animated||a===r&&!a.animated)&&(Vr=null),s.dragoverBubble||e.rootEl||a===document||(br.parentNode[hr]._isOutsideThisEl(e.target),!t&&ua(e)),!s.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),g=!0}function R(){Gr=ar(br),Tr=ar(br,s.draggable),Ir({sortable:h,name:"change",toEl:r,newIndex:Gr,newDraggableIndex:Tr,originalEvent:e})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){Wi(document,"mousemove",this._onTouchMove),Wi(document,"touchmove",this._onTouchMove),Wi(document,"pointermove",this._onTouchMove),Wi(document,"dragover",ua),Wi(document,"mousemove",ua),Wi(document,"touchmove",ua)},_offUpEvents:function(){var e=this.el.ownerDocument;Wi(e,"mouseup",this._onDrop),Wi(e,"touchend",this._onDrop),Wi(e,"pointerup",this._onDrop),Wi(e,"touchcancel",this._onDrop),Wi(document,"selectstart",this)},_onDrop:function(e){var t=this.el,n=this.options;Gr=ar(br),Tr=ar(br,n.draggable),Cr("drop",this,{evt:e}),wr=br&&br.parentNode,Gr=ar(br),Tr=ar(br,n.draggable),pa.eventCanceled||(Yr=!1,Xr=!1,Kr=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Aa(this.cloneId),Aa(this._dragStartId),this.nativeDraggable&&(Wi(document,"drop",this),Wi(t,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),Bi&&Qi(document.body,"user-select",""),Qi(br,"transform",""),e&&(zr&&(e.cancelable&&e.preventDefault(),!n.dropBubble&&e.stopPropagation()),Er&&Er.parentNode&&Er.parentNode.removeChild(Er),(_r===wr||Lr&&"clone"!==Lr.lastPutMode)&&Pr&&Pr.parentNode&&Pr.parentNode.removeChild(Pr),br&&(this.nativeDraggable&&Wi(br,"dragend",this),ga(br),br.style["will-change"]="",zr&&!Yr&&Xi(br,Lr?Lr.options.ghostClass:this.options.ghostClass,!1),Xi(br,this.options.chosenClass,!1),Ir({sortable:this,name:"unchoose",toEl:wr,newIndex:null,newDraggableIndex:null,originalEvent:e}),_r!==wr?(Gr>=0&&(Ir({rootEl:wr,name:"add",toEl:wr,fromEl:_r,originalEvent:e}),Ir({sortable:this,name:"remove",toEl:wr,originalEvent:e}),Ir({rootEl:wr,name:"sort",toEl:wr,fromEl:_r,originalEvent:e}),Ir({sortable:this,name:"sort",toEl:wr,originalEvent:e})),Lr&&Lr.save()):Gr!==kr&&Gr>=0&&(Ir({sortable:this,name:"update",toEl:wr,originalEvent:e}),Ir({sortable:this,name:"sort",toEl:wr,originalEvent:e})),pa.active&&(null!=Gr&&-1!==Gr||(Gr=kr,Tr=Rr),Ir({sortable:this,name:"end",toEl:wr,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){Cr("nulling",this),_r=br=wr=Er=Sr=Pr=Mr=xr=Dr=Nr=zr=Gr=Tr=kr=Rr=Vr=qr=Lr=Or=pa.dragged=pa.ghost=pa.clone=pa.active=null,ea.forEach((function(e){e.checked=!0})),ea.length=jr=Ur=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":br&&(this._onDragOver(e),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect="move");e.cancelable&&e.preventDefault()}(e));break;case"selectstart":e.preventDefault()}},toArray:function(){for(var e,t=[],n=this.el.children,o=0,i=n.length,r=this.options;o=0;o--)this._layersOrder[o].layer.setZIndex(0)}e.prototype.setMap.call(this,t)},t.prototype.addLayer=function(e,t){var n=this,o=this.getMap();if(t=t||{},e){var i=e.gpLayerId;if(void 0!==i){var r=!1;if(o.getLayers().forEach((function(e){e.gpLayerId===i&&(r=!0)})),r)if(this._layers[i]){for(var a in t)t.hasOwnProperty(a)&&(this._layers[i][a]=t[a]);if(t.title){var s=document.getElementById(this._addUID("GPname_ID_"+i));s&&(s.innerHTML=t.title,s.title=t.description||t.title)}var l=document.getElementById(this._addUID("GPinfo_ID_"+i));if(!document.getElementById(this._addUID("GPinfo_ID_"+i))&&t.description){var c=document.getElementById(this._addUID("GPadvancedTools_ID_"+i));c&&c.appendChild(this._createAdvancedToolInformationElement({id:i}))}l&&"GPlayerInfoOpened"===l.className&&(document.getElementById(this._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed",l.className="GPlayerInfo")}else{var u=this.getLayerInfo(e)||{},d=e.getOpacity(),p=e.getVisible(),h=this.isInRange(e,o),g={layer:e,id:i,opacity:null!=d?d:1,visibility:null==p||p,inRange:null==h||h,title:null!=t.title?t.title:u._title||i,description:t.description||u._description||null,legends:t.legends||u._legends||[],metadata:t.metadata||u._metadata||[],quicklookUrl:t.quicklookUrl||u._quicklookUrl||null};this._layers[i]=g;var m=this._createLayerDiv(g);this._layers[i].div=m,e.getZIndex&&0!==e.getZIndex()&&void 0!==e.getZIndex()||e._forceNullzIndex?this._updateLayersOrder():(this._layersOrder.unshift(g),this._lastZIndex++,e.setZIndex(this._lastZIndex),this._layerListContainer.insertBefore(m,this._layerListContainer.firstChild)),this._listeners.updateLayerOpacity=e.on("change:opacity",(function(e){return n._updateLayerOpacity(e)})),this._listeners.updateLayerVisibility=e.on("change:visible",(function(e){return n._updateLayerVisibility(e)})),null==this._layers[i].onZIndexChangeEvent&&(this._layers[i].onZIndexChangeEvent=e.on("change:zIndex",(function(){return n._updateLayersOrder()})))}else Da.log("[ERROR] LayerSwitcher:addLayer - configuration cannot be set for ",e," layer (layer is not in map.getLayers() )")}else Da.trace("[WARN] LayerSwitcher:addLayer - configuration cannot be set for this layer (layer id not found)",e)}else Da.log("[ERROR] LayerSwitcher:addLayer - missing layer parameter")},t.prototype.removeLayer=function(e){if(e){Object(On.unByKey)(this._listeners.updateLayerOpacity),Object(On.unByKey)(this._listeners.updateLayerVisibility),Da.trace(e);var t=e.gpLayerId,n=document.getElementById(this._addUID("GPlayersList")),o=document.getElementById(this._addUID("GPinfo_ID_"+t));o&&"GPlayerInfoOpened"===o.className&&(document.getElementById(this._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed",o.className="GPlayerInfo");var i=document.getElementById(this._addUID("GPlayerSwitcher_ID_"+t));i&&n.removeChild(i);var r=Math.abs(e.getZIndex()-this._lastZIndex);this._layersOrder.splice(r,1),this._lastZIndex--;for(var a=this._layersOrder,s=0;s1&&(t=1),t<0&&(t=0);var n=e.target.gpLayerId,o=document.getElementById(this._addUID("GPopacityValueDiv_ID_"+n));o&&(o.value=Math.round(100*t));var i=document.getElementById(this._addUID("GPopacityValue_ID_"+n));i&&(i.innerHTML=Math.round(100*t)+"%")},t.prototype._onVisibilityLayerClick=function(e){var t=e.target.id,n=xi.index(t);this._layers[n].layer.setVisible(e.target.checked)},t.prototype._updateLayerVisibility=function(e){var t=e.target.getVisible(),n=e.target.gpLayerId,o=document.getElementById(this._addUID("GPvisibility_ID_"+n));o&&(o.checked=t)},t.prototype._updateLayersOrder=function(){var e=this,t=this.getMap();if(t){var n,o;for(var i in this._layersIndex={},t.getLayers().forEach((function(t){o=t.gpLayerId,Object(On.unByKey)(e._layers[o].onZIndexChangeEvent),e._layers[o].onZIndexChangeEvent=null,n=null,void 0!==t.getZIndex&&(n=t.getZIndex(),e._layersIndex[n]&&Array.isArray(e._layersIndex[n])||(e._layersIndex[n]=[]),e._layersIndex[n].push(e._layers[o]))})),this._lastZIndex=0,this._layersOrder=[],this._layersIndex)if(this._layersIndex.hasOwnProperty(i))for(var r=this._layersIndex[i],a=0;ae.getMaxResolution()||n-1},t.prototype._activateEvent=function(e,t){var n=this,o=function(e){ht.onDisplayFeatureInfo(e,n)};"contextmenu"===e?t.getViewport().addEventListener(e,o):t.on(e,o),this._eventsHandler[e]=o,this._events[e]=!0},t.prototype._deactivateEvent=function(e,t){"contextmenu"===e?t.getViewport().removeEventListener(e,this._eventsHandler[e]):t.un(e,this._eventsHandler[e]),delete this._eventsHandler[e],this._events[e]=!1},t.prototype._updateEvents=function(e){e||(e=this.getMap());for(var t=[],n=0;n=0?this._activateEvent(i,e):this._events[i]&&t.indexOf(i)<0&&this._deactivateEvent(i,e)},t.prototype._clearEvents=function(){var e=this.getMap();for(var t in this._events)this._events[t]&&this._deactivateEvent(t,e)},t.prototype._hasLayer=function(e){for(var t=0;t